C64 SPS: Unterschied zwischen den Versionen

Aus
Zur Navigation springen Zur Suche springen
Tw (Diskussion | Beiträge)
Tw (Diskussion | Beiträge)
Markierung: wikieditor
 
(208 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[File:C64-SPS-FO.GIF|right|thumb|200px|C64-SPS]]
[[File:C64-SPS-2-FO.GIF|right|thumb|200px|C64-SPS]]
[[File:C64-SPS-01.jpg|right|thumb|200px|C64-SPS]]
[[File:C64-SPS-13.jpg|right|thumb|200px|C64-SPS]]
[[File:C64-SPS-02.jpg|right|thumb|200px|C64-SPS]]
[[File:DIO-16-01.JPG|right|thumb|200px|DIO-16 Boards]]
[[File:C64-SPS-12.jpg|right|thumb|200px|C64-SPS]]
__TOC__
__TOC__
<br />
<br />
== Das C64 SPS Modul ==
== Das C64 SPS Modul ==


Die '''6502 Extension''' ist eine Platine, mit der man ein beliebiges 6502 System erweitern kann um RAM und ROM (Flash Speicher). Zudem kann der RAM und/oder der ROM des Zielsystem ersetzt werden durch Board internes RAM. Die 6502 Extension wird anstatt der CPU 6502 eingesetzt (die CPU kommt dann auf die Platine). Dadurch hat die Platine Zugriff auf den gesamten Adressraum der CPU (64KB).
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.


Die Idee wurde stark inspiriert durch die [http://vic-20.de/x1541/hardware/ '''Universal 6502 RAM and ROM Expansion'''] von '''Nicolas Welte'''. Dieses Board hat in der Praxis gezeigt, dass es für zahlreiche Einsatzgebiete wundervoll funktioniert. Heute ist Speicher sehr preisgünstig geworden. Und die Praxis mit dem 6502 RAM/ROM Board hat da und dort neue Wünsche aufgeworfen, deshalb habe ich die '''6502 Extension''' entwickelt.
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.


Auf dem Board befindet sich:


* ein Flash Speicher mit 512KB (AM29F040)
Was kann man mit dem Board tun:
* ein SRAM  Speicher mit 128KB (62LV1027)
 
* ein 74LS245 um den Datenbus zu trennen
* automatischer Start eines BASIC Programm nach dem Einschalten (BASIC im EPROM)
* zwei GAL 22v10
* zusätzliche Befehle im v2 BASIC um digitale Ausgänge zu setzen und digitale Eingänge abzufragen
* ein 74LS273 als Register
* 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
 
<br />
==== 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.
 
<br />
==== 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)
 
<br />
 
==== Funktion des CPLD ====


Der CPLD hat folgende Aufgaben:


Was kann man mit dem Board tun:
* er stellt dem C64 Speicher zur Verfügung (8K Modul, zB. für die BASIC Befehls Erweiterung)
* er erledigt das Banking des EPROM (Magic-Cart Modul)
* er erledigt die Kommunikation zwischen C64 und dem Arduino
 
<br />
 
==== 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.
 
<br />


* Speichererweiterung (RAM und ROM)
==== Entwicklung der C64-SPS Hardware ====
* ersetzen des RAM im Zielsystem
* ersetzen des ROM im Zielsystem
* Flash Laufwerk für Tools und andere Programme
* laden von Dateien in den 'ROM' Ersatz im Zielsystem
* Diagnose an defekte 6502 Computer
* Reparatur von defekten 6502 Computer




<u>Schematic, Layout, Prototyp</u>:  
<u>Prototyp 1</u>:  


