POCSAG Decoder AVR

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Dane

Dieser Artikel nimmt am Artikelwettbewerb 2012/2013 teil.

Beachte
Der Funkscanner darf nicht auf Frequenzen der BOS-Kanäle betrieben werden. Der Artikel bezieht sich deshalb nicht auf die Dekodierung von Alarmierungen und darf dazu auch nicht verwendet werden!

Pager bsp.jpg

Einleitung

Das vorliegende Projekt dient der Dekodierung von drahtlos übermittelten Nachrichten des Pager Netzes. Dabei handelt es sich um eine digitale Übermittlung nach dem POCSAG Format. In Deutschland gibt es seit März 1989 mit Cityruf einen bundesweit verfügbaren Pagerdienst. Im Laufe der Zeit kamen weitere Anbieter dieser Technik hinzu. Durch die rasante Verbreitung von Mobiltelefonen und des SMS-Dienstes wurden diese Benachrichtigungsdienste aber weit in den Hintergrund gedrängt. Heutzutage werden die Pagerdienste vor allem von Personen genutzt, die ständig erreichbar sein müssen, wie z.B. den Rettungsdiensten, Polizei, Feuerwehr, Winterdienst und Bereitschaftstechniker. Dies ist vor allem dem Vorteil zuzuschreiben, dass der Empfang durch die verwendeten Frequenzen in Gebäuden deutlich besser ist. Auch werden die Pager immer stärker im Amateurfunkbereich verwendet. Dabei werden die kommerziellen Funkmeldeempfänger modifiziert und stehen so für den Nachrichtenempfang im 70cm-Band bereit. Das Projekt, welches in diesem Artikel beschrieben wird, kann z.B. dazu verwendet werden, die empfangenen Nachrichten an einen Handynutzer per SMS weiterzuleiten. Auch sind zahlreiche andere Verwendungsmöglichkeiten denkbar, angefangen von einfachen akustischen und optischen Benachrichtigungen bis hin zu komplexeren Aktionen. Für den Nachrichtenempfang wird ein handelsüblicher Funkscanner benutzt. Dieser wird auf die Frequenz des Pagernetzes eingestellt und dann an die Mikrocontroller-Schaltung angeschlossen. Verwendet wird ein 8bit Mikrocontroller der Firma Atmel (Atmega), der die Dekodierung der empfangenen Funksignale übernimmt. Dabei ist das Programm in C verfasst, was das Verständnis und die eigene Anpassung sehr erleichtert. Schlussendlich kann an die Mikrocontroller-Schaltung weitere Peripherie angeschlossen werden, wie z.B. ein Handy zum Versenden von SMS oder LEDs. Es gibt bereits ähnliche Projekte im Internet zu finden. Dabei wird meist die Dekodierung per PC vorgenommen (Nachteil: PC muss ständig laufen). Außerdem sind Umsetzungen mit PIC Mikrocontroller in Assembler veröffentlicht.


Ziel des Artikels

Vorliegende Beschreibung soll zum Einen einen Überblick über das POCSAG-Protokolls geben. Zum Anderen zeigt es die Umsetzung einer Dekodierung mit Hilfe eines AVR-Mikrocontrollers (Atmel Atmega) und der Programmiersprache C.


Grundlegendes zur Hardware

Die Anbindung an das Funknetz geschieht mit einem normalen Funkscanner. Um die Funksignale gut auswerten zu können, besitzen viele Scanner einen sog. Discriminator-Ausgang. Dabei werden die Signale direkt von der Empfangseinheit ausgegeben, d.h. sie werden nicht durch Filter beeinflusst. Bei vielen Funkscannern, die diesen Ausgang von Haus aus nicht besitzen, kann dieser leicht selber nachgerüstet werden. Dazu finden sich im Internet Anleitungen.

Verwendet wird ein Atmega324P, da dieser hardwaremäßig 2 UART besitzt und somit die Entwicklung etwas vereinfacht wurde (testweises Mitloggen). Eine Umsetzung auf anderen Mikrocontrollern dieser Familie sollte aber, mit ein paar kleineren Anpassungen, problemlos möglich sein. An den ersten UART ist ein Siemens M35 Handy angeschlossen, über das SMS gesendet werden.

Aufbau allgemein.jpg

Schaltplan

Nachfolgend werden die 3 Teile des Schaltplans näher beschrieben.

