Forum: Compiler & IDEs externe Baudrate messen mit Atmega164p


von Spaceinvader (Gast)


Lesenswert?

Hallo zusammen

Momentan habe ich ein Projekt am lauffen, das mit Hilfe eines ATmega164 
eine Baudrate eines externen PC's messen sollte.

Ich habe das RS232 Signal über einen Pegelwandler (MAX232) an den int0 
Eingang des AVR's angeschlossen. Meine Idee ist, dass ich ein bestimmtes 
Zeichen über das Hyperterminal unter Windows sende, und sobalt dieses 
Zeichen über RS232 am int0 Eingang des AVR anliegt, einen Timer 
starte(also auf die Negative Flanke) und die Uebertragungszeit eines 
Baudes messe. Danach kann ich die ermittelte Zeit auf eine Sekunde 
hochrechen, um auf die Baud/Sekunde zu kommen.
Schlussendlich soll geprüft werden, ob die Baudrate des externen PC's in 
einer gewissen Toleranz liegt. Als PASS/FAIL Anzeige steuere ich ein 
grünes bzw. rotes LED an. Programmiert wird das Ganze in C.

Zum Problem: Ich habe keine Ahnung wie ich die Interrupt und Timer 
Funktion des AVR's nutze. Ich habe mich bereits in das Thema 
Timer/Interrupt eingelesen, werde aber daraus nicht schlau.
Ausserdem weiss ich nicht welches Zeichen sich am besten für die 
Uebertragung eignet, idealerweise sollte es ja aus bloss zwei Flanken 
bestehen. Ich sollte möglichst rasch mit dem Projekt fertig werden.

Leider habe ich praktisch keine Erfahrung was das Programmieren von 
AVR's mit WinAVR angeht.

Ich wäre euch sehr dankbar, wenn ihr mir mit etwas Code nachhelfen 
könnt.

MFG Nick

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du könntest Dir mal den Autobaud-Mechanismus ansehen, der in Modems 
implementiert ist - bei dem wird die Zeichenfolge AT an das Modem 
gesandt, und es kann daran die Baudrate erkennen.

von avr (Gast)


Lesenswert?

Von Philips für den 80x51 gabs da mal was.
Habs auch gefunden:

http://diakom.com.ru/el/elfirms/appnotes/Philips/an447.pdf

Prinzip: Ausmessen und Tablle

avr

von Spaceinvader (Gast)


Lesenswert?

Vielen Dank für die raschen Antworten!

Der oben genannten Autobaud-Mechanismus bringt mir aber nicht wirklich 
was, da ich ja nicht über UART kommunizieren will, oder seh ich das 
falsch??

Das Philips Datenblatt sieht interessant aus, ich versetehe es zwar 
nicht ganz (da Assembler), aber sehe die Grundstruktur dahinter.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Spaceinvader schrieb:
> Der oben genannten Autobaud-Mechanismus bringt mir aber nicht wirklich
> was, da ich ja nicht über UART kommunizieren will, oder seh ich das
> falsch??

Und wobei bitte möchtest Du eine Baudrate bestimmen, wenn nicht bei 
einer Kommunikation über UARTs?

von axelr. (Gast)


Lesenswert?

ICP als Stichwort und schicken tust Du große U's. (0x55) ;))

von Spaceinvader (Gast)


Lesenswert?

bei mir geht es nicht um die Kommunikation, sondern nur um die Baudrate 
des Empfangenen Signals. Was nach der Messung damit geschieht ist egal. 
Ich greiffe das Signal von einer Loopback-Schlauffe ab.

von Baud-Rater (Gast)


Lesenswert?

Der Einwand von Spaceinvader ist in soweit richtig, als beim
Ausmessen der Baudrate der interne Uart nicht verwendet wird.

Im Prinzip läuft das Ganze darauf hinaus, daß z.B: beim Zeichen
"Blank" (0x20) die High-Zeit des Bits der "2" gemessen wird.

RxD-Pin per Polling messen (bei Abgeschaltetem Interreupt!!!)

Das Blank muß von der Gegenseite kommen. Statt dem Blank geht
es auch mit der 0x30, also der "0", dann ist die High-Zeit zwei Bit 
breit.

Die "Breite" des Bits oder der Bits in Zyklen zu messen und dann
den Teilerfaktor für den Uart zu bestimmen hat den Vorteil
daß die aktuelle Taktfrequenz des µP egal ist, sofern sich
ein passender Teilerfaktor ermitteln läßt.

Mit dieser Variante funktionieren sogar die AVRs mit internem
Oszillator, klar mit Bauraten Quarz ist es genauer, aber es geht!
(Eigene Erfahrungen)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Spaceinvader schrieb:
> bei mir geht es nicht um die Kommunikation, sondern nur um die Baudrate
> des Empfangenen Signals. Was nach der Messung damit geschieht ist egal.
> Ich greiffe das Signal von einer Loopback-Schlauffe ab.

Nun gut, das verändert die Situation etwas.
Vorausgesetzt, daß das Signal störungsfrei und mit konstanter Baudrate 
vorliegt, genügt es, die kürzeste auftretende Zeit zwischen einer 
steigenden und einer fallenden Flanke bzw. umgekehrt zu messen. Das ist 
die Zeit, die für die Übertragung eines Bits benötigt wird, und das ist 
der Kehrwert der Baudrate.

von Christian F. (cmf) Benutzerseite


Lesenswert?

Eine schon fertige Bibliothek habe ich hier gefunden: 
https://github.com/fantachip/avr-baudrate

Funktioniert wunderbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.