<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-SCH.png
Image:C64-SPS-FO.GIF
Image:C64-SPS-FO.GIF
Image:C64-SPS-FU.GIF
Image:C64-SPS-FU.GIF
Zeile 40: Zeile 79:
Image:C64-SPS-02.jpg
Image:C64-SPS-02.jpg
</gallery>
</gallery>
<u>Prototyp 2 und IO Boards</u>:
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-11.jpg
Image:C64-SPS-15.jpg
Image:C64-SPS-13.jpg
</gallery>
<u>C64 SPS - Schematic, Layout</u>:
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-SCH_1.png
Image:C64-SPS-SCH_2.png
Image:C64-SPS-2-FO.GIF
Image:C64-SPS-2-FU.GIF
Image:C64-SPS-12.jpg
</gallery>
<br />
== 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.
<br />
==== 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.
<u>DO-8 LED: Schematic, Layout</u>:
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
C64-SPS-DO-8-SCH.png
DO-Board-LED-FO.GIF
DO-Board-LED-FU.GIF
</gallery>
<u>Prototyp DO-16 LED: Layout</u>:
<gallery mode="traditional" widths=160px heights=90px perrow=9 caption="">
DO-16-SMS-FO.GIF
DO-16-SMS-FU.GIF
DO-16-01.JPG
</gallery>
<br />
==== 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.
<u>DI-8 und DI-8 LED: Schematic, Layout</u>:
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.
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-DI-8-SCH.png
Image:C64-SPS-DI_O.GIF
Image:C64-SPS-DI_U.GIF
Image:C64-SPS-DI-LED-O.GIF
Image:C64-SPS-DI-LED-U.GIF
</gallery>
<u>Prototyp DI-16 und DI-16 mit Optokoppler: Layout</u>:
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.
<gallery mode="traditional" widths=160px heights=90px perrow=9 caption="">
Image:DI-16-FO.GIF
Image:DI-16-FU.GIF
Image:DI-16-Opt-FO.GIF
Image:DI-16-Opt-FU.GIF
Image:DI-16-01.JPG
</gallery>
<br />
==== 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:
<gallery mode="traditional" widths=150px heights=90px perrow=9 caption="">
Image:C64-SPS-DIO-16.jpg
</gallery>
<br />
==== 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)
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-B01.gif
Image:C64-SPS-B02.gif
Image:C64-SPS-B03.gif
</gallery>
<br />
== 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.
<br />
==== 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ü
<br />
==== 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
<br />
==== 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 [https://sta.c64.org/cbm64basins2.html 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 ...
<br />
==== Inhalt des EPROM erstellen ====
Der Inhalt des EPROM ist zB. die SPS Befehlserweiterung und optional für die Benutzer die eigene BASIC Programme benutzen (Standard Image Datei für das SPS Modul).
Mit Hilfe eines Windows Tool (zB. [[UC-Builder]]) kann man diese Image Datei aber auch selbst erstellen mit eigenem Modul Code.
<br />
==== 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.
<br />
== 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.
<u>Befehle an den Arduino</u>:
* setze Port auf 1  (SETIO)
* setze Port auf 0  (RESIO)
* sende den Zustand eines Ports  (GETIO)
* setze die Konfiguration für ein Port  (CONFIG)


<br />
<br />
=== Universal 6502 RAM and ROM expansion ===
==== Standalone Betrieb ====  


Nicolas Welte hat mit der 6502 RAM/ROM Expansion ein großartiges Tool geschaffen. Dieses geniale Board lässt sich an jedes 6502 System anpassen und hat sich in der Praxis schon sehr bewährt. Vielen alten PET Computer wurde durch dieses Board neues Leben eingehaucht oder einfach nur der Speicher auf 32K erweitert. Man kann über DIP Switch die BASIC Version wählen oder zwischen 40 und 80 Zeichen umschalten (bei 8032 Systemen).  
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|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.


Der Unterschiede zum '''6502 Extension Board''' sind:


* die 6502 Extension hat einen größeren FLASH Speicher (512K statt 128K)
<br />
* die 6502 Extension hat einen größeren SRAM Speicher (128K statt 32K)
 
* die Adressierung ist flexibler durch den Einsatz von zwei GAL
==== C64 Modul Betrieb ====
* Schreibzugriffe in den internen Board Speicher werden nicht ins externe System getragen
 
* Lesezugriffe in den internen Board Speicher werden nicht in den IO Bereich des externen System getragen
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.
* die 6502 Extension ist über die Software konfigurierbar durch Einsatz eines Registers
 
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.
 


<br />
<br />
=== Einsatz in 6502 Systeme ===
==== 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!!


Das 6502 Extension Board kann prinzipiell in jedem System eingesetzt werden, das eine 6502 CPU verwendet. Allerdings ist jedes 6502 System für sich ziemlich speziell, was die IO und Speicherverwaltung anbelangt. Deshalb muss die 6502 Extension an das Zielsystem 'angepasst' werden. Diese Anpassung erfolgt über die beiden GAL Bausteine auf der Platine in Form einer JEDEC Datei. Der GAL Baustein kann mit den meisten EPROM Programmiergeräten (zB. der TL866) beschrieben werden.


; Befehl '?' - Hilfe
: Dieser Befehl gibt einen Hilfe Schirm aus, der alle Terminal Kommandos auflistet


Gute Einsatzmöglichkeit sehe ich für folgende Systeme:
; 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


* Commodore PET und CBM
; Befehl 'G' - Get-IO
* Commodore VC-20
: Der Befehl dient zur Abfrage eines IO, es können auch digitale Ausgänge abgefragt werden.
* Commodore 1541 Floppy Laufwerk
: Das Argument ist eine Zeichenfolge, jeder Buchstabe steht für 16 IO (I..digitaler EIngang, O..digitaler Ausgang).
* andere Commodore Floppy Laufwerke
: ZB.: "G 1A" - Abfrage des IO mit der Nummer 26 (16 + 10)
* Single Board Computer (zb. das [https://www.kswichit.com/6502/6502.html 6502 Microprocessor Kit von Wichit Sirichote])


; 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)


Es sind JEDEC Dateien verfügbar für diese Zielsysteme:
; 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)
 
 
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-D11.png
Image:C64-SPS-D12.png
Image:C64-SPS-D13.png
Image:C64-SPS-D14.png
Image:C64-SPS-D15.png
</gallery>


* Commodore PET und CBM
* [[Mikroprozessor_Boards/6502|6502 Microprocessor Kit von Wichit Sirichote]]


<br />
<br />
=== Anpassung an beliebige 6502 Systeme ===
== Der CPLD ATF-1504 ==


Das 6502 Extension Board kann prinzipiell an jedes System angepasst werden, das eine 6502 CPU verwendet. Die CPU 6502 hat einen Adressraum von 64K, wobei sich auch die IO Ports den Adressraum mit dem Speicher teilen. Die CPU 'sieht' also zu jedem Zeitpunkt generell immer nur 65536 Bytes (64K). Dieser Adressraum von 64K wird nun individuell genutzt von jedem 6502 System. Der Speicher gliedert sich in ROM (readonly Memory), in RAM (random access Memory) und IO. Das können aber beliebig viele Blöcke sein, die auch nicht aufeinander folgen müssen.


Nun hat das 6502 Extension Board auch selbst ROM (512K Flash), RAM (128K SRAM) und IO (das Register). Deshalb unterscheiden wir zwischen Board internen Speicher (Adressraum der 6502 Extension Platine) und Board externen Speicher (das 6502 Zielsystem). So gesehen ist die 6502 Extension schon fast ein selbstständiges kleines 6502 System, es fehlen nur Takterzeugung und Benutzer Schnittstellen.
'''''Wenn man nur die BASIC Befehlserweiterung nutzt, muss man sich nicht um die Funktionen des CPLD kümmern.'''''


Auf der 6502 Extension befinden sich zwei GAL Bausteine. Der innere GAL ist der Adressen Decoder, der das externe 6502 System abbildet. Es gehen alle 16 Adressleitungen der CPU auf den Adressen Decoder, deswegen kann er jedes einzelne Byte des Adressraum unserer 6502 CPU einem 'Speichertyp' zuordnen. So kann man praktisch jedes 6502 System nachbilden, was den Aufbau des Adressraum anbelangt.


Der Adressen Decoder erkennt also, auf 'was' (IO, ROM, RAM) die CPU in dem externen System zugreifen will. Will man nun zb. den gesamten RAM im Zielsystem ersetzen durch Board eigenen RAM, dann erfolgt dies aufgrund der Information des Adressen Decoder GAL. Dasselbe kann man mit dem externen ROM machen, man kann es ersetzen durch Board eigenen Speicher. Den IO Bereich kann man nicht ersetzen, aber man kann ihn 'unsichtbar' machen für die CPU. Das macht dann Sinn, wenn ein Programm einen möglichst großen durchgängigen Adressraum benötigt (zB. flache Adressierung: 64K RAM).
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).  


