C64 SPS

Aus
Wechseln zu: Navigation, Suche
C64-SPS
C64-SPS
DIO-16 Boards
C64-SPS


Das C64 SPS Modul

Das C65 SPS Modul ist eine Platine für den Commodore C64, mit der man den C64 in eine SPS verwandelt. Eine SPS (Speicher programmierbare Steuerung) dient dazu, eine Anlage zu steuern, zum Beispiel eine Modell Eisenbahn.

Das Modul stellt einem Commodore C64 indirekt digitale Aus- und Eingänge zur Verfügung. Der C64 kann per Software die digitalen Ausgänge steuern sowie die digitalen Eingänge abfragen. Damit ist der C64 in der Lage eine Anlage zu steuern. Die Programmierung des C64 kann in BASIC erfolgen. Das v2 BASIC des C64 wird um neue Befehle erweitert, um die Programmierung zu vereinfachen. Die neuen BASIC Befehle ermöglichen auf einfache Weise die Kontrolle über eine elektrische Anlage.

An das C64 Modul werden dezentrale IO Boards angeschlossen. Diese dezentralen IO Boards sind das Verbindungsglied zwischen dem SPS Modul und der zu steuernden Anlage. Die IO Boards sind seriell angebunden und werden direkt von dem Arduino auf dem SPS Modul gesteuert.


Was kann man mit dem Board tun:

  • automatischer Start eines BASIC Programm nach dem Einschalten (BASIC im EPROM)
  • zusätzliche Befehle im v2 BASIC um digitale Ausgänge zu setzen und digitale Eingänge abzufragen
  • I2C Interface um dezentrale IO Boards zu steuern (MCP 23017)
  • SPI-Out Interface um DO Boards zu steuern (74HC595)
  • SPI-In Interface um DI Boards zu steuern (74HC165)


Auf dem SPS Modul befindet sich:

  • ein EEPROM Speicher mit 64KB (W27C512)
  • ein CPLD ATF-1504
  • ein Arduino Nano


Schnittstellen

Das SPS Modul hat drei Anschlüsse für dezentrale IO Boards:

  • SPI Anschluss für mehrere DO Boards (digitale Ausgänge)
  • SPI Anschluss für mehrere DI Boards (digitale Eingänge)
  • I2C Anschluss für mehrere IO Boards (wahlfrei digitaler Ein- oder Ausgänge)


Alle Schnittstellen Anschlüsse gehen direkt zum Arduino Nano, der mit allen IO Boards kommuniziert.


Funktion des Arduino

Der Arduino Nano hat folgende Aufgaben:

  • er speichert den Zustand aller IO Endpunkte
  • er kommuniziert laufend mit allen dezentralen IO Boards
  • er kommuniziert mit dem C64 (über Register in dem CPLD)


Funktion des CPLD

Der CPLD hat folgende Aufgaben:

  • er stellt dem C64 Speicher zur Verfügung (8K Modul)
  • er erledigt das Banking des EPROM (Magic-Cart Modul)
  • er kommuniziert mit dem Arduino über Register


Das EPROM

Das EPROM (oder das EEPROM) dient als Speicher Erweiterung für den C64. Zum einen enthält es die SPS Firmware. Zum anderen kann das EPROM als Massenspeicher benutzt werden, wenn man ein Programm direkt aus dem EPROM starten möchte. Das ermöglicht einen Betrieb ohne Floppy Disk.


Entwicklung der C64-SPS Hardware

Prototyp 1:


Prototyp 2 und IO Boards:


C64 SPS - Schematic, Layout:



Dezentrale IO Boards

Das SPS Modul hat drei Anschlüsse für drei Arten von IO Boards:

  • DO Boards: diese Boards werden über SPI angebunden und stellen digitale Ausgänge zur Verfügung
  • DI Boards: diese Boards werden über SPI angebunden und stellen digitale Eingänge zur Verfügung
  • I2C Boards: diese Boards werden über I2C angebunden und stellen sowohl Ein- als auch Ausgänge zur Verfügung


Die Anzahl der IO ist an sich nicht beschränkt bei dem SPS Modul. Die IO Boards derselben Art können hintereinander geschaltet werden, das erste IO Board ist direkt am SPS Modul angeschlossen, die weiteren werden am vorherigen IO Board angeschlossen.


Vorteile der dezentralen IO Boards:

  • einfache Erweiterbarkeit (skalierbar)
  • günstiger und einfacher Nachbau (normale TTL, notfalls auf Lochraster)
  • einfach zu ersetzen bei Defekt


Die Kommunikation zu den IO Boards wird von dem Arduino Nano auf dem SPS Modul durchgeführt. Der Arduino kommuniziert laufend mit den IO Boards, setzt Ausgänge und fragt Eingänge ab. Der gesamte Status aller IO ist stets im Speicher des Arduino abgebildet. Der C64 kommuniziert über einen CPLD Baustein mit dem Arduino. Für den C64 gibt es einfach nur N digitale Endpunkte. Die Art und Weise, wie die IO Boards angeschlossen sind, ist für den C64 nicht von Belang.


DO Boards (digitale Ausgänge)