Teil 1 - Mikrocontroller:

Sch mc.jpg

Der Mikrocontroller besitzt zum Einen die Grundbeschaltung mit 18,432 MHz Quarz. Des Weiteren ist eine Buchse für die ISP-Schnittstelle vorgesehen, worüber der Controller in der Schaltung geflasht werden kann. Für zukünftige Zwecke wurde auch eine Buchsenleiste mit 6 Pins angelegt, um z.B. noch LEDs anzuschließen. Schlussendlich sind noch die Pins der UARTs herausgelegt. Der erste UART dient der Kommunikation mit dem Handy. Die serielle Schnittstelle läuft dabei bei 3V-TTL Pegel, deshalb sind zwei 75 Ohm Widerstände und eine Z-Diode eingebaut. Die Versorgung des Handys erfolgt mit 5V. Dabei wurde der Handyakku entfernt und die 5V- und Masseleitung direkt an die Kontakte im Akkufach des Handys angelötet (Akku entfernt). Dadurch ist ein Dauerbetrieb über das Netzteil möglich.

Teil 2 - Spannungsversorgung:

Sch vcc.jpg

Für die Spannungsversorgung wird ein 12V Netzteil benutzt. Dies entspricht der benötigten Spannung für den Funkscanner. Zu diesem Zweck wird die Spannung einmal durchgeleitet. Des weiteren wird eine 5V Spannungsversorgung für den µController benötigt. Diese wird durch Verwendung eines Standard-Spannungsreglers (L7805) bereitgestellt.

Teil 3 - Anbindung Funkscanner

Sch scanner.jpg

Der Discriminator-Ausgang des Funkscanners wird zuerst über eine RC-Parallelschaltung geleitet. Danach wird, mittels Schmitt-Trigger, das Wellensignal des Funkscanners in ein Rechtecksignal umgeformt. Dabei muss mit dem Poti R2 die passende Einstellung gefunden werden, um die Signale gut erkennen zu können. Das Rechtecksignal, welches die digitale Signale darstellt, wird an einen Pin (T0) des Mikrocontrollers gelegt. Schwierig gestaltet sich vor allem die Einstellung des Potis am Schmitt-Trigger. Dieses Problem kann aber mit einem Oszilloskop gelöst werden. Ansonsten hilft nur das Herumspielen mit der Einstellung. Um die akustischen Signale besser mit dem Ausgangspegel des Schmitt-Triggers abgleichen zu können, kann man auch eine LED dazwischen schalten.


POCSAG Protokoll

Bei der Funkübertragung des Pager-Netzes wird das sog. POCSAG-Protokoll (entwickelt von der Post Office Code Standard Advisory Group) verwendet. Sehr gut zusammengefasst ist dies in dieser PDF-Datei (ab Seite 5). Folgend wird das Augenmerk auf die alphanumerische Übertragung, also mit Text, gelegt. Zur Info: 0 bedeutet in der Beschreibung Low-Pegel und 1 dementsprechend High-Pegel (Im Datenblatt des verwendeten Mikrocontrollers stehen die entsprechend benötigten Voltangaben).

Pocsag1.jpg

Die Übertragung beginnt immer mit einer Präambel [A]. Durch abwechselndes Senden von 1-0-Folgen kann der Empfänger (hier der Mikrocontroller) zum Einen den Start einer Übertragung erkennen, zum Anderen aber auch die genaue Baudrate ermitteln. Dies verbessert die Erkennungsrate. Die Präambel hat eine Mindestlänge von 576 Bits. Danach folgt die eigentliche Übermittlung. Dabei wird diese in sog. „Batch“ geteilt [B und C]. Ein Batch ist wiederum aus 9 „Frames“ [D] aufgebaut, wobei das erste halbe Frame („Codewort“) ein Synchronisationswort [SC] ist. Jedes Codewort (halbe Frame) besteht aus 32 Bits, mit dem höchstwertigen Bit zu Beginn.


Synchronisationswort:

Scw.jpg


Allgemein ist ein Codewort wie folgt aufgebaut:

Pocsag2.jpg

