Tips für PICs 16: Telegramm-Decodierung
Bei einem Gespräch anläßlich unserer "Tage der Modelleisenbahn" kam das Thema
"Gleichlauf bei verschiedenen PICs" auf. Es ging darum, ob es machbar wäre, zwischen zwei
verschiedenen PICs serielle Telegramme zu übertragen, wenn sie nur mit ihren internen Taktgebern getrieben
würden, oder ob es notwendig sei, sie mit externen Quarzen extrem genau zu takten.
Oder, anders ausgedrückt: wie genau muß ein Synchronlauf sein?
Erschwerend kam noch hinzu, daß die Übertragung per Infrarot in ein fahrendes Auto geschehen sollte,
wobei die Position des Autos undefiniert sein sollte; mit der Folge, daß verstümmelte Telegramme, bei
denen Anfang oder Ende nicht übertragen wurden, erkannt und ausgesondert werden mußten.
Wenn so ein Telegramm 24 bit lang sein soll, dann wird bei einer synchronen Übertragung eine Takt-Abweichung
von 1% schon sehr problematisch.
Also muß die Forderung nach synchroner Übertragung fallen gelassen werden. Wir haben einen Weg gefunden,
auf einfache Weise alle genannten Forderungen zu erfüllen und ein System zu bauen, das nun schon jahrelang
störungsfrei läuft. Dabei ist ein komplettes Bit immer 200µs lang; eine "0" hat eine
Pulslänge von 67µs, eine "1" eine von 133µs.
Ruhe:
Nichts passiert, alle PICs (Sender und Empfänger) werkeln vor sich hin und machen andere Aufgaben.
Telegramm-Beginn:
Vom Empfänger-Baustein wird ein Bit empfangen. Dies wird an seiner ansteigenden Flanke erkannt und in der ISR
(interrupt service routine) bearbeitet. Es wird eine Kennung "Bit gekommen" gesetzt und ein Timer
aufgezogen, mehr nicht. Der Timer meldet sich in der ISR nach 100µs (Mitte zwischen 0 und 1) zurück. Falls
das auslösende Bit immer noch "da" ist, wird eine "1" in ein Schieberegister gesetzt,
ansonsten eine 0. Und - die Kennung "Bit gekommen" wird wieder gelöscht. Wozu dies dient, s. weiter
unten. Ansonsten wird nichts weiter getan.
Die beschriebene Funktion benötigt nur wenige Befehle. Sie wird bei jedem neu kommenden Telegramm-Bit
durchlaufen.
Telegramm-Ende:
Dies wird wie folgt erkannt: Falls der Timer (der ja nicht rückgesetzt wurde!!) sich nach einem kompletten
Durchlauf zum zweiten Mal meldet, wird geprüft, ob die Kennung "Bit gekommen" aktiv ist (dies haben
wir oben in der Beschreibung weggelassen, um Sie beim Lesen nicht zu verwirren). Falls diese also nicht aktiv ist,
ist der Auslöser des Timers nicht eine neu gekommene Bit-Flanke, sondern er selber. Das wird als das Ende
des Telegramms interpretiert. Wenn der Timer mit 2µs getaktet wird, wird das Ende also 512µs nach
Abtasten des letzten Bits erkannt. Dies entspricht in etwa der 2,5-fachen Länge eines normalen Bits, ist also
recht zügig.
Das, was empfangen wurde, steht in dem o.g. Schieberegister, das nun normal ausgewertet wird. Fehlende Bits werden
hierbei sofort erkannt.
Unser Telegramm ist 24 bit lang, mit nur 8 bit Nutzdaten. Es wird alle 100ms wiederholt; das entspricht einer
Fahrweglänge des Autos von max. 16 mm.
Dadurch, daß der Empfänger-PIC bei jeder steigenden Bitflanke neu angestoßen wird, und weil der
Abtast-Zeitpunkt sehr weit von den beiden genormten Bit-Abfall-Flanken entfernt ist, ist eine Frequenzabweichung von
10, vielleicht sogar 20%, unproblematisch. Das ist sehr weit außerhalb der Fertigungstoleranzen. Eine
Quarz-Taktung ist also unnötig. Auch aus diesem Grunde wird der Einbau des Empfängers sogar in einen
H0-Bulli gelingen.
Für weitere Fragen stehen gern zur Verfügung:
- der MEC; Besichtigung und Fachsimpelei z.B. an unseren "Club-Abenden"
- der Autor: Hans Peter Kastner
erstellt am 01.07.2020, Version vom 10.10.2022
Copyright © 2020 - 2022 by Modelleisenbahnclub Castrop-Rauxel 1987 e.V.