Hallo, ich hab einen ATMega16. Wollt nun einmal das Tutorial durcharbeiten. Bin beim UART-angelangt. Im Datenblatt zum AtMega16 steht, dass sich bei UART-Funktionen im Sinne von der Registerbelegung usw. nichts geändert hat. Defacto müsste bei folgendem Code ja auch auf einem PC über ein Terminal-Programm etwas zu lesen sein. Bei mir kommen aber nur kryptische Zeichen an. .include "m16def.inc" .def temp = r16 .equ CLOCK = 1000000 .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 Für ein paar Tipps wäre ich sehr dankbar!
Ich hatte gelesen, dass der ATMEGA auf 1 MHZ vorkonfiguriert ist. Wenn dies doch nicht der Fall sein sollte, wie kann ich das hinbasteln, dass der auf 1 Mhz läuft??
Nein das ist schon richtig. Aber dann kann man wenigstens ausschließen, dass dein Takt dran schuld ist. Es gibt meines Wissens ein Calibration-Wert, den man in irgendein Register laden sollte, damit der RC-Oszillator genauer wird. Das solltest du vielleicht mal ausprobieren, weil der RC-Oszillator nicht so genau ist. Dummerweise hab ich immer mit Quarz gearbeitet und kann die auch nicht genau sagen, wie es genau funktioniert. Mfg Thomas Pototschnig
Was es noch sein kann ... Bei URB=6 hat der ATMEGA 7% Abweichung von den 9600Baud bei 1MHz (Siehe Datenblatt). Die Formel von dir berechnet sogar nur UBR=5, weil es nicht rundet sondern nur abschneidet - also noch schlechter. Mit UBR=12 und gesetzten x2-Bit sinkt der Fehler auf 0,2% - das könntest du mal ausprobieren. Das bit heißt U2X und ist im UCSRA-Register. Hoffe das hilft etwas. Mfg Thomas Pototschnig
Ah da ist das Problem: 3<<UCSZ0 setzt UCSZ0 und UCSZ1 - aber das ist undefiniert ... sollte wohl eher 1<<UCSZ0 heißen :-)
Der interne Oszillator ist zu ungenau (+- 3% Abweichung), UART mag aber keine Abweichungen >1%. Nimm einen externen Quarz (evtl. sogar Baudratenquarz), damit sparst Du dir viel Ärger. Pete
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.