Dieses Board stellt 8 bzw. 16 digitale Ausgänge zur Verfügung. Die Ausgänge haben einen ULN2803 (Darlington Transistoren mit Schutzdioden) nachgeschaltet, was den Anschluss von Relais oder anderer Verbraucher erleichtert. Das Board arbeitet mit einem Shift Register (74HC595), seriell In - parallel Out (SIPO). Der Baustein ist preisgünstig und einfach erhältlich. Wenn ein Ausgang eine Last treiben soll, dann müssen ggf. Bauteile nachgeschaltet werden (Transistor, FET, Relais, ...).

Die Kommunikation zwischen Board und Arduino erfolgt über SPI mit 400KHz. Das beschränkt die Entfernung zwischen Board und Arduino auf unter einem Meter.


DO-8 LED: Schematic, Layout:


Prototyp DO-16 LED: Layout:


DI Boards (digitale Eingänge)

Dieses Board stellt 8 bzw. 16 digitale Eingänge zur Verfügung (TTL Pegel - 5 Volt oder CMOS - 2 bis 6 Volt). Das Board arbeitet mit einem Shift Register (74HC165), parallel In - seriell Out (PISO). Der Baustein ist preisgünstig und einfach erhältlich. Wenn eine Signalquelle angeschlossen wird, die höhere Spannungen liefert, dann müssen ggf. Bauteile nachgeschaltet werden (Optokoppler, Transistor, ...).

Die Kommunikation zwischen Board und Arduino erfolgt über SPI mit 400KHz. Das beschränkt die Entfernung zwischen Board und Arduino auf unter einem Meter.


DI-8 und DI-8 LED: Schematic, Layout:

Das Board mit 8 mal digitaler Eingang gibt es mit oder ohne LED Anzeige. Die LED sind für die Funktion bedeutungslos, aber man tut sich leichter bei der Inbetriebnahme und auch bei etwaiger Fehlersuche.


Prototyp DI-16 und DI-16 mit Optokoppler: Layout:

Das Board mit 16 digitalen Eingänge ist einfach zweimal das DI-8-LED auf einer Platine. Das DI-16-Opto (DI-16 Board mit Optokoppler) ermöglicht die potentialfreie Erfassung einer Spannung von 5V bis 24V. Gegebenenfalls muss der SMD Vorwiderstand an den verwendeten Optokoppler angepasst werden.



DIO Board (digitaler Ein- oder Ausgang)

Die dritte Art von IO Board ist flexibler aber auch deutlich teurer. Dieses Board arbeitet mit einem I2C IO-Extender (MCP23017). Der Baustein hat 16 IO Pins, wobei jeder Pin wahlweise als Ausgang oder Eingang verwendet werden kann.

Die Kommunikation zwischen Board und Arduino erfolgt über I2C mit 400KHz. Der I2C Bus erlaubt größere Distanzen und arbeitet sehr störungssicher.


Abgesehen von dem höheren Preis hat der MCP23017 einige Vorteile:

  • der Baustein hat 16 IO statt nur 8
  • jedes IO kann wahlweise als Ein- oder Ausgang definiert werden
  • jeder IO kann separat angesteuert werden (DI und DO Boards müssen alle IO ansprechen)
  • der Baustein kann Interrupts auslösen bei definierten Eingangs Bedingungen


Diese Board gibt es sehr günstig bei Reichelt (5€), da lohnt sich eine eigene Entwicklung nicht:


Anpassung an die Anlage

Die IO Boards sind eine Sache, aber die meisten Anlagen lassen sich nicht mit 5V steuern, und die Signale für die digitalen Eingänge sind oft auch nicht kompatibel mit 5V Technik. Es Bedarf meisten einer Anpassung der Signale von und zu der Anlage.


Signale für einen digitalen Eingang können oft auf einfache Art angepasst werden. Oft reicht ein Spannungsteiler oder eine Transistor Schaltung. Wenn die Spannungen ein gefährliches Potential haben, oder wenn man die Eingänge potentialfrei halten möchte, dann bieten sich Optokoppler an als Trennung zwischen Anlage und IO Board.


Signale für einen digitalen Ausgang werden häufig mit einem Relais angepasst. Deshalb kann das DO Board dank dem ULN2803 Relais direkt ansteuern. Das MCP23017 Board benötigt für die Ansteuerung von Relais noch eine entsprechende Schaltung oder alternativ eine Relais Karte, die eine Ansteuerung mit TTL Pegel erlauben.

Anstatt einem Relais kann man oft auch einen Transistor, einen FET oder einen Triac verwenden. Der Vorteil ist, dass man so auf mechanische Teile (Kontakte) verzichten kann. Und die Ansteuerung braucht auch weniger Leistung als eine Relais Spule.

Wenn man 220V steuern möchte, dann bieten sich auch SSR an. Ein SSR (solid State Relais) ist ein kontaktloses Halbleiter 'Relais'. Es gibt auch sehr preisgünstige Boards mit 2, 4, 8 oder 16 SSR samt notwendiger Ansteuerung.


