externe Baudrate messen mit Atmega164p

Gast #1655898
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
Gast #1656524
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.
Gast #1656630
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.
Gast #1656637
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)
Persönliche Seite #1656784
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren