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
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 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
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.
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?
ICP als Stichwort und schicken tust Du große U's. (0x55) ;))
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.
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)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.