Wenn man solche Boards selbst bauen möchte, dann bietet es sich an, es gleich mit dem dezentralen Board zu vereinen. Man schafft damit quasi dezentrale IO Boards die schon an eine bestimmte Anlage abgestimmt sind.


Beispiel für fertige Boards (Optokoppler Board, Relais Board, SSR Board):

(Ganz unten findet man Links auf Quellen wo man diese Boards preisgünstig beziehen kann)


Speichererweiterung

Auf dem SPS Modul sitzt ein 64K EPROM für die C64-SPS Firmware. Der CPLD hat ein Magic-Desk kompatibles Banking implementiert, das ermöglicht den Zugriff auf die 64K des EPROM. Es werden jeweils immer nur 8KB des EPROM eingeblendet an der Adresse $8000. Das EPROM kann auch deaktiviert werden, so wie bei jedem Magic-Desk Modul ist dafür das Bit 7 des Banking Register zuständig.

Die Bank 0 des EPROM enthält die C64-SPS Firmware. Bank 1 bis 7 sind frei, da kann man zb. ein eigenes BASIC Programm speichern, damit man für seine Steuerung kein Floppy Disk Laufwerk benötigt.


SPS Firmware

Das C64-SPS Modul startet automatisch die SPS Firmware, sobald der C64 eingeschaltet wird. Die SPS Firmware liegt in der Bank 0 des EPROM. Das Image im EPROM bestimmt das weitere Startverhalten des Modul:

  • automatisches laden und starten eines Programm von der Floppy Disk
  • automatisches laden und starten eines Programm im EPROM
  • anzeigen des UC Menü



BASIC Erweiterung

Die SPS Firmware erweitert das v2 BASIC des C64 um folgende Befehle:

  • CONFIG <string>
  • SETIO <integer>
  • RESIO <integer>
  • GETIO(<integer>)
  • KILL


Die folgenden Befehle funktionieren nur im Direktmodus:

  • DEL
  • FIND
  • HELP
  • HIMEM
  • MEM
  • UNNEW


Die meisten Befehle funktionieren sowohl im Direktmodus als auch in einem BASIC Programm. Folgende Befehle funktionieren nur im Direktmodus: HELP, DEL, FIND, UNNEW, MEM, HIMEM

Der CONFIG Befehl konfiguriert den Arduino auf dem SPS Modul. Der Befehl muss nur einmal gesendet werden, denn der Arduino speichert die Konfiguration dauerhaft in seinem EEPROM. Der CONFIG Befehl sagt dem Arduino, welche dezentralen IO Boards angeschlossen sind und welche IO Portnummern zugewiesen werden. Der Befehl benötigt ein String Argument (String oder String Variable). Der String darf die Zeichen I (Input Board), O (Output Board) und M (MCP23017 Board) enthalten. Jeder Buchstabe steht für 16 Portnummern und definiert so die Nummernvergabe im C64.

Der Befehl SETIO setzt einen digitalen Ausgang auf logisch 1 (5V). Der Befehl benötigt als Argument eine Portnummer (Zahl 0 bis 32767 oder Variable).

Der Befehl RESIO setzt einen digitalen Ausgang auf logisch 0 (0V). Der Befehl benötigt als Argument eine Portnummer (Zahl 0 bis 32767 oder Variable).

Die Funktion GETIO fragt den Zustand eines digitalen Eingang ab. Es kommen die Werte 0 oder 1 zurück, je nach dem welcher logische Spannungspegel anliegt an diesem Eingang. Der Befehl benötigt als Argument eine Portnummer (Zahl 0 bis 32767 oder Variable).

Der Befehl KILL schaltet die Befehlserweiterung und auch das EPROM des SPS Modul ab. Es werden die 8KB Speicher freigegeben, dabei werden alle BASIC Variable gelöscht (CLR).

Der Befehl HELP listet die neuen BASIC Befehle.

Der Befehl DEL löscht BASIC Zeilen. Die Syntax ist exakt gleich wie beim LIST Befehl. Man kann damit eine Einzelzeile löschen, bis zu einer bestimmten Zeile und ab einer bestimmten Zeile.

Der Befehl FIND listet alle BASIC Zeilen, die einen gesuchten Text haben oder gesuchte Befehle. Das Argument für den FIND Befehl kann in Anführungszeichen stehen (Suche nach einem Textteil) oder eben nicht (Suche nach einem Token).

Der Befehl UNNEW hebt ein vorhergehendes NEW auf. Ein gelöschtes BASIC Programm wird sichtbar gemacht. Der UNNEW Befehl erneuert auch die Verkettung der BASIC Zeilen und er setzt die Programm Größe auf den richtigen Wert. Achtung bei BASIC Programme die einen Assembler Code angehängt haben! Durch die Korrektur der Programmgröße ist der nachfolgende Code nicht mehr geschützt und wird durch BASIC Variable zerstört.

Der Befehl MEM zeigt den freien Speicher an, den BASIC zur Verfügung hat.