Dabei signalisiert das erste Bit [Flagbit H], ob die Daten des Codeworts (Bit 2-21) entweder die Adresse des Pagers/Alarmgeber, oder eine Meldung darstellen. Ist das Flagbit = 0, so stellen die folgenden 18 Bits [I] die Adresse dar. Die nächsten 2 Bits sind die Funktionsbits, mit denen sich 4 verschiedene Meldungsarten signalisieren lassen. Bei einem Flagbit = 1 stellen die folgenden 20 Bits [M] die Meldung dar, bzw. einen Teil davon. Anschließend an die Daten folgen noch Prüfbits [K] und ein Bit für gerade Parität. Bisher wird in diesem Projekt nur die Parität bei einem Codewort mit Adresse geprüft. Jedoch zeigte die Praxis, dass dies meist schon völlig ausreicht.

Bei einer Übertragung sollte eigentlich immer ein Codewort mit Adresse ausgesendet werden und danach folgend Codeworte mit der Meldung für diese Adresse. Die Meldung ist im CCIT Alphabet No.5 codiert, 7 Bit stehen demnach für ein Zeichen. Bei den meisten Übertragungen reicht ein einzelner Batch nicht aus. In diesem Fall folgt ein weiterer Batch [C]. Wieder mit einem Synchronisationswort als erstes Codewort.


Software

Mein Anspruch war es, die Software des Mikrocontrollers in C zu verfassen. Gründe hierfür sind die bessere Verständlichkeit und die Vereinfachung, später weitere Funktionen hinzuzufügen.

Die Software ist in mehrere Teile untergliedert, die jeweils eine bestimmte Aufgabe besitzen. Diese Teile stellen im Programm C-Funktionen dar. Diese müssen dann nacheinander aufgerufen werden, jedoch nur wenn jede Funktion fehlerfrei abgearbeitet werden konnte. Zur Einhaltung dieser Abfolge wurde eine ISM (infinite state machine) eingeführt. Dabei wird eine Zählvariable ("state") des Typs Integer verwendet, welche den Zustand des Programms und somit die Aufgabe kennzeichnet. Auch werden damit programmintern weitere Details zur erkannten Nachricht und Ähnliches signalisiert.

Erkennung Baudrate

Sobald eine 1 anliegt, beginnt die Erkennung der Präambel und auch der Baudrate. Dabei wird 30 mal die Zeit eines High-Pegels mittels Timer gemessen. Wenn eine dieser Zeiten von einem bestimmten Sollwert abweicht, beginnt alles wieder von vorne. Von Vorteil ist hier natürlich, dass man normalerweise die Baudrate der Übertragung kennt. Die Zeiten der 30 High-Bits werden am Schluss zusammenaddiert und der Durchschnitt gebildet. Damit erhält man sehr genaue Abtastzeitpunkte. Zur Berechnung des Werts der Konstante „counterwert“ muss die verwendete Taktrate (in Hz) durch die Baudrate geteilt werden.

Erkennung Ende der Präambel

Hat man die Baudrate ermittelt, wird ein Timer in der Mitte eines High-Bits mit der ermittelten Abtastzeit gestartet. Dieser löst immer in der Mitte eines Bits ein Interrupt aus. Das restliche Programm findet dann zum Großteil in diesem Interrupt statt. Das Ende der Präambel kann dadurch erkannt werden, dass die Präambel mit einem Low-Bit endet und das folgende Synchronisationswort mit einem Low-Bit startet. Demnach wird die Abfolge von 1-0-Bits durch eine 0-0-Bitfolge beendet.

Erkennung Synchronisationswort

Nachdem das Ende der Präambel erkannt wurde, können die nachfolgenden Bits auf die Übereinstimmung mit dem Soll-Synchronisationswort geprüft werden. Das erste Bit wird dabei unterschlagen, da dieses ja bereits bei der Erkennung des Präambelendes verwendet wurde. Sollte ein Fehler festgestellt werden, wird die Zustandsvariable wieder zurückgesetzt und das Programm wartet auf die nächste Präambel. Somit ist diese Übertragung komplett verloren.

Ermittlung Adresse

Als nächstes folgt normalerweise ein Codewort mit Adresse. Dabei ist wie schon erwähnt das erste Bit = 1. Die Adressbits können dann umgewandelt werden, ebenso die Funktionsbits. Die nachfolgenden Prüfbits werden abgezählt und übergangen. Somit ist man dann zu Beginn des nächsten Codeworts wieder zur Stelle. In dem vorliegenden Programm wird sogleich die ermittelte Adresse auf vorliegen einer bekannten Adresse abgeglichen. Dadurch werden nur Meldungen erfasst und umgewandelt, die wirklich von Interesse sind. Im Fall einer unbekannten Adresse, werden die folgenden Meldung-Codeworte übergangen.