Der Adressen Decoder GAL ermöglicht also eine Anpassung des Board an ein externes 6502 System. Die Information über den Speichertyp beschränkt sich aber nicht auf IO, ROM und RAM. Der Speichertyp hat 3 Bits und kann damit bis zu 8 Zustände beschreiben.


Das Flag 'Arduino Byte ready':


Beim der CBM-8296 Implementierung gibt es folgende Speichertypen:
* 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)
 
 
 
<br />
==== C64 Register  ====


* die ersten 1024 Bytes des externen RAM (Zeropage, Stack, Buffer ...)
'''''Wenn man die BASIC Befehlserweiterung nutzt, muss man sich NICHT um die C64 Register kümmern.'''''
* der restliche externe RAM
* jede Art von ROM Sockel (8K Kernal, 8K BASIC, 4K Editor, 2x 4K Zusatz ROM)
* Bildschirm RAM
* externes IO  (E800-E8FF und FFF0)




Um die 6502 Extension an ein 6502 System anzupassen muss man die Logik in den GAL Bausteinen implementieren. Der Adressen Decoder GAL bildet den Adressraum des Zielsystem nach und es legt auch die Adresse des Board internen Register fest. Beim CBM 8296 hat sich die Adresse FFF1 angeboten, das kann aber bei einem anderen 6502 System ganz anders sein.
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 andere GAL bestimmt die 'Logik' der 6502 Extension. Der Logik GAL kann in vielen Fällen der selbe sein wie bei einem anderen System. Aber unter Umständen will man auch den Logik GAL verändern, um zusätzlich Adressen Modelle zu erstellen oder bestehende Modelle anzupassen.  
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.