Der Befehl HIMEM zeigt die Obergrenze des freien Speicher an, den BASIC zugreifen kann. Kommt nach dem HIMEM Befehl ein '=' Zeichen gefolgt von einem Zahlenwert, dann wird die Speicherobergrenze gesetzt. Wenn man die Speicherobergrenze setzt, dann ist der Speicher oberhalb geschützt vom BASIC und kann für Code, Grafik oder Sprites verwendet werden. Wird die Speicherobergrenze verändert, dann gehen alle String Variable verloren.


Beispiel für ein BASIC Programm:

10 CONFIG "IOO"
20 SETIO 16
30 A = GETIO(5)
40 PRINT "DIGITAL INPUT 5:";A


Die SPS Firmware erweitert die Formelauswertung des v2 BASIC:

  • Hexadezimale Zahlenwerte, beginnend mit dem '$' Zeichen
  • Binäre Zahlenwerte, beginnend mit dem '%' Zeichen
  • die Funktion POSIO(n) ergibt den digitalen Zustand eines IO der Anlage


Hexadezimale Zahlen können nun im Direktmodus und auch in einem BASIC Programm verwendet werden. Das BASIC interpretiert hexadezimale Zahlen ganz genauso wie dezimale. Die Hex Werte müssen mit einem '$' Zeichen beginnen und können 2 oder 4 stellig sein.

Binäre Zahlen können nun im Direktmodus und auch in einem BASIC Programm verwendet werden. Das BASIC interpretiert Binärzahlen ganz genauso wie dezimale. Die Bin Werte müssen mit einem '%' Zeichen beginnen und können 1, 2, 4, 8 oder 16 stellig sein.


Die neue Formelauswertung lässt zum Beispiel folgende Konstrukte zu:

PRINT 2 * $34 + %11000100
10 A = $4003
20 B = $A0
30 PRINT A+B


BASIC Token

Während der Eingabe eines BASIC Programm verwandelt der Interpreter die BASIC Befehle (Worte) in TOKEN. Beim Commodore v2 BASIC sind die Token immer genau ein Byte. Das Standard BASIC v2 verwendet die Token von $80 (END) bis $CB (GO). Hier findet man eine Tabelle aller Token im BASIC v2.

Die zusätzlichen Befehle, die das C64 SPS Modul zur Verfügung stellt, beginnen ab dem ersten freien Token $CC. Die neuen Befehle die nur im Direktmodus funktionieren werden nicht in Token umgewandelt, sondern direkt interpretiert.

BASIC Programme die diese neuen Befehle verwenden, funktionieren natürlich nur dann, wenn das SPS Modul (also die Befehlserweiterung) aktiv ist. Diese Programme können auch ohne Modul geladen (LOAD) und wieder gespeichert (SAVE) werden. Schaut man jedoch in das Programm rein (mit dem Befehl LIST), dann werden die neuen Token nicht richtig dargestellt, ja sogar teilweise mit einem Fehler angezeigt. Das ist auch richtig so, der normale v2 LIST Befehl kennt ja die neuen Befehle nicht. Wenn man diese Programme ohne Befehlserweiterung editiert, dann können die editierten BASIC Zeilen dadurch zerstört werden.


Wenn man ein BASIC Programm erstellt und dabei die neuen Befehle verwendet, ohne dass die Befehlserweiterung läuft, dann passiert folgendes:

  • es schaut zunächst aus, wie wenn es funktionieren würde
  • mit LIST werden die neuen Befehle korrekt angezeigt
  • man kann es normal speichern, laden und editieren
  • natürlich läuft das Programm nicht


Das Programm läuft nicht. Es läuft aber auch nicht mit eingeschalteter Befehlserweiterung. Der Grund dafür ist, die neuen Befehle stehen als Text im BASIC Quellcode, es fehlt die Umwandlung in Token. Man behebt das Problem ganz einfach mit eingeschalteter Befehlserweiterung. Man muss jede Zeile mit neuen Befehlen mit LIST anzeigen und einfach neu speichern (mit ENTER). Dazu ist der FIND Befehl hilfreich ...


Inhalt des EPROM erstellen

Der Inhalt des EPROM ist die Befehlserweiterung und optional die Benutzer BASIC Programme (Image Datei). Mit Hilfe eines Windows Tool kann man diese Image Datei selbst erstellen.


C64 Register

Die EPROM Speichererweiterung ist Magic-Desk kompatibel. Das EPROM auf dem SPS-Modul hat 64K, wobei immer nur 8K im Modulbereich ab $8000 sichtbar sind. Die Steuerung des Banking erfolgt über ein Register an der Adresse $DE00. Die Bits 0 bis 2 sind die EPROM Bank (0 bis 7), das Bit 7 steuert die /EXROM Leitung des C64 und blendet das EPROM bei Bedarf aus.


Der Arduino Nano

Dieser Abschnitt erklärt die technischen Details in dem SPS Modul. Wenn man nur die BASIC Befehlserweiterung nutzt, muss man sich NICHT um den Arduino kümmern.


Der Arduino hat folgende Aufgaben:

  • Verwaltung des internen Abbild aller IO Ports
  • Kommunikation mit den dezentralen IO Boards
  • Ausführung von Befehle und IO Abfragen


