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.

1+2 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.

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

Valid HTML 4.01!