Das IO Register der 6502 Extension besteht aus einem 8-fach D-FlipFlop (74LS273). Die Verdrahtung ist natürlich fix, daher kann man die Funktion der einzelnen Bits nicht frei definieren. Die Belegung der Register Bits:


* Bit 7 bis 4 stellt die Bank des Flash ein (Bank 0 bis 15)
Der C64 sendet ein Byte:
* Bit 3 bis 0 stellen das gewünschte Adressen Modell ein (Modell 0 bis 15)


* 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


Beim der CBM-8296 Implementierung gibt es folgende Adressen Modelle:


* Modell 0: 32K int. RAM, 32K int. Flash, no IO, no Screen  (Start Konfiguration nach dem Reset)
Der C64 empfängt ein Byte:
* Modell 1: 32K int. RAM, 32K int. Flash, no IO, no Screen  (Flash beschreibbar Programmierbar)
* Modell 2: 32K int. RAM Bank 1, 4K RAM, 28K int. prot. RAM, no Screen  (Tool Konfig 1)
* Modell 3: 32K int. RAM Bank 1, 32K int. prot. RAM, no Screen  (Tool Konfig 2)
* Modell 4: 64K int. RAM Bank 0, no IO, no Screen  (64K flach Bank 0)
* Modell 5: 32K int. RAM Bank 1, 32K int. prot. RAM    (Betriebsmodus 0 offen)


* Modell 12: 32K int. RAM Bank 1, 32K int. prot. RAM, no register  (Betriebsmodus 1, gesperrt)
* der C64 liest das Control Register ($DF00), wenn Bit 7 gesetzt ist, dann steht ein Byte zur Abholung bereit ...
* Modell 13: 32K int. RAM Bank 1, 32K extern, no register  (Betriebsmodus 2, gesperrt)
* ... der C64 liest das Byte aus dem Daten Register, wodurch das Bit 7 im Control Register automatisch zurück gesetzt wird
* Modell 14: 32K ext. RAM, 32K int. prot. RAM, no register  (Betriebsmodus 3, gesperrt)
* Modell 15: 32K ext. RAM, 32K extern, no register  (Betriebsmodus 4, 6502 Extension deaktiviert)


