AVR heiss-kalt

Auf besonderen Wunsch präsentiere ich hier in Kürze eine kleine Beispielapplikation rund um einen ATmega16 Microcontroller von Atmel. Die Schaltung umfasst neben dem Controller mit dem standardisierten 10-poligen Pfostenverbinder zur Programmierung des Controllers innerhalb der Schaltung einen RS485-Transceiver vom Typ LTC1487 (Linear Technology) sowie beispielhaft einen von bis zu acht möglichen Temperatursensoren des Typs LM35 (National Semiconductors). Zur Digitalisierung der vom Sensor gelieferten Spannung im Bereich von 20mV..1,5V entsprechend einem Temperaturbereich von 2°C bis 150°C wird der im ATmega integrierte 10-bit-A/D-Umsetzer benutzt, der mit der integrierten 2,56V-Referenz eine Auflösung von ziemlich genau 2,5mV/bit und damit 0,25°C/bit ermöglicht. Dabei soll nicht verschwiegen werden, dass die Präzision des Sensors und vor allem der integrierten Referenz bei weitem nicht groß genug ist, um eine absolute Genauigkeit von 0,25°C zu erreichen. Die Außenbeschaltung des Sensors ist dem Datenblatt desselben entnommen und soll Stabilität bei Verwendung längerer Zuleitungen garantieren, der RC-Tiefpass am Eingang des ATmega dient dem Schutz vor hochfrequenten Störungen und Überspannungen innerhalb eines gewissen Rahmens.

Die Kommunikation mit dem Microcontroller erfolgt einem Halbduplex-Protokoll folgend über den RS485-Bus. Hierzu sendet der als Master fungierende PC zunächst die Adresse des Moduls, das abgefragt werden soll. Anschliessend könnte z.B. die Nummer des Sensors, dessen Wert gewünscht ist, übertragen werden; dies ist in dem Beispiel-Code allerdings noch nicht implementiert, die Nummer ist hier immer 00 und es wird grundsätzlich der 1. Kanal abgefragt. Den Abschluss jedes Befehls bildet ein Carriage Return (CR, 13d=0Dh). Nach einer bestimmten Wartezeit wird der Bus vom RS485-Adapter des PC freigegeben und das angesprochene Modul darf mit der Übertragung seines Messwertes beginnen. Dazu sendet es im Beispiel wieder seine Adresse, gefolgt von der Sensornummer, hier also 00, und dem gewandelten Wert sowie dem abeschliessenden Carriage Return. Hierzu wird dem Modul eine begrenzte Zeit eingeräumt, um sicherzustellen, dass der Master nicht für alle Zeiten wartet, wenn ein Modul aus welchem Grund auch immer einmak nicht antwortet. Damit es hierbei zu keinen Kollisionen kommen kann, darf auch ein adressiertes Modul nach Ablauf dieser Zeit nicht mehr senden. Ein Beispiel, das Modul hat wie im Sourcecode definiert die Adresse 02, der Befehl zum Abfragen des 1. und derzeit einzigen ausgewerteten Kanals lautet 00.

PC sendet:
02 00 <CR>
Modul dekodiert Daten, erkennt seine Adresse, holt sich den Wert vom A/D-Umsetzer und antwortet:
02 00 122 <CR>

Was soviel heisst wie: Meine (Modul 02) Antwort auf Befehl 00 ist 122, nach Vereinbarung also 122 Inkremente à 0,25°C über Null und somit +30,5°C.

Schliesslich nun die entscheidenden Dateien zum Download

atmega_rs485.pdf - der Schaltplan
Achtung! Für die Verwendung der internen 2,56V-Referenz darf Pin 29 (AREF) keinesfalls mit +5V verbunden werden, sondern muss entgegen dem Schaltplan über einen 100nF-Kondensator mit Masse verbunden werden!

atmega_rs485.c - der Quelltext für den ATmega16 in C, kompilierbar mit dem gcc für AVR, z.B. dem WinAVR-Paket.

Ich möchte nochmals anmerken, dass diese Dokumentation nur ein Beispiel darstellt. Ich habe weder die Schaltung noch den Quelltext in dieser Form getestet, beide wurden für diesen Artikel auf die Schnelle angepasst und gehören eigentlich zu einem sehr viel umfangreicheren Projekt.