Bascom-AVR

Kleiner Bascom AVR Kurs -
UART - RS-232 vom Mikrocontroller zum Computer

Hallo!

Ich habe an diesem Beitrag nicht durchgehend gearbeitet. Deshalb kann es sein, dass er evt. ein wenig auseinandergerissen wirkt. Hoffentlich bringe ich kein zu großes Kuddelmuddel rein. :-)

14.400 * 2 = 28.800
28.800 * 2 = 57.600
57.600 * 2 = 115.200
115.200 * 2 = 230.400
230.400 * 2 = 460.800
460.800 * 2 = 921.600
921.600 * 2 = 1.843.200
1.843.200 * 2 = 3.686.400
3.686.400 * 2 = 7.372.800
7.372.800 * 2 = 14.745.600

Du wirst dir jetzt vielleicht denken, dass der Gerold ausgeflippt ist und nicht mehr weiß wie er diesen Beitrag mit Content füllen soll. :-) Aber vielleicht kommen dir die fett geschriebenen Zahlen an der linken Seite bekannt vor. Es sind mögliche Geschwindigkeiten für COM-Verbindungen (auch RS-232 oder "Serielle Schnittstelle" genannt).

hyperterminal_baud_auswahl.gif

Auf der rechten Seite stehen, fett markiert, die möglichen Quarz-Frequenzen die idealerweise dafür verwendet werden, um genau diese Baudraten zu erreichen. Einzig durch das Teilen der Frequenz kommt man auf eine dieser Baudraten.

Die Geschwindigkeit von COM-Verbindungen gibt man in Bit/Sekunde oder Baud an. 14.400 Baud bedeutet, dass 14.400 Bit/Sekunden über die Leitung übertragen werden. Bei den üblichen Standardeinstellungen braucht man zum Übertragen von 8 Bit (1 Byte) genau 10 Bit. Es kommt ein Start-Bit und ein Stop-Bit dazu. Bei einer Geschwindigkeit von 14.400 Baud werden also 1.440 Byte die Sekunde über die Leitung gejagt. Bei einer Baudrate von 115.200 werden 11.520 Byte die Sekunde übermittelt.

So, jetzt habe ich genug wirres Zeug geschrieben. ;-) Es geht in diesem Beitrag darum, wie man Daten vom µC zum Computer übertragen kann. Als einfachste Möglichkeit steht auf dem Computer die RS-232-Schnittstelle zur Verfügung. Und viele der AVR-µController haben UART und USART eingebaut. UART steht für "Universal Asynchronous Receiver Transmitter" und USART steht für "Universal Synchronous/Asynchronous Receiver Transmitter". Das ist genau das was wir brauchen um uns über die RS-232-Schnittstelle mit dem Computer zu unterhalten. Siehe Wikipedia: http://de.wikipedia.org/wiki/UART

Verpackung der Daten

Ein Datenbyte wird verpackt: Zuerst kommt ein Startbit. Dann die Datenbits und optional ein Bit für die Parität (sehr selten) mit dazu. Zum Abschluss kommt noch ein Stopbit dran. So, oder ein wenig abgeändert, werden die Datenbits über die Leitung verschickt. Am anderen Ende werden die Datenbits wieder ausgepackt. Damit sich beide Gegenstellen verstehen, müssen sie sich an die ausgemachte Geschwindigkeit halten. Es nützt nichts, wenn eine Seite die Daten mit 115.200 Baud über die Leitung schickt wenn die andere Seite die Daten mit der Baudrate 4.800 erwartet. Da der Takt nicht über eine zusätzliche Leitung geschickt wird, bleiben beiden Seiten nur die Quarze um die Geschwindigkeit der Datenübertragung genau einzuhalten.

Der USART ist im ATmega8-Datenblatt das Kapitel "USART" gewidmet. Dort findet man genaue Angaben zu den möglichen Frame-Formaten (die Verpackung der Daten) und natürlich auch die optimalen Frequenzen für den µC.

