Hallo, kann jemand mir erklären, wieso folgender code bei ATmega88 nicht klappt? zB: Um den Sendekanal des UART des Atmega8 zu aktivieren, muss das Bit TXEN im UART Control Register UCSRB auf 1 gesetzt werden. d.h sbi UCSRB,TXEN ; TX aktivieren Aber das gleiche muss für den ATmega88 gelten, oder? und so habe ich geschriben. sbi UCSR0B,TXEN0 ; TX aktivieren aber geht nicht. Gruß Benites PS: anbei mein asm Code
Hallo Hannes, Anbei schicke ich Dir mein Programm. Dies ist schon kompiliert und einwandfrei. Aber ich bekomme nichts mit Hyperterminal. Woran kann das liegen??? Gruss Benites
- Stimmt die Taktfrequenz des AVRs mit der im Quelltext angegebenen überein? Mal zum Test einen Portpin klappern lassen und nachmessen. - Stimmen die Übertragungsparameter auf beiden Seiten überein? Also ich habe jetzt nicht den gesamten Code anhand des Datenblattes überprüft, aber ich kann nicht nachvollziehen, was (und warum das) du in serout machst. Wenn du schon so (ohne Int) programmierst, dann solltest du darauf achten, dass du erst Daten ins UDR (UDR0) schreibst, wenn dies auch leer ist. Du musst der UART schon Zeit zum Senden lassen. Hier als Beispiel die Zeichensenderoutine eines Programms auf ATMEGA8535, die Register liegen noch im I/O-Bereich und sind mit IN/OUT, SBI/CBI erreichbar, müsstest du auf Extended-I/O umstellen (LDS/STS): pc_data: ;sendet das Byte in wl über RS232 sbis UCSRA,UDRE ;TX-UDR leer? ja... rjmp pc-1 ;nein, nochmal prüfen... out udr,wl ;Byte an PC senden ret Diese Variante (Busy-Warteschleife) geht natürlich nur, wenn der AVR während der Übertragung nix Anderes zu tun hat. Liegen noch andere Tasks gleichzeitig an, so sollte man die Ausgabe über Ringbuffer und Interrupt organisieren. ...
Hallo Hannes, Danke für den Tipps. Taktfrequenz des AVRs sowie Übertragungsparameter stimmen überein. Anderseits habe ich auch so ausprobiert, aber nichts :-( serout: => sbis UCSR0A,UDRE0 rjmp pc-1 sts UDR0, temp ret bekomme folgende Fehlermeldung, wo markiert mit "=>" ist: error: Operand 1 out of range: 0xc0 Assembly failed, 1 errors, 0 warnings Danke im Voraus Benites
Dann schau mal, an welcher Adresse USCR0A liegt und welchen Adressbereich man sbis/sbic testen kann bzw. mit sbi/cbi manipulieren kann... Vielleicht verstehst du nun, warum ich die 8er Serie nicht besonders mag und wie ich zu der Vermutung komme, die Entwickler seien besoffen gewesen. Tip: Mit der F1-Taste gibts im AVR-Studio Hilfe zu dem Befehl unter dem Cursor... Damit kann man auch erfahren welche Befehle welche Einschränkungen haben. ...
Hi UDSR0A liegt nicht im I/O Bereich und kann nicht mit SBIS angesprochen werden. Der Wert muss erst in ein Register geladen werden. aaa: lds r16,UDSR0A sbrs r16,UDRE0 rjmp aaa sts UDR0,temp MfG HG
Hätt' ich zwar auch schreiben können, aber ich wollte Hilfe zur Selbsthilfe geben... - Sorry... ...
hallo ihr zwei, vielen Dank für die Unterstützung. nur eine kleine korrektur: mit UDSR0A habe ich folgende Fehlermeldung: error: Undefined symbol: UDSR0A Assembly failed, 1 errors, 0 warnings musste sein: UCSR0A Anbei mein Code (einwandfrei) Gruss Benites
Hi Ich hatte nicht im Datasheett nachgesehen, sondern deine Registernamen benutzt. MfG HG
Hab im Moment das gleiche Problem wie Benites oben. Der Code läuft, aber ich bekomme nichts mit Hyperterminal. Ich benutze den ATMega88 mit dem STK500. Hat jemand ne Idee?
Jetzt kommt ein bisschen was bei HT an, aber nur mist (z.B.: 8Àýþøøøø8ÀÀ88ÀÀ8888þøøø8þøøø8ÀÀ88þøøø8ÀÀ88øø8ÀÀ8888þøøø8ÀÀ88øø8ÀÀ888 88þÀ) Ich tippe mal auf irgend ein Timingproblem, aber wie bekomme ich das weg?
> Ich tippe mal auf irgend ein Timingproblem, aber wie bekomme ich > das > weg? Indem du auf beiden Seiten die exakt gleiche Baudrate einstellst. Dazu gehört auch, dass der AVR mit einem baudratentauglichen Quarz betrieben wird. Der Anschluss des Quarzes alleine reicht noch nicht, man muss dem AVR auch sagen, dass er ihn auch benutzen soll (Fusebits), sonst werkelt er mit dem ungenauen internen Taktgeber weiter. ...
Welches Fusebit muss ich denn da setzen? Es gibt da über 50 Möglichkeiten. Und es werden damit ja auch immer die Einstellungen für CKSEL und SUT verändert.
Problem hat sich gelöst. Es waren nicht die Fusebits. Bei einer Bautrate von 4800 klappts, darüber nicht mehr.
Dann passen die Taktraten (und somit die Baudraten) beim Atmel nicht zu denen des PC. Nimme ´nen externen Baudratenquarz und guck mal in die Baudratentabelle des AtMegas (Datenblatt), was bei den UBRR-Registern eingestellt werden muß.
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.