RS232 - Kommunikation zwischen PC und dem AVR
R S 2 3 2 - U E B E R T R A G U N G
--- Kommunikation zwischen PC und dem AVR ---
Vorwort:
Dieser Thread soll sich mit der Kommunikation zwischen dem AVR und einen PC ueber die RS232(serielle) Schnittstelle beschaeftigen.
In meinen letzten Thread wurde zum Schluss die FIFO-Funktion mit sehr, sehr viel Unterstuetzung von mare_crisium erarbeitet.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=51693
Diese soll mit als Grundlage dienen.
Auch hier soll verstaendlich erklaert und beschrieben werden, wie der AVR mit dem PC kommuniziert.
Habe einige Daten zusammen getragen... aber lanengst nicht alles.
Auch in diesem Thread hoffe ich wieder auf die tatkraeftige Unterstuetzung von mare_crisium.
Aber auch andere User koeennen bzw. sollen sich an daran beteiligen.
Hardwarevoraussetzung:
AVR arbeitet mit 5V Signalen
RS232 benutzt 12V Signale
Aus diesem Grund muss ein Pegelwandler eingesetzt werden.
Der Pegelwandler macht die 5V Signale des AVR RS232 konform(12V-Signale) und wandelt umgekehrt die Signale die ueber die RS232 kommen,
in fuer AVR verstaendliche 5V Signale um.
Pegelwandler 5V / 12V MAX232(oder Derivat)
Beim STK500 ist so ein Baustein auf der Entwicklerplatine vorhanden und nach aussen durch eine 9polige Buchse gefuehrt.
Bei anderen Platinen muss also auch ein Pegelwandler vorhanden sein, wenn man die RS232 Kommunikation nutzen moechte.
Oder man realisiert es extern ueber zusaetzliche Schaltung, der man die Signalleitungen des AVR zur Verfuegung stellt.
Nullmodemkabel oder serielles Kabel???
Nullmodem wird zwischen 2 PC(Master) verwendet.
Serielles Kabel verwendet man zwischen eine PC(Master) und einem Peripheriegeraet(Slave).
In unseren Fall also ein PC und ein Peripheriegeraet - > serielles Kabel.
Signalleitungen:
RXD und TXD - also Empfang und Senden reichen aus.
Aber eine Massleitung wird trotzdem benoetigt.( - der Pegel braucht ja ein Bezug)
PinEinstellung:
RXD (Empfang)
ist bei den vielen AtMega's PortD0
TXD (Senden)
ist bei den vielen AtMega's PortD1
Steht in der Spec des verwendeten Exemblars.
Anschlusseinstellungen:
hmmm ??? keine Ahnung
-------------
- Baudrate
- Datenbits
- Paritaet
- Stoppbits
- Protokoll
-------------
Handshake
Empfang
Senden
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
so, endlich: In den angehängten Dateien finden sich die Bestandteile des Testprogramms "SerialTest01_V01.asm" für den ATmega8515; wie alles zusammengehört sieht man an den includes am Ende.
Die Zerlegung in ein Hauptprogramm und drei Module folgt dem Konzept wiederverwendbarer Komponenten, das wir im Thread "Anfänger mit STK500 und Assembler" besprochen haben.
Das Testprogramm dient dazu die Programmkomponenten auszutesten, aus denen sich eine sehr einfache aber flexible Kommunikation über die USART-Schnittstelle des ATmega zusammenstellen lässt. Es geht erst einmal um das Grundgerüst; XON/XOFF usw. ist erst einmal nicht vorgesehen, lässt sich aber jederzeit nachrüsten. In den Beschreibungen zu den Modulen SERIAL_V01.asm und SERIALIF01_V01.asm habe ich das Konzept des Botschaftsaustausch ziemlich ausführlich (hoffentlich nicht zu kompliziert :oops: ) dargestellt.
Damit auch gleich ein Erfolgserlebnis winkt, habe ich die Sendefunktion soweit zusammengesteckt, dass beim Einschalten des STK500 der Programmname, in 46 HexChars codiert, an den PC gesendet wird. Hab's mit dem Simulator getestet und hoffe es klappt auch im echten Leben.
Die Empfangsfunktion habe ich nicht ausgearbeitet; etwas muss ja zu tun bleiben, denn: Selber programmieren macht schlau ;-) !
Ciao,
mare_crisium
EDIT: Das Hauptprogramm "SerialTest_V01.asm" und die Module "SERIAL_V01.asm" und "SERIALIF01_V01.asm" gelöscht, weil sie Fehler enthielten. Die korrigierten Dateien sind an meinen Post vom 13.06.2010, ca. 17:00 angefügt.
Liste der Anhänge anzeigen (Anzahl: 3)
robo_wolf,
ich habe doch noch einen ATmega8515 in meiner Kruschtelkiste gefunden und kann das Programm jetzt auch "in echt" testen. Der Fehler war schnell gefunden: In meinen eigenen Programmen verwende ich immer das Carry- und nicht das T-Flag, um Zustände zurückzumelden. Na ja, die Macht der Gewohnheit führt dann rasch zu Verwechselungsfehlern ;-).
Die korrigierten Versionen hänge ich hier an. Das FIFO-Modul "FIFO8_V07.asm" bleibt unverändert.
Dann drücken wir uns mal die Daumen für heute abend :-) !
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 2)
robo_wolf,
jau, jetzt hast Du's :-) !
Der nächste Schritt ist erstmal nur ganz klein: SERIAL_V03 hat jetzt eine Methode zum Einschalten des USART-Empfängers und ein ganz einfaches Interrupt-Dienstprogramm (SER_RX_INT), das jedes empfangene Zeichen unverändert an den PC zurückschickt.
Das dient erstmal nur zum Überprüfen, ob nach der Verbindung MC->PC auch die interruptgesteuerte PC->MC-Verbindung klappt.
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 3)
robo_wolf,
hier ist endlich - muss ja zwischendrin auch noch Fussballspielen :-) - die (teilweise) getestete Version mit Empfangsautomat. Nach dem Einschalten wird wieder die Anwesenheitsbotschaft an den PC gesendet. Danach können Botschaften vom PC empfangen werden. Es gibt kein Timeout - also kann man sich beim Tippen der Botschaft Zeit lassen.
Die „Auswertung“ der empfangenen Botschaften ist noch sehr rudimentär: Bei jeder empfangenen Botschaft wird ein Botschaftszähler hochgezählt. Der Zählerstand (0 bis 15) wird auf LED0 bis LED3 angezeigt.
Beim Empfangsautomaten zeigt sich eine Schwäche der Konstruktion ohne Sprungtabelle: Die Reichweite der „rjmp“-Sprünge ist zu kurz, um das Programm mit einem Satz zur Zieladresse zu befördern. Deshalb sind einige „Aufsetzer“ nötig, um bis ans Ziel zu kommen. Weil mir das nicht gefällt, wird die nächste Version wieder mit Tabellen hantieren.
Der Empfangsautomat selbst ist die 1:1 Umsetzung dessen, was in der Beschreibung steht. Er ist etwas lang, weil ich versucht habe, alle Situationen, die mir einfielen, zu berücksichtigen. Ich hoffe jedenfalls, ich habe ihm den Fluchtweg ins Nirwana gründlich versperrt ;-).
@netzman:
Danke für den Hinweis - ich werde das Teil demnächst ausprobieren. Es wäre eine echte Erleichterung, wenn man testen könnte, ohne das Programm jedesmal erst in den Ziel-MC brennen zu müssen.
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
das Modul SERIAL_V04 mit seinen unbeholfenen "rjmp"-Zweisprüngen gefällt mir wirklich nicht :-( .
Deshalb ist hier die Version SERIAL_V05, bei der der Empfangsautomat wieder tabellengesteuert werkelt - viel eleganter :-) .
Im Quelltext der anderen Module ändert sich nichts. Nur im Hauptprogramm muss die Zeile
Code:
.include "SERIAL_V04.asm"
in
Code:
.include "SERIAL_V05.asm"
geändert werden. An diesem Beispiel zeigt sich übrigens wieder die Flexibilität der modularen Struktur ;-) .
Ciao,
mare_crisium
OT: Wer richtig Fussball guckt, der spielt auch immer mit :-) !
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
ich habe mir die Dateien heruntergeladen, das Programm (mit SERIAL_V05) assembliert und es läuft :-(. Keine Ahnung, was bei Dir schiefgeht.
Ich hänge hier eine geänderte Version SERIAL_V05 an, in der das Echo wieder aktivitert ist; in der Hoffnung, dass Dir das bei der Fehlersuche hilft.
Wenn das auch zu nix führt, könnte ich Dir mein Terminalprogramm schicken. Ist aber eine .exe-Datei, die kann man hier im Forum nicht posten.
Ciao,
mare_crisium