<br />
<br />


=== Der Board interne Speicher ===
==== Arduino Register ====
 
'''''Wenn man die BASIC Befehlserweiterung nutzt, muss man sich NICHT um die Arduino Register kümmern.'''''


Das 6502 Extension Board hat 512K Flash Speicher, 128K SRAM und ein IO Register zur Konfiguration


Der Flash Speicher hat eine Größe von 512K. Es können nur immer exakt 32K eingeblendet werden, und das nur in den oberen 32K des Adressraum. Bei 32K Seiten in einem 512K großen Speicher hat man 16 Seiten (Bank 0 bis Bank 15).
Die Kommunikation zwischen Arduino und CPLD erfolgt über Register, die über 11 Signal Leitungen zugegriffen werden:


Der SRAM hat eine Größe von 128K. Es können nur immer exakt 64K eingeblendet werden, allerdings müssen nicht die gesamten 64K sichtbar sein und der Speicher kann auch für bestimmte Regionen einen Schreibschutz haben. Man hat also zwei 64K Seiten (Bank 0 und Bank 1).
* 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)  


Im normalen Betrieb hat der Flash Speicher keine Funktion. Er ist mehr wie ein Laufwerk zu sehen, es werden 'Dateien' geladen aus dem Flash in den externen oder den internen RAM. Externe ROM können durch internen RAM 'ersetzt' werden, die physischen Speicherbausteine im externen System werden dann nicht mehr benötigt und können auch ausgebaut werden. Wenn der interne RAM ein externes ROM ersetzt, dann wird ein Schreibschutz gesetzt, damit es auch wie ein ROM aussieht und nicht versehentlich überschrieben werden kann.


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).


<u>'Dir' Signal 1 (Arduino schreibt Daten)</u>:
* 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


Bei der CBM-8296 Implementierung startet das Board mit folgender Konfiguration:
<u>'Dir' Signal 0 (Arduino liest Daten)</u>:
* 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)


* die ersten 32K (0000-7FFF) sind Board interner SRAM Bank 0
 
* die oberen 32K (8000-FFFF) sind Flash Speicher Bank 0 (Ausnahme: IO Register)
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 IO Register an der Adresse FFF1
 
 
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)


<br />
<br />


== Inhalt des FLASH Speicher zusammenstellen ==
==== 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.


Für die Erstellung einer persönlichen Programm Sammlung für das Flash der 6502-Extension gibt es ein PC Programm: '''6502ext-Builder'''


Arten von Daten Pakete an den Arduino:


Der 6502ext-Builder nimmt die gewünschten ROM Dateien und andere Programme und verpackt sie in eine einzelne Datei ('''6502ext Image Datei'''). Diese Datei wird in den Speicher (FLASH) des UC Modul geschrieben. Nun steht die Programm Sammlung für den C64 zur Verfügung.
* 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


<br />
<br />
=== 6502ext Image Datei ===


Die Programm Sammlung auf dem 6502-Extension Board kann man frei zusammen stellen. Dazu dient ein kleines Programm ('''6502ext-Builder''') am PC. Das Programm erstellt eine sogenannte '''6502ext Image Datei'''. diese Image Datei hat die Endung '''.bin''' und kann direkt in den FLASH Speicher programmiert werden.
== Tests und Inbetriebnahme ==




Die Größe der 6502ext Image Datei darf den verfügbaren Platz im FLASH Speicher nicht überschreiten. Bei Verwendung eines AM29F040 darf die Image Datei eine maximale Größe von 512KB haben. Die Größe setzt sich zusammen aus der Summe der einzelnen ROM Dateien und Programme plus der Größe des '''6502ext-Loader'''. Der 6502ext-Loader ist ein Programm, das beim Start der CPU in dem 6502-Extension Board notwendig ist.
<br />
==== 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.


<br />
<br />
=== Der 6502ext-Loader ===
==== 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.
 
 
<u>'''Achtung'''</u>:
 
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!!!