Im Speicher des Arduino ist ein internes Abbild des Zustand aller IO Ports. Die IO Ports sind durchnummeriert von 0 bis maximal 2047.

Jeweils 16 IO Ports gehören zur selben Gruppe (DI oder DO). Die IO Konfiguration bestimmt die Zuordnung des IO Portnummern zu den dezentralen IO Boards.

Die digitalen Eingänge (DI Boards) werden vom Arduino regelmäßig abgefragt und das interne Abbild ggf. aktualisiert. Die digitalen Ausgänge werden neu gesetzt, wenn es zu einer Status Änderung kommt (durch einen Befehl). Befehle und IO Abfragen vom C64 beziehen sich immer auf das interne IO Abbild im Arduino. Dadurch wird der C64 niemals ausgebremst, die Kommunikation ist blitzschnell.


Befehle an den Arduino:

  • setze Port auf 1 (SETIO)
  • setze Port auf 0 (RESIO)
  • sende den Zustand eines Ports (GETIO)
  • setze die Konfiguration für ein Port (CONFIG)


Standalone Betrieb

Das SPS Modul kann auch alleine betrieben werden ('Standalone'), ganz ohne C64. Dazu wird die Brücke JP1 auf 'intern' gestellt und das USB Kabel angeschlossen. Die Bedienung des Arduino erfolgt über die serielle Schnittstelle (siehe 'Serielles Terminal'). Man kann dazu einfach den Arduino 'Serial-Monitor' verwenden, dieser wird auf 115.200 Baud konfiguriert. Alternativ kann man auch ein beliebiges Terminal Programm benutzen.

Der Serial Monitor zeigt nach dem Reset des Arduino die Start Meldung sowie die aktuelle IO Konfiguration.



C64 Modul Betrieb

Das SPS Modul wird in dem Modul Schacht eines C64 eingesetzt und betrieben. Die Stromversorgung des Arduino kann durch den C64 erfolgen, dazu wird die Brücke JP1 auf 'intern' gestellt.

Wenn die Stromversorgung des Arduino aus einer externen Quelle erfolgt, dann muss die Brücke JP1 auf 'extern' gestellt.

Es ist auch ein Mischbetrieb möglich, wo das SPS Modul im C64 betrieben wird und das USB Kabel am Arduino angeschlossen wird. Dazu muss die Brücke JP1 auf 'extern' gestellt werden, weil das USB Kabel die Stromversorgung des Arduino und der dezentralen IO Boards darstellt.


Aus der Sicht des C64 ist das SPS Modul eine einfache Geschichte. Es gibt eine bestimmte Menge an digitaler IO Ports die man setzen, löschen und abfragen kann. Der C64 kann auch die IO Konfiguration des SPS Modul setzen. Die IO Konfiguration muss aber nur einmal gesetzt werden. Der Arduino speichert die IO Konfiguration in seinem EPROM Speicher ab, diese steht daher nach einem Reset sofort zur Verfügung.

Im RAM des Arduino ist ein Abbild des Zustand aller IO Ports, sodass eine Anfrage des C64 sofort beantwortet werden kann.



Serielles Terminal

Über die serielle Kommunikation (USB Kabel) protokolliert der Arduino alle relevanten Ereignisse. Dazu muss das USB Kabel angeschlossen sein und ein Terminal Programm am PC gestartet werden. Als Terminal Programm kann der Arduino Serial-Monitor verwendet werden. Alternativ kann man auch ein beliebiges Terminal Programm benutzen. Die Baudrate muss auf 115.200 Baud eingestellt werden.

Der Serial Monitor zeigt nach dem Reset des Arduino die Start Meldung sowie die aktuelle IO Konfiguration. Danach werden laufend alle Ereignisse protokolliert. Dazu gehören Status Änderungen bei digitalen Eingängen. Es werden auch alle Befehle an den Arduino protokolliert, sowohl die Befehle die vom C64 gesendet wurden als auch die Befehle die man am seriellen Monitor eingegeben hat.


Am Serial Monitor können jederzeit Befehle an den Arduino gesendet werden. Die Eingabe der Befehle und Argumente kann wahlweise in Großbuchstaben oder Kleinbuchstaben erfolgen.

WICHTIG: Der Betrieb des Serial Monitor über das USB Kabel funktioniert sowohl im Standalone Betrieb als auch beim Einsatz als Modul im C64. Aber wenn das Modul im C64 betrieben wird, dann darf das USB Kabel nur angeschlossen werden, wenn die Brücke JP1 auf 'extern' steht!! 