Frequenzen und damit machbare Baudraten

Die Baudrate sollte sich aus der Quarz-Frequenz durch einfaches Teilen ermitteln lassen und wenn das nicht möglich ist, höchstens 2% von dieser abweichen.

Die idealen Frequenzen stehen im ATmega8-Datenblatt im Kapitel "Examples of Baud Rate Setting".

1 Mhz:
0,2% Abweichung: 2.400, 4.800
1,8432 Mhz:
fehlerfrei: 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 76.800, 115.200, 230.400 Baud
2 Mhz:
0,2% Abweichung: 2.400, 4.800, 9.600, 19.200 Baud
fehlerfrei: 250.000 Baud
3,6864 Mhz:
fehlerfrei: 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 76.800, 115.200, 230.400 Baud
4 Mhz:
0,2% Abweichung: 2.400, 4.800, 9.600, 38.400 Baud
fehlerfrei: 250.000, 500.000 Baud
7,3728 Mhz:
fehlerfrei: 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 76.800, 115.200, 230.400 Baud
8 Mhz:
0,2% Abweichung: 2.400, 4.800, 9.600, 19.200, 38.400, 76.800 Baud
fehlerfrei: 250.000, 500.000, 1.000.000 Baud
11,0592 Mhz:
fehlerfrei: 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 76.800, 115.200, 230.400 Baud
14,7456 Mhz:
fehlerfrei: 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 76.800, 115.200, 230.400 Baud
16 Mhz:
0,1% bis 0,2% Abweichung: 4.800, 9.600, 14.400, 19.200, 38.400, 76.800 Baud
fehlerfrei: 2.400, 250.000, 500.000, 1.000.000 Baud
18,432 Mhz:
fehlerfrei: 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 38.400, 57.600, 76.800, 115.200, 230.400 Baud
20 Mhz:
-0,2% bis 0,2% Abweichung: 9.600, 14.400, 19.200, 28.800, 38.400 Baud
fehlerfrei: 2.400, 4.800, 250.000, 500.000 Baud

Wie man sieht, ist 4.800 Baud überall mit dabei. Auch bei 1 Mhz, der Grundeinstellung des ATmega8. Deshalb verwende ich für zeitunkritische Datenübertragungen gerne 4.800 Baud. Erst wenn ich mehr Geschwindigkeit brauche (was sehr selten ist) kümmere ich mich um den richtigen Quarz.

Spannung

Also, jetzt weißt du schon mal, dass die Geschwindigkeit für die Datenübertragung sehr wichtig ist. Jetzt kommt noch ein Fallstrick mit dazu -- die Spannung. Die UART des ATmega8 arbeitet mit der für diesen µC üblichen Spannung. Das ist im Normalfall 5 Volt. Ein LOW entspricht 0 Volt und ein HIGH entspricht 5 Volt. Natürlich kommt das auch auf die verwendete Versorgungsspannung an, aber ich gehe hier der Einfachheit halber von 5 Volt aus.

Die in den Computer eingebaute RS-232-Schnittstelle arbeitet nicht mit 0 und 5 Volt, sondern dort üblicherweise mit -12 bis +12 Volt. Genauer gesagt: -3 bis -25 Volt stellen ein HIGH dar und +3 bis +25 Volt stellen ein LOW dar. Es ist also nicht nur ein Spannungsunterschied, sondern auch noch ein Verdrehen von HIGH und LOW. Man setzt deshalb meist einen Pegelwandler (ein IC) zwischen den Computer und den AVR-µController. Oft wird dafür ein MAX232 eingesetzt. Das ist ein IC mit 16 Pins der die Spannungen anpasst und gleichzeitig noch invertiert. Auf den meisten Evaluations-Boards ist genau dafür so ein MAX232 mit drauf. Die billigeren MAX232 arbeiten mit vier Elkos und die etwas teureren MAX232-Exemplare arbeiten mit kleineren 100 nF Kondensatoren.

Leitungen/Anschlüsse

