C64 SPS: Unterschied zwischen den Versionen
Tw (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Tw (Diskussion | Beiträge) |
||
| Zeile 39: | Zeile 39: | ||
<br /> | <br /> | ||
== Dezentrale IO Boards == | == Dezentrale IO Boards == | ||
Die Anzahl der IO ist nicht beschränkt bei dem SPS Modul. Der Arduino selbst stellt keine IO Pin zur Verfügung, vielmehr steuert der Arduino eine Menge von kleinen Platinen (dezentrale IO Boards). | |||
Vorteile der dezentralen IO Boards: | |||
* einfache Erweiterbarkeit (skalierbar) | |||
* günstiger und einfacher Nachbau (normale TTL, notfalls auf Lochraster) | |||
* einfach zu ersetzen bei Defekt | |||
Der Arduino kommuniziert laufend mit den IO Boards, setzt Ausgänge und fragt Eingänge ab. Es gibt drei Arten von IO Boards, man kann einen beliebigen Mix aus Boards verwenden, der Arduino Sketch muss nicht verändert werden. | |||
<br /> | |||
==== Dezentrale IO Boards ==== | |||
Version vom 17. Januar 2022, 12:23 Uhr


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 digitale Ausgänge und digitale Eingänge zur Verfügung. Der C64 kann per Software die digitalen Ausgänge steuern (TTL Pegel, 5V) sowie die digitalen Eingänge (TTL Pegel, 5V) abfragen. Um die Programmierung des C64 zu vereinfachen, implementiert das Modul zusätzliche BASIC Befehle. So kann man einfach über ein einfaches BASIC Programm die Kontrolle über eine elektrische Anlage übernehmen.
Auf dem Board befindet sich:
- ein EEPROM Speicher mit 64KB (W27C512)
- ein CPLD ATF-1504
- ein Arduino Nano
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)
Schematic, Layout, Prototyp:
Dezentrale IO Boards
Die Anzahl der IO ist nicht beschränkt bei dem SPS Modul. Der Arduino selbst stellt keine IO Pin zur Verfügung, vielmehr steuert der Arduino eine Menge von kleinen Platinen (dezentrale IO Boards).
Vorteile der dezentralen IO Boards:
- einfache Erweiterbarkeit (skalierbar)
- günstiger und einfacher Nachbau (normale TTL, notfalls auf Lochraster)
- einfach zu ersetzen bei Defekt
Der Arduino kommuniziert laufend mit den IO Boards, setzt Ausgänge und fragt Eingänge ab. Es gibt drei Arten von IO Boards, man kann einen beliebigen Mix aus Boards verwenden, der Arduino Sketch muss nicht verändert werden.
Dezentrale IO Boards
Inhalt des FLASH Speicher zusammenstellen
Der Inhalt des EPROM ist die Befehlserweiterung und das Benutzer BASIC Programm (Image Datei). Mit Hilfe eines Windows Tool kann man diese Image Datei selbst erstellen.
Funktionsweise und Technik
Aus der Sicht des C64 ist das SPS Modul eine einfache Geschichte. Es gibt eine bestimmte Menge an digitaler Ports die man setzen, löschen und abfragen kann. Der C64 kann auch die Konfiguration einer Anlage setzen, das muss aber nur einmal passieren, der Arduino speichert die IO Konfiguration dann in seinem EPROM Speicher ab.
Aus Sicht des Arduino gibt es Befehle:
- setze Port auf 1
- setze Port auf 0
- sende den Zustand eines Ports
- setze die Konfiguration für ein Port
Der Arduino bedient die dezentralen IO Boards. Die IO Konfiguration bestimmt die Zuordnung des IO Port zu den dezentralen IO Boards. Im RAM des Arduino ist ein Abbild des Zustand aller IO Ports, sodass eine Anfrage des C64 sofort beantwortet werden kann. Ein zyklischer Task sorgt dafür, dass das IO Abbild mit den IO Boards abgeglichen wird.
C64 Register
Der C64 kommuniziert mit dem Modul über zwei Register. Über das Daten Register ($DE01) werden Daten byteweise gesendet und empfangen. Das Control Register ($DE00) reguliert den Datenfluss über zwei Bits.
Das Control Register an der Adresse $DE00 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 ($DE00), 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 ($DE01) schreiben
Der C64 empfängt ein Byte:
- der C64 liest das Control Register ($DE00), 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
Kommunikation des Arduino
Die Kommunikation zwischen Arduino und CPLD erfolgt über 11 Signal Leitungen:
- 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)
Funktion des CPLD
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)
Protokoll
Aus Sicht des C64
News
- 14.12.2021 -- erste Prototyp Platine bestellt --
Downloads
Links