Befehl '?' - Hilfe
Dieser Befehl gibt einen Hilfe Schirm aus, der alle Terminal Kommandos auflistet
Befehl 'C' - Config
Mit diesem Befehl kann man die IO Konfiguration verändern.
Das Argument wird als hexadezimaler Wert angegeben.
ZB.: "C IIOO" - 32 digitale Eingänge und 32 digitale Ausgänge
Befehl 'G' - Get-IO
Der Befehl dient zur Abfrage eines IO, es können auch digitale Ausgänge abgefragt werden.
Das Argument ist eine Zeichenfolge, jeder Buchstabe steht für 16 IO (I..digitaler EIngang, O..digitaler Ausgang).
ZB.: "G 1A" - Abfrage des IO mit der Nummer 26 (16 + 10)
Befehl 'R' - Res-IO
Der Befehl setzt einen digitalen Ausgang auf 0.
Das Argument wird als hexadezimaler Wert angegeben.
ZB.: "R 22" - schaltet den IO Punkt 34 auf 0 (32 + 2)
Befehl 'S' - Set-IO
Der Befehl setzt einen digitalen Ausgang auf 1.
Das Argument wird als hexadezimaler Wert angegeben.
ZB.: "S 22" - schaltet den IO Punkt 34 auf 1 (32 + 2)




Der CPLD ATF-1504

Wenn man nur die BASIC Befehlserweiterung nutzt, muss man sich nicht um die Funktionen des CPLD kümmern.


Die Kommunikation zwischen C64 und Arduino wird vom CPLD unterstützt durch zwei Buffer und zwei 'Byte ready' Flags. Es gibt einen C64 Empfangs Buffer (ein Byte) und einen C64 Sende Buffer (ein Byte). Die beiden Flags (Arduino Byte ready und C64 Byte ready) signalisieren, ob die Buffer voll sind (1) oder leer (0).


Das Flag 'Arduino Byte ready':

  • das Flag wird automatisch gesetzt (auf 1), sobald der C64 ein Byte in das Datenregister schreibt
  • das Flag wird gelöscht, sobald der Arduino signalisiert, dass er das Byte gelesen hat (Dir=1, /ACC kurz auf low)


Das Flag 'C64 Byte ready':

  • das Flag wird gesetzt (auf 1), sobald der Arduino signalisiert, dass er das Byte geschrieben hat (Dir=0, /ACC kurz auf low)
  • das Flag wird automatisch zurück gesetzt (auf 0), sobald der C64 ein Byte aus dem Datenregister liest


Der C64 Empfangs Buffer
  • der Empfangs Buffer wird vom C64 gelesen indem der C64 das Daten Register liest
  • der Empfangs Buffer wird vom Arduino beschrieben über die Signal Leitungen (Dir=0, Daten Bits D0 bis D7 anlegen, /ACC kurz auf low)


Der C64 Sende Buffer
  • der Sende Buffer wird vom C64 beschrieben indem der C64 das Daten Register schreibt
  • der Sende Buffer wird vom Arduino gelesen über die Signal Leitungen (Dir=1, Daten Bits D0 bis D7 lesen, /ACC kurz auf low)



C64 Register

Wenn man die BASIC Befehlserweiterung nutzt, muss man sich NICHT um die C64 Register kümmern.


Der C64 kommuniziert mit dem Modul über zwei Register. Über das Daten Register ($DF01) werden Daten byteweise gesendet und empfangen. Das Control Register ($DF00) reguliert den Datenfluss über zwei Bits.

Das Control Register an der Adresse $DF00 kann nur gelesen werden und es sind nur zwei Bits relevant. Das Bit 7 (Arduino Byte ready) zeigt, dass ein Byte zur Verfügung steht und über das Daten Register gelesen werden kann. Das Bit 6 (C64 Byte ready) zeigt, ob der Sende Buffer befüllt ist oder leer. Wenn der Sende Buffer leer ist, kann der C64 ein Byte in das Daten Register schreiben.


Der C64 sendet ein Byte:

  • der C64 liest das Control Register ($DF00), wenn Bit 6 gesetzt ist (1), muss das C64 Programm warten ...
  • wenn Bit 6 nicht gesetzt ist (0), dann kann der C64 ein Daten Byte in das Daten Register ($DF01) schreiben


Der C64 empfängt ein Byte:

  • der C64 liest das Control Register ($DF00), wenn Bit 7 gesetzt ist, dann steht ein Byte zur Abholung bereit ...
  • ... der C64 liest das Byte aus dem Daten Register, wodurch das Bit 7 im Control Register automatisch zurück gesetzt wird


Arduino Register

Wenn man die BASIC Befehlserweiterung nutzt, muss man sich NICHT um die Arduino Register kümmern.


Die Kommunikation zwischen Arduino und CPLD erfolgt über Register, die über 11 Signal Leitungen zugegriffen werden:

  • Signal D0 bis D7: acht Daten Bits (ein Byte)
  • Signal 'Dir': über diese Leitung signalisiert der Arduino die Daten Richtung (0=Arduino liest, 1=Arduino schreibt)
  • Signal '/Acc': über diese Leitung signalisiert der Arduino, dass Daten gelesen oder geschrieben worden sind (je nach '/Dir' Signal)
  • Signal 'Byte ready': diese Leitung signalisiert dem Arduino den Status (1=Buffer voll) des Sende- oder des Empfangs Buffer (je nach '/Dir' Signal)


Das Signal 'Dir' setzt die Datenrichtung im CPLD fest. Aus Sicht des CPLD sind D0 bis D7 Eingänge, wenn das 'Dir' Signal 1 ist. Ist das 'Dir' Signal 0, dann werden D0 bis D7 Ausgänge. Zudem schaltet das 'Dir' Signal auch die Zuordnung der anderen Signale (Buffer Zuordnung, /Acc und Byte ready).