Einfache Verbindungen in beide Richtungen können schon mit drei Leitungen aufgebaut werden. Braucht man nur Daten in eine Richtung zu schicken, genügen sogar schon zwei Leitungen.

Computer        µC
===================
TX  --------->  RX
RX  <---------  TX
GND ----------  GND

Interessante Seiten zu diesem Thema:

Programm auf dem Mikrocontroller

Bei vielen Programmiersprachen ist es üblich, mit dem Befehl PRINT etwas in eine Konsole zu schreiben bzw. auf dem Bildschirm anzuzeigen. Bei Bascom ist das anders. Ein PRINT gibt nichts in irgendeiner Konsole aus, sondern schickt die Daten über die UART. Wenn man also einen ATmega8 über einen MAX232 mit dem Computer verbindet und im Programm PRINT "Hallo" schreibt, dann kann man den Text "Hallo" mit jedem beliebigen Terminalprogramm empfangen und anzeigen lassen. Der ATmega8 schickt die Daten über den TXD-Pin (PD1). Dabei wird standardmäßig ein Startbit, ein Stopbit und kein Paritätsbit verwendet. Und üblicherweise werden 8 Datenbits damit verschickt.

Die Geschwindigkeit der Datenübertragung wird im Programm mit $baud eingestellt. Dieses einfache Programm schickt den Text "Hallo" über die UART und beendet sich danach:

$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 4800

Print "Hallo"

End

Da die mit den Fuse-Bits eingestellte Taktfrequenz des ATmega8 bei mir immer noch 1 Mhz ist, wird Bascom mit $CRYSTAL = 1000000 auf diese Frequenz hingewiesen. Falls du eine andere Taktfrequenz eingestellt hast, musst du $CRYSTAL natürlich anpassen. Bascom kann von sich aus nicht feststellen, wie schnell der µC getaktet ist. Aber um die Übertragungsgeschwindigkeit genau einhalten zu können, muss Bascom darüber bescheid wissen.

Mit $BAUD = 4800 gibt man die Übertragungsgeschwindigkeit an. Und das war es auch schon. Mehr ist nicht einzustellen. Ab jetzt wird jeder PRINT-Befehl die Daten über die UART raus schicken. Wenn du bei deinen Tests nur Datenmüll empfängst, dann liegt das zu 99% an einer falschen Einstellung bei $CRYSTAL oder $BAUD.

Programm auf dem Computer

Als Gegenstelle kann man z.B. das mit Windows mitgelieferte Hyperterminal verwenden. Die Einstellungen, um die Daten vom ATmega8 empfangen zu können, sehen so aus:

  • COM1 bis COM4 (je nach verwendeter COM-Schnittstelle)
  • Bits pro Sekunde: 4800
  • Datenbits: 8
  • Parität: Keine
  • Stoppbits: 1
  • Flusssteuerung: kein
hyperterminal_einstellungen.gif

Natürlich kannst du jedes beliebige Terminalprogramm dafür verwenden. Auch das mit Bascom mitgelieferte Terminalprogramm. Dieses lässt sich in Bascom über das Menü "Werkzeuge/Terminal Emulator" aufrufen. Im Terminal-Fenster kommt man über das Menü "Terminal/Settings" zu den Einstellungen. Allerdings ist es nicht sehr zuverlässig. Es ist bei mir schon oft vorgekommen, dass es Daten nicht angezeigt hat, nur weil man vorher den Inhalt des Terminalfensters gelöscht hat. Also wenn du Daten erwartest, diese aber nicht angezeigt kriegst, dann könnte das am in Bascom eingebauten Terminalprogramm liegen. Verwende in diesem Fall ein anderes Terminalprogramm für den Empfang der Daten.

Das war jetzt mal die eine Richtung, vom µC zum Computer. Über die andere Richtung schreibe ich beim nächsten mal. :-)


mfg Gerold :-)



Den zugehörigen Original-Beitrag findest du im Loetstelle-Forum.