Forum: Mikrocontroller und Digitale Elektronik ATMega16


von Steffen W. (Gast)


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!

von Thomas Pototschnig (Gast)


Lesenswert?

Läuft dein ATMEGA wirklich auf 1MHz?

von Steffen W. (Gast)


Lesenswert?

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??

von Thomas Pototschnig (Gast)


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

von Thomas Pototschnig (Gast)


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

von Thomas Pototschnig (Gast)


Lesenswert?

Ah da ist das Problem:
3<<UCSZ0 setzt UCSZ0 und UCSZ1 - aber das ist undefiniert ... sollte
wohl eher
1<<UCSZ0 heißen :-)

von Pete da Heat (Gast)


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

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
Noch kein Account? Hier anmelden.