Hallo, ich bin dabei, das AVR Tutorial durchzuarbeiten und bin derzeit bei der UART Schnittstelle. Dummerweise kriege ich nur komische Zeichen auf's Display und nichts Sinnvolles. Bei der Fehlersuche ist mir aufgefallen, daß am Max232-Ausgang das Signal nur ca. 2000 Baud hat und nicht 9600. (immer das gleiche Zeichen geschickt und dann mit dem Oszi reingeschaut). Hat jemand von Euch eine Idee, woran das liegen könnte...? Konfiguration: - ATmega8 mit externem Quarzoszillator 3,686400 MHz. - Das Testprogramm praktisch 1:1 aus dem Tutorial übernommen (habe die Zeile .equ F_CPU = 4000000 in .equ F_CPU = 3686400 geändert) Noch eine Beobachtung - keine Ahnung, ob die was damit zu tun haben kann: Auf dem Bild im Anhang sieht man, wie der Ozillator schwingt. Es gibt einen großen Unterschied, ob der Ausgang frei ist oder ob er an den XTAL1 Pin angeschlossen ist. Ist das normal? Getestet habe ich das ganze mit dem HyperTerminal und mit dem TeraTerm. Es zeigen beide nur Müll. Und an den Porteinstellungen habe ich natürlich auch schon "rumgespielt"... Bin für alle Hinweise dankbar! lg, Nino.
So wie das auf dem Oszillogrammen aussieht sind die Fuses für den Takt falsch gesetzt. Setz mal auf ext. Clock anstatt ext. Crystal Grüße Björn
Das war schonmal ein guter Tip, danke! Die Schwingung des Quarzes bleibt jetzt quasi gleich, wenn man ihn anschließt - ändert nur ganz geringfügig die Amplitude. Leider hat sich an meinem Baud-Problem damit nichts verändert. Alles beim Alten :-( lg, Nino.
Huhu Nino ;) Wenn Du immer das selbe Zeichen sendest, wie misst Du denn dann den Takt? Stimmen die Pegel denn? (+/- 12V fuer low, high) und hast Du Deine USART richtig konfiguriert. Stell mal den Schaltplan ein und ebenfalls den Source (bitte als Attachment) dann kann ich mehr sagen. Fehlerquellen gibt es viele. Ausserdem solltest Du noch die Rahmenbedingungen nennen, also welches Terminal und welchen Zeichensatz Du verwendest etc pp. lieber Gruss, Michael
puhu... So viele mögliche Fehlerquellen - ich staune! Also erstmal der Programmcode, der steht hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART im Kapitel "Senden von Zeichen". (meine einzige Änderung ist die Taktfrequenz) Mein Versuchsaufbau ist Eigenbau. Siehe Foto. Die UART-Schnittstelle habe ich aus dem gleichen Link wie oben entnommen (Schaltplan ident). Allerdings habe ich auf Deinen (Michael) Hinweis hin einen Fehler in meiner Beschaltung entdeckt. Ich habe falsche Elkos eingebaut (22uF, keine Ahnung warum). Ich nehme an, der Pegel ist deswegen nur ca. +/- 8 Volt. Also ich werde das mal ändern und dann melde ich mich wieder mit Ergebnissen. Trotzdem beantworte ich noch die weiteren Fragen: > Wenn Du immer das selbe Zeichen sendest, wie misst Du denn dann den > Takt? Also ich habe mir mit dem Oszi angesehen, wie lange das Zeichen, das sich wiederholt, dauert. Das waren 0,0005 Sekunden. Ich habe das als 2.000 Zeichen pro Sekunden interpretiert, also 2.000 Baud. Habe ich da was falsch gemacht? > ...und hast Du Deine USART richtig konfiguriert... Exakt so wie im o.g. Programmcode. Habe daran nichts geändert. (Gibts da etwa noch mehr zu konfigurieren...?) Die Frage nach dem Zeichensatz kann ich leider (noch) nicht beantworten. Aber allgemein sieht es nicht nach einem Zeichensatzproblem aus, denn ich erhalte am PC lauter idente Zeichen, auch wenn der ATmega8 unterschiedliche Zeichen wegschickt. Ich habe übrigens zwei Terminals getestet, HyperTerminal und TeraTerm. Beide liefern praktisch das gleiche Ergebnis. Nicht ganz die gleichen Zeichen aber der Effekt ist im großen und ganzen derselbe. Also, wie oben schon erwähnt, werde ich vorerst mal die Elkos tauschen und mich dann wieder melden. Jedenfalls großen Dank für Eure raschen Antworten! lg, Nino.
Hallo, > das Zeichen, das sich wiederholt, dauert. Das waren 0,0005 Sekunden. > Ich habe das als 2.000 Zeichen pro Sekunden interpretiert, also 2.000 > Baud. Habe ich da was falsch gemacht? Baud: Bits/s. Bei 8N1 (8 Bits, kein Paritätsbit, 1 Stoppbit) und einem Startbit hast Du 10Bits/Zeichen. Wenn Dein Zeichen 2000 mal pro Sekunde übertragen wird, liegst Du bei 20000Bd! Bist Du ganz sicher, dass Deine Formulierung "Zeichen" in diesem Kontext stimmt? Wie sind die (Clock-)Fuses gesetzt? Gruß risu
Hallo! > Bist Du ganz sicher, > dass Deine Formulierung "Zeichen" in diesem Kontext stimmt? Nein, bin ich nicht. Anbei ein Screenshot von meinem Oszi. Man sieht zwei wie ich es nannte "Zeichen" (K). Einstellung ist 0,2ms pro Teilung, die Dauer beider "Zeichen" ist zehn Teilungen, also 0,002 Sekunden. Das wären 10.000 baud. Wenn man ganz genau schaut, ist das letzte Bit eh nicht mehr ganz drauf, also sind's. 9.600. Wenn man es so schulmäßig vorrechnet, dann stimmt auf einmal alles. Tut mir leid, daß ich das in einem meiner gestrigen Postings falsch geschrieben habe. Ärgere mich soeben selbst darüber. hgrmpf So, und außerdem noch ein Screenshot meiner fuse bits, frisch ausgelesen (Ponyprog: Hakerl = 0). Wie man sieht, habe ich von der Werkseinstellung nur die CKSELx geändert. CKSEL=0000. Eins ist mir noch eingefallen, bevor ich meine Kondensatoren rauslöte, um den Pegel von 8 auf 12 Volt zu ändern. Ich könnte auch einen falschen Max232 eingebaut haben. Es ist ein MAX232CPE. (Datenblatt folgt gleich) Paßt dieser Bauteil? Danke und schönes Wochenende! Nino.
>um den Pegel von 8 auf 12 Volt zu ändern.
Vergiss es. 8V sind in Ordnung, 12V werden es nicht werden und stammen
aus einer Fehlinterpretation der V24. Normgerecht sind Pegel ab +/-3V.
Hallo, OK, Du erzeugts also ein 9600Bd Signal, was ja auch Dein Ziel war. CKSEL3..0=0 bedeutet, dass Du einen externen Oszillator verwendest (sieht auf Deinem Foto auch so aus). Der Schaltplan fehlt noch, ebenso der Code (auf der von Dir genannten Seite stehen mehrere Beispiele; kopiere einfach Deinen Code und stelle ihn als Anlage hier ein). Gruß risu
Hi, korrekt: externer Ozsillator (3,686400 MHz). Funktioniert auch. Hier der Code. (im Anhang) lg, Nino.
Hi, 1. Dein Code ist nicht assemblierbar ("VollesRegíster" und "Zaehler" sind nicht definiert) -- also bestimmt nicht das, was auf Deinem Controller läuft! 2. Wie sind die "UART-Auswahl"-Brücken gesetzt? Gruß risu
ooops - alte Version erwischt. Ich hatte da zu Testzwecken eine Warteschleife drinnen. Nun der zweite Versuch. Jetzt ist es bestimmt das, was auf meinem Controller läuft ;-) Die Auswahlbrücken JP3 und JP9 sind auf den MAX232 gesetzt (sicher korrekt, denn es kommt ja "etwas" bis zum PC) und JP20 (Spannungsversorgung) ist gesetzt, also "ein". Grüße, Nino (dankbar)
Hallo Nino, Code und Schaltplan sollten OK sein. Also noch einmal eine Bestandsaufnahme: Laut F_CPU + Code sendest Du tatsächlich mit 9600Bd, was ja grob durch das Oszillogramm bestätigt ist. Momentan wiederholst Du das zeichen 'T'. Deine letzte Fehlermeldung war aber: > ich erhalte am PC lauter idente Zeichen, auch wenn der > ATmega8 unterschiedliche Zeichen wegschickt. Was kommt denn beim Senden der 'T's an? Ist die Masseverbindung zwischen PC und Deinem System (Pin 5 am RS-232 Konnektor) in Ordnung? Wie ist das Terminalprogramm konfiguriert (müsste sein: 9600Bd, 8N1) ... und "hängt" es am richtigen Port? Gruß risu
Problem gelöst - aber fragts mich bitte nicht wie! Nachdem ich mein UART-Problem vorerst mal auf die lange Bank geschoben hatte, ist mir bei einem anderen Projekt etwas aufgefallen: Ich habe ein Countdown-Programm für einen Platinenbelichter gemacht (macht wahrscheinlich jeder Anfänger mal), und dabei habe ich bemerkt, daß der Countdown nicht ganz ident mit der Stoppuhr des Handys gelaufen ist. Ich tippte (richtig) auf ein Taktproblem, wußte aber nicht, wo ich ansetzen sollte, denn ich hatte alles laut AVR-Tutorial eingestellt. Ich vermutete weiter (richtig), daß dieses Taktproblem auch die Ursache für mein UART-Problem war. Folglich habe ich das UART-Testprogramm wieder geladen, an den Einstellungen im Programm herumgespielt, verschiedene Quarze und -oszillatoren ausprobiert, bis ich schließlich Erfolg hatte. Mich verwundert jetzt nur, daß es keinen (für mich erkennbaren) Unterschied zur Ausgangssituation gibt :-| (?) Zusammenfassend möchte ich vermerken, daß ich (Einsteiger) Dank Eurer Hilfe viel über Mikrocontroller und diverses "rundherum" gelernt habe und bedanke mich für die vielen Tips! Grüße, Nino.
Hi > denn ich hatte alles laut AVR-Tutorial eingestellt. Im Zweifelsfall gilt das Datenblatt. > verschiedene Quarze und -oszillatoren ausprobiert, bis ich schließlich >Erfolg hatte. Na ja, auch eine Methode. Willst du das aber immer so machen? MfG Spess
> Na ja, auch eine Methode. Willst du das aber immer so machen?
Die Strategie ist rauszufinden, welche Wirkung es hat, wenn man an
irgendeinem Schräubchen dreht (das man noch nicht kennt). Funktioniert
oft recht gut, wenn man sonst grade nicht weiter weiß :-)
lg, N.
solange dies nicht zum standartvorgehen wird, sondern eher ein akt der verzweiflung kurz vor arbeitsende, ist doch ok...
Kurz vor der Verzweiflung würde ich andere Methoden bevorzugen. Wozu hat man denn sonst Vorschlaghammer, Flammenwerfer und Dynamit zuause? Der Kreativität sind keine Grenzen gesetzt! ;-) N.
Wie Rio Reiser schon sagte: Macht kaputt, was Euch kaputt macht. ;-) http://www.youtube.com/watch?v=UwE8dlRnsio MfG Paul
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.