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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.