Erfassung Meldung

Ist eine bekannte Adresse erkannt worden, folgt typischerweise ein oder mehrere Meldung-Codewörter. Dazu werden zuerst die kompletten Bits der folgenden Codewörter der Meldung erfasst. Diese können auch durch das Ende des aktuellen Batch und damit mit einem Synchronisationswort unterbrochen sein. Das Ende der Meldung ist entweder das Ende der Übertragung (mit dem Zeichen „EOT“ = 4) oder eine neue Adresse. Ist die Aufzeichnung der Bits abgeschlossen, muss daraus der Text generiert werden. Dazu werden immer 7 Bits abgeschnitten und dann rückwärts in ein Zeichen laut CCIP-Tabelle umgewandet. Diese Zeichen werden danach stellenweise in ein Char-Array geschrieben, welches am Schluss der Wandlung den Meldungstext darstellt.

Versenden SMS

Das verwendete Siemens M35 Handy kann über die serielle Schnittstelle angesteuert werden. Der Anschluss erfolgt am ersten UART (RXD0 und TXD0) des Atmega. Die Belegung der Handyschnittstellen kann z.B. auf www.nobbi.com gefunden werden. Beim verwendeten Handy kann eine SMS nur im PDU-Format per serieller Schnittstelle gesendet werden. Verwendet wird dazu vorhandene Routinen, die diesem Artikel entnommen und den eigenen Ansprüchen angepasst wurden. Der Sendefunktion kann der Meldungstext und die Empfänger-Handynummer übergeben werden. Beim Versand mehrerer SMS muss beim verwendeten Handy etwas zwischen den Funktionsaufrufen gewartet werden (ca. 5s), sonst werden nicht alle SMS gesendet.

Extras

Um die Versendung von SMS auf wirklich wichtige Meldungen einzuschränken, wurde nachfolgendes System eingebaut. Dabei sind die Meldungen der ersten Adresse immer in folgendem Aufbau zu senden:

Stichwortkürzel,Meldung

Das Programm wertet, bei Vorliegen einer Meldung dieser Adresse, die Angabe bis zum ersten Komma aus. Dadurch kann auf den Inhalt und damit auf die Wichtigkeit der Meldung geschlossen werden. Dieser Aufbau wird z.B. oft auch in ähnlicher Form bei der digitalen Alarmierung von Hilfskräften verwendet. Dieses Verfahren wird im vorliegenden Programm nur bei einer der Adressen verwendet. Dazu kommt noch die Auswertung der Funktionsbit, welche ebenfalls eine Priorisierung der Meldung zulassen.

Reload Sperre

In manchen Netzen werden Nachrichten mehrmals hintereinander gesendet. Auch kann es sein, dass sich der Empfänger in Reichweite von mehreren Sendestationen befindet, sodass die Nachricht kurz nacheinander von mehreren Sendern empfangen wird. Damit eine Nachricht nur einmal als SMS weitergeleitet wird, wird nach dem Senden einer Nachricht eine bestimmte Zeit gewartet, bevor die nächste Nachricht dekodiert werden kann. In naher Zukunft sollte diese Funktion umgebaut werden, sodass nur gleiche Nachrichten innerhalb einer bestimmten Zeit ignoriert werden.


Zusammenfassung

Das vorliegende Projekt erweist sich im praktischen Versuch bereits seit Oktober 2011 als sehr zuverlässig. Es sind natürlich weitere Funktionserweiterungen denkbar, die aber sehr einfach hinzugefügt werden können. Die Verwendung von C erwies sich als komfortabel, obwohl die Einhaltung der Zeiten erst nach mehreren Anläufen umgesetzt werden konnte. Jedoch gestaltet sich so der Quellcode verständlicher und die Weiterverwendung wird um einiges vereinfacht. Gegebenenfalls sollte noch die Fehlererkennung und möglicherweise Fehlerkorrektur mittels Prüfbits eingebaut werden. Die Dekodierungsrate ist auch stark von der Antenne und deren Ausrichtung abhängig. Mit einem Koax-Kabel lässt sich selber eine passende Antenne (sog. J-Pol Antenne) für den Funkscanner bauen.


Foto decoder.jpg


Quellcode

Datei:Pocsagdec.zip