mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART sendet falsche Zeichen / Angepaßter Tutorial Code


Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche gerade über die UART zu senden, mit Mega48 aber irgenwei kommt 
da nur folgendes raus:
½åëW5<25><23>½åëW5<25><23>½åëW5<25><23>½åëW5<25><23>
Als HEX:
BD E5 EB 57 35 19 17 BD E5 EB 57 35 19 17 BD E5 EB 57 35 19 17 BD E5 EB 
57 35 19 17

Quarz ist 20Mhz, CHKDIV/8 ist aus.
.include "m48def.inc"

.equ F_CPU = 20000000                            ; Systemtakt in Hz
.equ BAUD  = 2400                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif

.def temp = r17
.def zeichen=r16


  ldi     temp, LOW(RAMEND)
    out     SPL, temp
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
 
    ; Baudrate einstellen
 
    ldi     temp, HIGH(UBRR_VAL)
    sts     UBRR0H, temp
    ldi     temp, LOW(UBRR_VAL)
    sts     UBRR0L, temp
 
    ; UCSR0C Standard = Parity: none, Stopbit: 1, Frame-Format: 8 Bit

   ; TX aktivieren
   lds temp, UCSR0B
  ori temp, (1<<TXEN0)
    sts UCSR0B,temp                  

loop:
    ldi     zeichen, 'T'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 'e'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 's'
    rcall   serout                      ; ...
    ldi     zeichen, 't'
    rcall   serout
    ldi     zeichen, '!'
    rcall   serout
    ldi     zeichen, '\r'
    rcall   serout
    ldi     zeichen, '\n'
    rcall   serout
    rjmp    loop
 
serout:
  push zeichen
  serout_wait:
    lds zeichen, UCSR0A
      sbrs zeichen, UDRE0              ; Warten bis UDR für das nächste
                                       ; Byte bereit ist
    rjmp serout_wait
  pop zeichen
    sts     UDR0, zeichen
    ret 

Bin etwas ratlos... eigentlich sollte das doch so funktionieren... 
loopback am MAX zum PC funktioniert zumindest anstandslos.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jezt noch versucht das Frameformat explizit zu setzen mit:
; UCSR0C Standard = Parity: none, Stopbit: 1, Frame-Format: 8 Bit
  ldi temp, (1<<UCSZ01) | (1<<UCSZ02)
  sts UCSR0C, temp
Außerdem den ganze PortD als Ausgang
  ldi temp, 0xFF
  out DDRD, temp

Leider immer noch keine Besserung :-\

Autor: NiceGuy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin moin.

Der PC empfängt offensichtlich deutlich mehr Zeichen als Du sendest. Das 
deutet auf eine zu geringe Baudrate beim AVR hin. Kann es sein, dass das 
Teil nicht mit dem externen Quarz läuft, sondern mit 8 MHz intern?

Dein nachgebesserter Code scheint mir auch noch eine Macke zu haben:
UCSZ02 steckt in UCSR0B, und UCSZ01/00 in UCSR0C.

Gruß, Reiner.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.