In dem 6502-Extension Board können mehrere ROM Dateien und Programme gespeichert sein. Der Loader kopiert die notwendigen Dateien aus dem Flash Speicher in den RAM. Ggf. wird der RAM schreibgeschützt und dem externen System als ROM angeboten.


<br />
<br />
=== Der 6502ext-Builder ===


In dem Flash Speicher des 6502-Extension Board kann man fertige Image Dateien programmieren. Dazu braucht man nur ein EPROM Programmiergerät, wie zB. den TL866. Um so eine Image Datei zu erstellen braucht man den '''6502ext-Builder'''.
==== 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


Der 6502ext-Builder erstellt eine Image Datei aus einem oder mehreren Dateien (Programme oder ROM Dateien). Die Image Datei enthält automatisch den passenden '''6502ext-Loader''' für das externe 6502 System.
* Kommunikation mit dem C64 über den CPLD


* Kommunikation über die serielle Schnittstelle


Für die Erstellung des UC-Menü benötigt das UC-Builder folgende Informationen zu jedem C64 Programm:


* Name des Programm
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.
* Art des Programm
 
* Den Dateinamen des Programm
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.
* ggf. Zusatzinfos
 
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


<br />
<br />
==== 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.


=== Die CSV Datei Steuerdatei für Erstellung der Image Datei ===
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.


Das 6502ext Builder liest die benötigten Informationen aus einer Text Datei (CSV Datei).
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.
Jede Zeile in der CSV Datei steht für ein Programm oder ROPM Image.
Mit der Option -m sagt man dem 6502ext-Builder den Namen der CSV Datei (''-m File.csv'').
Wenn der 6502ext-Builder ohne CSV Dateinamen aufgerufen wird, sucht es automatisch nach der CSV Datei ''image.csv''.


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.


<b><u>Beispiel einer CSV Datei</u>:</b>


Programm;          Typ;      Dateiname
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
BASIC_2_C0;        ROM;      901465-01.bin;                    $C000
Image:C64-SPS-C01.png
BASIC_2_D0;        ROM;      901465-02.bin;                    $D000
Image:C64-SPS-C02.png
BASIC_4_B0;        ROM;      901465-23.bin;                    $B000
Image:C64-SPS-C03.png
BASIC_4_C0;        ROM;      901465-20.bin;                    $C000
Image:C64-SPS-C04.png
BASIC_4_D0;        ROM;      901465-21.bin;                    $D000
Image:C64-SPS-C05-Kitt.png
EDIT_2_B;          ROM;      901474-01.bin;                    $E000
</gallery>
EDIT_2_N;          ROM;      901447-24.bin;                    $E000
EDIT_4_40_N-50Hz;  ROM;      901498-01.bin;                    $E000
EDIT_4_40_N-60Hz;  ROM;      901499-01.bin;                    $E000
EDIT_4_80_B-50Hz;  ROM;      901474-04.bin;                    $E000
KERNAL_2;          ROM;      901465-03.bin;                    $F000
KERNAL_4;          ROM;      901465-22.bin;                    $F000
8296_ROM;          ROM;      324746-01.bin;                    s8296
8296D_EDITOR;      ROM;      324243-01.bin;                    $E000
HELP!;              ROM;      help!8032.bin;                    $A000
ExBasic-II 9;      ROM;      ExBasic_II_9.bin;                  $9000
ExBasic-II A;      ROM;      ExBasic_II_A.bin;                  $A000


ExBasic 8032;      ROMSET;  ExBasic-II 9, ExBasic-II A
4032-B;            ROMSET;  BASIC_4_B0, BASIC_4_C0, BASIC_4_D0, EDIT_4_40_B-50Hz, KERNAL_4
8032-B;            ROMSET;  BASIC_4_B0, BASIC_4_C0, BASIC_4_D0, EDIT_4_80_B-50Hz, KERNAL_4
8296;              ROMSET;  8296D_EDITOR, 8296D_ROM


8032 + Help!;      ROMSET;  HELP!, 8032-B
8296 + Help!;      ROMSET;  HELP!, 8296
8296 + ExBasic II;  ROMSET;  ExBasic 8032, 8296


  Hello World;        PRG;      PRG\test2.bas 
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).
 
 
<u>ACHTUNG</u>: 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.
 
