hi, ich versuche mit einem atmega8 über usart text auszugeben, das funktionert aber nicht. ich habe schon überprüft ob der usart chip richtig angeschlossen ist, und ob die taktrate stimmen (hab die avr entwicklungsplatine von hier ausm shop). es wird allerdings nicht das übertragen was ich will. meistens garnichts, manchmal wird während dem schreiben auf den chip mit yaap ein x übertragen, oder mehrere sonderzeichen. ich benutze den asm code aus dem usart tutorial von dieser seite. wäre nett wenn mir jemand helfen könnte. MfG Thomas
- Stimmen die "Taktraten" (Baudraten), oder vermutest du, dass sie stimmen? - Benutzt du einen Baudratenquarz? - Wer soll den Text empfangen? - Ist der Empfänger ansonsten in Ordnung? - Hast du gesucht? http://www.mikrocontroller.net/forum/forum.php?query=%2Buart+%2Bproblem&forums%5B%5D=1&number=100&action=sendsearch http://www.mikrocontroller.net/wiki/Spezial:Search?search=%2Buart+%2Bproblem http://www.mikrocontroller.net/forum/forum.php?query=baudratenquarz&forums%5B%5D=1&number=100&action=sendsearch http://www.mikrocontroller.net/wiki/Spezial:Search?search=baudratenquarz ...
Oft ist die Fuse "Divide clock by 8 internally" noch gesetzt (default bei Atmel).
@thomas: Eine genauere Problemdarstellung würde uns bestimmt weiterhelfen. So wie es Hannes schon gesagt hat ;)
- Stimmen die "Taktraten" (Baudraten), oder vermutest du, dass sie stimmen? ich habe an den fuses noch nichts geändert. standardmässig wird doch der interne quarz verwendet oder? ich hab diesen code verwendet: (habs auch mit .equ CLOCK = 8000000 versucht) .include "m8def.inc" .def temp = r16 .equ CLOCK = 4000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK/(BAUD*16)-1 ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; Baudrate einstellen ldi temp, LOW(UBRRVAL) out UBRRL, temp ldi temp, HIGH(UBRRVAL) out UBRRH, temp ; Frame-Format: 8 Bit ldi temp, (1<<URSEL)|(3<<UCSZ0) out UCSRC, temp sbi UCSRB,TXEN ; TX aktivieren loop: ldi temp, 'T' rcall serout ; Unterprogramm aufrufen ldi temp, 'e' rcall serout ; Unterprogramm aufrufen ldi temp, 's' rcall serout ; ... ldi temp, 't' rcall serout ldi temp, '!' rcall serout ldi temp, 10 rcall serout ldi temp, 13 rcall serout rjmp loop serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, temp ret ; zurück zum Hauptprogramm - Benutzt du einen Baudratenquarz? hm, ich glaube nicht. - Wer soll den Text empfangen? der pc (hyperterminal unter win) - Ist der Empfänger ansonsten in Ordnung? an anderen pcs hab ich das programm noch nicht getestet, aber der port am pc müsste gehn. Oft ist die Fuse "Divide clock by 8 internally" noch gesetzt (default bei Atmel). in yaap finde ich dieses fuse nicht, sondern nur diese: (x -> gesetzt) CKSEL0 CKSEL1 x CKSEL2 x CKSEL3 x SUT0 x SUT1 BODEN BODLEVEL(0) BOOTRST BOOTSZ0 x BOOTSZ1 x ESAVE CKOPT SPIEN x WDTON RSTDISBL thomas
und ich habe RX am board mit pin2, und tx mit pin 3 des atmegas verbunden, ist das so richtig?
> ich habe an den fuses noch nichts geändert. standardmässig wird doch > der interne quarz verwendet oder? ich hab diesen code verwendet: > (habs auch mit .equ CLOCK = 8000000 versucht) Hmmm... Der Mega8 hat keinen internen Quarz. Er hat einen internen RC-Oszillator, der ist aber nicht so genau wie ein quarz und auch nicht so stabil. Ihn für UART zu benutzen ist Lotto. Es kann per Zufall gehen, geht meist aber nicht. Besorg dir mal das (vollständige) Datenblatt des Mega8 und schau da mal rein. Da steht z.B. drin, dass der Mega8 mit 1MHz ausgeliefert wird. Die Veränderung der Konstante CLOCK im Quelltext ändert daran nix. Das lässt sich nur per Fusebits ändern. Übrigens gibt es beim Mega8 keine DIV8-Fuse. Wenn du zuverlässig mit UART arbeiten willst, dann müsstest du einen Quarz anschließen und per Fusebits auswählen. Der Quarz sollte aber nicht 1MHz, 4MHz oder 8MHz haben, sondern eine baudratentaugliche Frequenz, also z.B. 3,6864MHz (siehe auch oben gepostete Links). Ansonsten wird das nicht UART sondern Lotto. ...
ich habe nur den internen RC-Oszillator und einen externen 8mhz quarz. kann ich also damit vergessen UART zu benutzen?
> ich habe nur den internen RC-Oszillator und einen externen 8mhz > quarz. > kann ich also damit vergessen UART zu benutzen? Es wird sich mit Sicherheit wieder jemand finden, der behauptet, dass es bei ihm ohne Baudratenquarz geht. Daher werde ich nicht behaupten, dass es nicht geht, aber darauf hinweisen, dass es mit einem Baudratenquarz besser und zuverlässiger funktioniert. > und ich habe RX am board mit pin2, und tx mit pin 3 des atmegas > verbunden, ist das so richtig? Hinterfrage die Bedeutung von RX (Receive, Empfang) und TX (Transmitt, Senden) und verfolge den Signalweg, dann wirst du sehen, was wo angeschlossen werden muss. ...
aso hm ok. kann mir noch jemand sagen mit welchen fuses ich den atmega8 so einstelle dass er ein externes quarz benutzt?
Neben dem Abschalten des Resetpins kann man sich allerdings noch durch ungeschicktes Setzen der Taktquelle aus dem Controller aussperren. das hab ich gemacht, indem ich die fuses für die taktquelle so gesetzt habe: CKSEL0 1 CKSEL1 1 CKSEL2 1 CKSEL3 0 CKOPT 0 und jetzt komm ich nicht mehr auf den controller;( (seite 27 im datenblatt, ich wollte einen externen 8mhz quarz benutzen) (wie) komm ich jetzt wieder drauf? thomas
Im Datenblatt sind die Beschaltungen für jede Taktquelle erklärt (mit Schaltbild). Einfach die der fälschlicherweise eingestellten Fusebits entsprechende Taktquelle anschließen, dann müsste es gehen. Woher willst du eigentlich hinterher wissen, wie du die Fuses gesetzt hast? Wenn du dich erstmal ausgesperrt hast, dann kannst du sie ja nicht mehr auslesen. Könntest du sie auslesen, dann könntest du sie auch ändern. Und ich glaube nicht, dass du die Fuses vor dem Aussperren vom Bildschirm abgeschrieben hast (oder screenshot), denn dann wäre dir sicherlich der Fehler aufgefallen. ...
doch ich habe mir aufgeschrieben was ich an den fuses geändert habe. naja auf meinem board habe ich ein 8 mhz quarz, und ich weiß nicht was ich falsch gemacht habe;(
Falls die Reset-Funktion des ATmega8 noch aktiv ist: Retten kann man bei jeder falschen Taktquellen-Fuseeinstellung, in dem man an XTAL1 einen Takt anlegt, Quelle muss nicht unbedingt passend zur aktuellen Einstellung sein. Falls noch ein AVR zur Hand, einfach einen Pin als Ausgang und in Endlosschleife auf high/low/high etc. Jede andere Art Frequenzgenerator funktioniert auch (simpelst ein Quarzoszillator - die Teile mit 4 "Beinchen"). Frequenz eher unkritisch (<16MHz), evtl. ISP-Frequenz anpassen auf <=1/4 XTAL1-Frequenz. Ausgang des "Generators" an XTAL1 des "verfusten" AVR (Quarz sicherheitshalber abklemmen) und per ISP auf richtige Taktquelle einstellen. GND bei allen genutzten Teilen verbinden, VCC fuer alles am Besten aus einer Quelle. Alle SEL und SUT auf "1" duerfte bei Quarz erstmal weiterhelfen. Es muss fuer UART auch nicht unbedingt ein "Bauratenquarz" sein, nur damit es kein "Lotto" wird, aber eine stabile Taktquelle mit bekannter Frequenz sollte schon sein. Fuer moegliche Baudraten in abh. vom Takt vgl. Tabelle im Datenblatt. Fehler sollte so klein wie moeglich sein, <2% als Anhaltswert, wenn recht erinnert, steht dazu auch etwas im Datenblatt. Hoffe, es hilft Martin Thomas
Das hilft zwar im konkreten Fall nicht mehr, aber vielleicht beim nächsten mal im Vorfeld: http://www.mikrocontroller.net/forum/read-1-305204.html ...
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.