ATMega16

Gast #277704
Lesenswert?

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!
Gast #277707
Lesenswert?

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
Gast #277708
Lesenswert?

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
Gast #277710
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren