Hier soll nun kurz die Software beschrieben werden, über die ein Windows PC mit den Busteilnehmern über RS-485 kommuniziert. Es wurde das freie und weit verbreitete Modbus-RTU-Protokoll verwendet. Es ist gut dokumentiert, wegen Parity und 16-bit CRC hinreichend fehlerresistent und es gibt mit QModMaster ein freies Windows-Programm, das bei der Implementierung und Fehlersuche sehr hilfreich ist. Sowohl für den Windows-PC wie auch für das Arduino Biotop gibt es fertige Software.
Vorbemerkungen
Mit Arduino habe ich selbst nichts zu tun, einfach weil es das noch nicht gab, als ich zum erstenmal mit Atmel Bausteinen gearbeitet habe. Gelegentlich werde ich mir das mal anschauen. Die Modbus-Bibliothek für Windows habe ich mir einen halben Tag lang angeschaut und sie nicht zum Laufen bekommen. Sie ist sicher gut und kann alles, aber die paar Funktionen die ich brauche, habe ich dann doch selber geschrieben. Das schien mir schneller zu gehen, zumal die Funktionen auf der Gegenseite, dem Atmel Baustein, schon fertig war und sich nicht grundsätzlich unterscheidet. Damit ist nun die komplette Software sowohl auf der Host- wie auf der Device-Seite selbstgeschrieben und kann hier ohne Einschränkungen im Quelltext veröffentlicht werden:
Quelltext der Device-Software für den ATMEGA644PU
Wer will, kann beides gerne uneingeschränkt weiterbenutzen, eine Garantie für die fehlerfreie Funktion gibt’s natürlich nicht. Es sind sicherlich hier und da noch Fehler eingebaut. Außerdem ist nur ein Subset des Modbus-Protokolls implementiert, auch die eine oder andere Funktion, die in der Spec als „mandatory“ bezeichnet wird, ist nicht vorhanden (z.T. implementiert, aber auskommentiert da ungetestet).
Als Entwicklungsumgebung für Atmel verwende ich „Atmel Studio 7.0“, für Windows „VS Express 2013“. Beide Versionen sind etwas älter, Atmel gehört inzwischen zu Microchip, und von VS Express gibt es neuere Versionen, die aber nicht mehr mit Windows 7 laufen, sondern Windows 10 benötigen. Sollte ich jemals auf Win 10 umsteigen, werde ich mir eine neuere Version besorgen. Es gibt im Moment für mich keinen Grund zum Umsteigen.
Beide Programme sind sehr spezifisch für meinen Anwendungsfall geschrieben, daher habe ich auch keine ausführbare Datei beigefügt. Die Quelltexte sollen als Muster dienen, wie man es machen kann, aber nicht muß. Das Windows Programm mag gleichzeitig als Beispiel dienen, wie man die serielle Schnittstelle mit Windows-Funktionen bedient.
Alle Programme sind in ANSI‑C geschrieben, der ATMEGA nutzt ein paar winzige Assembler-Funktionen. Für Windows wird lediglich das Win32-API verwendet und ResEdit als Ressourcen Editor, weil die kostenlose Version von VS Express zumindest bis 2013 keinen Ressourcen Editor dabei hatte.
Host-Software
Ganz phantasielos habe ich die Host-Software SerCom genannt. Da zur Zeit nur der Antennenumschalter angeschlossen ist, ist dies der erste Tab, der nach dem Start angezeigt wird:

Hier wird lediglich eine der bis zu sechs Antennen ausgewählt. Die Namen sind in der Registry konfigurierbar und oben nur Beispiel ohne reale Bedeutung. Die momentan aktive Antenne wird mit dem Icon angezeigt, nur eine kann zu einem Zeitpunkt aktiv sein. Port Status ist eigentlich eine verzichtbare Diagnosemeldung. Hier wird der physikalische Status des Ports A angezeigt, der die Relais ansteuert. Die beiden Tabs „Rotor“ und „Antennentuner“ sind leer und hier nur Platzhalter für zukünftige Steuerungen, die am selben Bus hängen sollen.
Mit dem Config-Tab wird einer der Busteilnehmer konfiguriert:

Beim Start ohne Parameter werden hier die Konfigurationsdaten des PCs und des ausgewählten Devices angezeigt, also Baudrate, Device ID und verwendeter COM-Port. Wird SerComm mit dem Paramter „-c“ gestartet, läuft es im Konfigurationsmodus und die hier dunkel geschalteten Felder werden weiß und können geändert werden. In diesem Tab wird ein Zähler gezeigt, der angibt, wie oft das EEPROM programmiert wurde, denn die Anzahl der Programmierzyklen ist endlich (allerdings werden mindestens 100k-Zyklen garantiert).
Auch eine Uhr ist implementiert, deren Datum und Uhrzeit hier gesetzt und ausgelesen werden können. Mit dem Wert bei „RTC correction“ kann im Config-Modus ein Korrekturwert eingegeben werden, mit dem eine Frequenzabweichung des Quarzes für die Uhrzeit kompensiert wird. Mit „Restart Device“ wird auf dem Device ein Watchdog Reset provoziert, also ein echter Hardware-Reset. „Refresh“ liest die angezeigten Daten erneut aus dem Device aus.
Der Diagnose-Tab zeigt einige Daten an, die etwas über den Gesundheitszustand des Devices aussagen:

Zunächst wird der Typ des Moduls, seine Taktfrequenz und die Version der implementierten Software angezeigt. Verschiedene Zähler zeigen dann die Anzahl der unterschiedlichen Resets, die Anzahl fehlerfrei empfangener eigener und fremder Nachrichten und die Anzahl von Kommunikationsfehlern an. Auch die Versorgungsspannung und die Temperatur auf der Device-Seite werden angezeigt. Trotz des nur etwa 30mA großen Versorgungsstroms erwärmt sich das Board merklich. Nunja, bei 12V sind es ja auch immerhin 360 mW. Der Temperatursensor (TMP275) hat übrigens eine Genauigkeit von 0.5 K und 1⁄16 K Auflösung. Daß drei Stellen hinter dem Komma angezeigt werden, deutet eine höhere Genauigkeit an.
Außerdem werden die Namen und Zeitstempel der Quelldateien und der Zeitpunkt des Compilerlaufs angezeigt. Auch hier lässt sich mit der Refresh-Taste der angezeigte Inhalt erneuern. Durch Anklicken der „Continuous“ Checkbox wird der Refresh dauerhaft ausgeführt. Das ist für Dauertests hilfreich. Ein über Nacht ausgeführter Dauertest brachte keinen einzigen Fehler hervor. Daß die Fehlerzähler funktionieren, zeigte allerdings ein erster Test mit 100 W HF auf dem Antennenumschalter.
Seit einigen Tagen und Nächten ist die Software im Einsatz und hat sich bewährt. Für das Interface zwischen dem USB-RS485-Wandler und dem Bus habe ich auch zum Einkoppeln der 12V Versorgungsspannung eine kleine Box gebaut:

Sie fügt nochmal kleine Tiefpässe in die Kommunikationsleitung ein und entstört die Versorgungsspannung eines externen Steckernetzteils. Das Gehäuse ist übrigens ein sehr preiswertes Eurobox-Gehäuse, das ich auch für andere Dinge gerne verwende.