Ich hab mir für ein aktuelles Projekt (Nachlaufsteuerung für mein
Autoradio) eine Ansteuerung für ein Opel TID gebastelt.
Das ganze läuft jetzt seit einer Woche in meinem Astra F problemlos (bis
auf ein getoastetes Relais :P.
Das Nachlaufprojekt an sich ist aufgrund einiger last-minute Anpassungen
ein ziemlicher Spagetticode und deswegen nicht enthalten. Der "Treiber"
für das TID ist aber noch relativ sauber.
Das timing hab ich hier erklärt gefunden:
http://wiki.carluccio.de/index.php/Opel_TID und selbst in C nachgebaut.
Nachdem das ursprünglich nicht für die Öffentlichkeit gedacht war hab
ich mit Kommis bisschen gegeizt, aber die Funktionalität ist ja eher
trivial (I²C mit bisschen MRQ Gewackel).
In der header-datei muss man eigtl. nur auswählen ob man ein 8 oder 10
stelliges TID hat (testen konnte ich aber nur mit 8, das andere ist nur
aus der Doku geholt, aber der Unterschied ist minimal) und die Pins
definieren.
Das Interface zur main() besteht aus 6 Funktionen:
tidOn() schaltet das TID in "Radiomodus" (AA an), durchläuft die
erforderlichen Fehlersuche-Schritte (an den Pins-rumwackeln siehe
carluccio) und führt einmal tidRefresh() aus, damit das Display mit
sinnvollen Daten gefüllt ist.
tidDate() schaltet nur die "Zündung" für das TID ein und bringt es so
dazu das Datum anzuzeigen.
tidOff() macht "Zündung" und "AA" aus, damit geht das TID in den
normalen Schlafmodus.
tidDisplay() erwartet einen (null terminierten) String und ein 2/3 Byte
(je nachdem ob 8 oder 10 Stellen) großes Array in dem die Bits
entsprechend der Erklärung auf der carluccio Seite gesetzt sind. Die
Parität wird (bei Bedarf) selbsttätig vervollständigt. Hier sei gesagt,
dass mein 8er TID nur Großbuchstaben anzeigt, Kleinbuchstaben
ercheinen als leer Stelle.
tidRefresh() schreibt den in dem Buffer gelagerten Datensatz (nochmal)
in das TID rein. Das will nämlich alle paar Sekunden neue Daten haben
(fragt mit nem low-puls an MRQ auch nach). Man kann (wie ich in meiner
Radio-Steuerung) auch MRQ ignorieren und einfach oft genug neu
schreiben.
Der Buffer ist für mein 8 stelliges TID mit "WELCOME" vorinitialisiert,
wenn das jemand anpasst (speziell auch für 10 Stellen), dann muss
derjenige die parität selber berechnen (die wird nur einmalig beim
Eintragen via tidDisplay() berechnet) und die bits schieben (mach sonst
auch das tidDisplay() für den user).
Die Funktionen sind NICHT gegen Interrupts oder dergleichen geschützt,
also aufpassen wenn man in nem Interrupt das refresh macht (dass gibt
dann richtig lustige verquerungen). Wer will kann ja noch ne semaphore
um die Funktionen basteln.
Ich hab in meinem Projekt den Watchdog an, der zerrt dann den µC aus
einem potentiellen dead-lock raus.
Wenn jemand Fehler in dem Code findet, dann darf er die gerne
korrigieren und den neuen Code wieder hier posten. Bei mir funktioniert
der Code auf jeden Fall mit meinem acht-stelligen TID zuverlässig.