<gallery mode="traditional" widths=90px heights=90px perrow=9 caption="">
Image:C64-SPS-D01.png
Image:C64-SPS-D02.png
Image:C64-SPS-D03.png
</gallery>


<br />
<br />
Zeile 226: Zeile 704:
== News ==
== News ==


* 9.1.2022 -- erste Prototyp Platine bestellt --
* 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


<br />
<br />
Zeile 232: Zeile 713:
== Downloads ==
== Downloads ==


* [[Media:6502-Extension-SCH.png|6502 Extension - Schematic]]  
* [[Media:C64-SPS.pdf|C64 SPS Modul - Schematic]]
* [[Media:Gerber-C64-SPS.zip|C64 SPS Modul - Gerber]]
* [[Media:Gerber-DIO.zip|Dezentrale IO Boards - Gerber]]
* [[Media:C64-SPS-EPROM.zip|C64 SPS Modul - Firmware (EPROM Inhalt)]]
* [[Media:C64-SPS Jedec.zip|Jedec Datei für den CPLD]]
* [[Media:C64-SPS-HEX.zip|Firmware für Arduino Nano]]
* [[Media:C64-SPS-Shift-Register.zip|Arduino Sketch zum Test der IO Boards]]


<br />
<br />


== Links ==
== Links ==
 
* [https://forum.classic-computing.de/forum/index.php?thread/25808-basic-programm-autoload-beim-einschalten-des-c64 Ursprüngliche Idee zum C64-SPS aus dem Forum VzEkC e.V.]
* [[CBM Hardware/Expansions/6502-RAMROM|die großartige 6502 RAM/ROM Expansion von Nicolas Welte]]
* [http://wiki.linuxcnc.org/cgi-bin/wiki.pl?Shift_Register_Port_Expander IO Port Expander mittels Shift Register]
* [http://vic-20.de/x1541/hardware/petram.html The universal 6502 RAM/ROM Expansion (Nicolas Welte's Hardware Projects)]
* [https://www.woolseyworkshop.com/2021/02/18/adding-digital-io-to-your-arduino-part-2-the-74hc165/ Adding digital IO to your Arduino]
 
* [https://dronebotworkshop.com/shift-registers/ Arduino und Shift Register (HC165, HC595)]
* [https://elektro.turanis.de/html/prj173/index.html Shift Register (HC165)]
* [https://elektro.turanis.de/html/prj061/index.html Shift Register (HC595)]
* [https://www.waveshare.com/wiki/MCP23017_IO_Expansion_Board MCP-23017 Board - Waveshare]
* [https://www.reichelt.de/at/de/entwicklerboards-i-o-erweiterungsboard-mcp23017-debo-io-board-p266040.htm MCP-23017 Board - Reichelt]
* [https://de.aliexpress.com/item/1005003132285985.html Relais Board (1,2,4,8)]
* [https://de.aliexpress.com/item/1005002806849848.html Relais Board 16 fach mit Optokoppler]
* [https://de.aliexpress.com/item/1005001621690700.html SSR G3MB-202P (Solid State Relais)]
* [https://de.aliexpress.com/item/1005002877137467.html Optokoppler Isolation Bord]
* [https://sta.c64.org/cbm64basins2.html C64 BASIC TOKEN list]
* [https://docs.arduino.cc/hardware/nano Arduino Nano]


<br />
<br />

Aktuelle Version vom 3. September 2026, 15:46 Uhr

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, zB. für die BASIC Befehls Erweiterung)
  • er erledigt das Banking des EPROM (Magic-Cart Modul)
  • er erledigt die Kommunikation zwischen C64 und dem Arduino


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 zB. die SPS Befehlserweiterung und optional für die Benutzer die eigene BASIC Programme benutzen (Standard Image Datei für das SPS Modul).

Mit Hilfe eines Windows Tool (zB. UC-Builder) kann man diese Image Datei aber auch selbst erstellen mit eigenem Modul Code.


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