'Dir' Signal 1 (Arduino schreibt Daten):

  • der CPLD schaltet DO bis D7 als Eingang
  • das 'Byte Ready' Signal zeigt den Status des C64 Empfangs Buffer (1=Buffer voll, 0=Buffer leer)
  • /Acc übernimmt die Daten von D0 bis D7 in den C64 Empfangs Buffer

'Dir' Signal 0 (Arduino liest Daten):

  • der CPLD schaltet DO bis D7 als Ausgang
  • das 'Byte Ready' Signal zeigt den Status des C64 Sende Buffer (1=Buffer voll, 0=Buffer leer)
  • /Acc signalisiert dem CPLD die Übernahme des Byte aus dem Buffer, der Status wechselt auf 0 (Buffer leer)


Das Signal 'Byte ready' ist auf logisch 1, wenn der Buffer im CPLD gefüllt ist und logisch 0, wenn der Buffer leer ist. Das Signal bezieht sich auf den Buffer, der gerade selektiert ist, abhängig vom /Dir Signal.


Das Signal '/Acc' bestätigt die Datenübernahme des Byte (1 --> 0 --> 1). Abhängig vom Signal 'Dir' löst /Acc die Übernahme von Daten aus (Arduino --> Empfangs Buffer) oder signalisiert dem CPLD, dass der Arduino das Byte aus dem Sende Buffer gelesen hat (Status Wechsel auf 0).


Arduino empfängt ein Byte:

  • der Arduino schaltet das 'Dir' Signal auf lesen (0) und prüft das 'Byte-Ready' Signal
  • wenn das Signal 'Byte ready' auf 1 ist (Buffer voll), dann holt der Arduino ein Daten Byte ab
  • der Arduino sendet das '/Acc' Signal über den zugehhörigen Pin (1 --> 0 --> 1)


Arduino sendet ein Byte:

  • der Arduino schaltet das 'Dir' Signal auf schreiben (1) und prüft das 'Byte-Ready' Signal
  • wenn das Signal 'Byte ready' auf 0 ist (Buffer leer), dann scheibt der Arduino das Byte und setzt das Signal '/Acc' (1 --> 0 --> 1)


Protokoll

Wenn man die BASIC Befehlserweiterung nutzt, muss man sich NICHT um das Protokoll zwischen C64 und Arduino kümmern.


Aus Sicht des C64 ist die Kommunikation mit dem Arduino einfach ein Datenstrom. Der C64 kann Daten byteweise senden und empfangen. Die Kommunikation wird immer vom C64 aus angestoßen. Der CPLD kann einen Interrupt (IRQ) im C64 auslösen, wenn der Sende Buffer leer oder der Empfangs Buffer voll ist. Es hat sich aber gezeigt, dass bei dem SPS Modul die Kommunikation durch Polling am effektivsten ist.


Die Kommunikation mit dem Arduino ist wie ein Terminal organisiert:

  • der C64 sendet eine Anforderung (Daten Paket)
  • der C64 empfängt eine Antwort vom Arduino (Status)


Der Arduino reagiert auch auf dieselbe Weise auf Eingaben über die serielle Schnittstelle. Der Unterschied ist nur, dass dieses Terminal nicht binär funktioniert sondern auf ASCII umgesetzt wird. So kann man die Funktion des Arduino und auch der dezentralen Boards am PC testen, indem man den Arduino "Serial Monitor" oder ein anderes Terminal Programm (wie zB. PUTTY) verwendet.


Arten von Daten Pakete an den Arduino:

  • CONFIG String (Startzeichen 'C' + Konfigurations String)
  • SETIO Port (Startzeichen 'O' + zwei Bytes Port Adresse + ein Byte Status)
  • GETIO Port (Startzeichen 'I' + zwei Bytes Port Adresse)


Arten von Antworten vom Arduino:

  • Fehlercode (0=okay)
  • Zustand eines digitalen Eingang


Tests und Inbetriebnahme


dezentrale IO

Die dezentralen IO Boards kann man sehr einfach separat testen. Dazu gibt es einen Arduino Sketch im Download Bereich. Im Sketch kann man sich die IO Pins beliebig definieren und ggf. auch an jedes beliebige Arduino Board anpassen.

Der Test Sketch beschreibt die DO Boards alle 100 Millisekunden, der Ausgabewert ist ein einfacher Zähler. So sieht man ob jede LED und jeder Ausgang des HC595 funktioniert. Man kann so auch die Verkettung eines weiteren DO Board testen.

Der Test Sketch liest auch ein oder mehrere DI Boards regelmäßig ein. Jede Änderung an den Eingang Pins wird über das Terminal (serial Monitor) protokolliert. Durch setzen einer oder mehrerer Jumper kann man jedes Eingangs Bild testen. Die Eingangs Pins A bis H können aber auch zum testen mit einem Schraubenzieher oder einem Stück Draht verbunden werden.



SPS Modul und Arduino Nano

