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.