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.