Das SPS Modul kann in der ersten Phase ganz ohne C64 getestet werden (Standalone Betrieb). Dazu wird die Brücke JP1 auf 'extern' gestellt und der Arduino Nano mit einem USB Kabel versorgt. Die dezentralen IO Boards können mittels Flachbandkabel an das Modul angeschlossen werden. Die Kommunikation mit den IO Boards kann mit demselben Sketch getestet werden, wie im vorherigen Abschnitt beschrieben.

Wenn das Modul in einem C64 steckt, dann kann die Stromversorgung für den Arduino vom C64 kommen. Dazu muss die Brücke JP1 auf 'intern' gestellt werden.


Achtung:

Wenn die Brücke JP1 auf 'intern' steht (Stromversorgung durch den C64), dann darf das USB Kabel nicht angesteckt werden!!!

Es ist ein Mischbetrieb möglich, Modul im C64 angesteckt und USB Kabel am Arduino. In diesem Fall muss die Brücke JP1 auf extern stehen!!!



SPS Sketch

Der SPS Sketch ist die Standard Firmware für den Arduino am SPS Modul. Der Test des Sketch kann auch ohne einem C64 durchgeführt werden.


Der SPS Sketch übernimmt alle Aufgaben die der Arduino auszuführen hat:

  • Steuerung der dezentralen IO Boards
  • Kommunikation mit dem C64 über den CPLD
  • Kommunikation über die serielle Schnittstelle


Die digitalen Eingänge werden automatisch zyklisch abgefragt. Der Zustand aller IO ist im Arduino RAM abgebildet (IO Matrix) und wird stets periodisch aktualisiert. Die digitalen Ausgänge werden ebenfalls automatisch aktualisiert, sobald ein Befehl kommt der ein Bit in der IO Matrix ändert.

Der Arduino Nano nimmt Befehle entgegen und führt diese sofort aus. Die Befehle können sowohl vom C64 als auch vom seriellen Terminal (PC) kommen.

Wenn der Arduino mit einem seriellen Terminal verbunden ist, sieht man da automatisch alle Vorgänge im System. Man kann Befehle senden und sieht am Terminal sofort das Ergebnis. Am Terminal sieht man auch, wenn der C64 Befehle sendet zum ändern von IO Ports oder der SPS Konfiguration. Die Änderung von einem digitalen Eingang wird automatisch am Terminal protokolliert.


Befehle an den Arduino:

  • IO Pin setzen (auf logisch high)
  • IO Pin zurücksetzen (auf logisch low)
  • IO Pin abfragen
  • senden eines Config String


Test des Modul im C64

Das SPS Modul kann nun im C64 getestet werden. Die Brücke JP1 wird auf extern gestellt und wir bestücken den CPLD sowie das EPROM.

Nach dem Einschalten des C64 meldet sich das Modul mit C64-SPS EXTENSION. Durch Eingabe des Befehl 'HELP' werden die neuen, zusätzlichen BASIC Befehle angezeigt. Das BASIC akzeptiert nun neben dezimalen Zahlen auch Zahlen in hexadezimaler (vorangestelltes '$' Zeichen) und binärer (vorangestelltes '%' Zeichen) Schreibweise.

Wenn der CPLD richtig programmiert wurde, dann sollte nun auch die Kommunikation mit dem Arduino funktionieren. Durch Eingabe des Befehl 'SETIO' kann man direkt eine LED auf einem DO Board einschalten. Mit einem kleinen BASIC Programm kann man nun bequem die Ausgänge der DO Boards steuern und die Eingänge der DI Boards einlesen und weiter verarbeiten.

Das EPROM Image kann optional als "Auto-Start" Image erzeugt werden. In diesem Fall wird sofort nach dem Start des C64 ein BASIC Programm namens "START" geladen und ausgeführt.



Der Arduino protokolliert am seriellen Terminal alles, was so passiert. Nach dem starten des Arduino kommt am Terminal die aktuelle IO Konfiguration (Bild 1). Die Zeile "--DO--" bedeutet, dass der Arduino alle digitalen Ausgänge aktualisiert. Wenn der C64 IO-Befehle sendet (SETIO, GETIO, RESIO), dann erscheint am Terminal eine entsprechende Ausgabe (Bild 2). Der C64 kann auch die IO Konfiguration Ändern (Befehl CONFIG). Wenn der String gültig ist, dann protokolliert der Arduino die neue IO Konfiguration und die neue IO Nummerierung ist auch sofort gültig (Bild 3).


ACHTUNG: Wenn das Modul im C64 steckt, dann darf das USB Kabel nur angesteckt werden wenn die Brücke JP1 auf "extern" steht!!!

Wenn das Modul nicht im C64 steckt, dann sollte der CPLD auch extern versorgt werden, daher muss die Brücke JP1 auf "intern" stehen.


News

  • 21.03.2022 -- Release Rev. 3
  • 22.02.2022 -- zweiter Prototyp Platinen angekommen, Testphase
  • 29.01.2022 -- Layout erstellt für zweiten Prototyp und dezentrale IO Boards
  • 14.12.2021 -- erste Prototyp Platine bestellt


Downloads


Links