Forum: Mikrocontroller und Digitale Elektronik Fehler im UART ATMega 168P


von Swen W. (swen_w)


Angehängte Dateien:

Lesenswert?

Hallo,

kann mir jemand helfen? Ich habe bekomme im Terminal immer die falschen 
Zeichen geliefert, und finde nicht heraus, wo ich den Fehler habe.

Das Terminal ist auf 1200 Baud, 8N1 gesetzt, und ich hoffe der 
Controller auch. Ich habe es auch mit höherer Baudrate versucht, aber 
ohne Erfolg. Da aber immerhin irgendwas ankommt, denke ich dass ich die 
Konfiguration des USART im Comtroller falsch habe.

Kann mir jemand helfen?

Danke!

Hier der Code:
1
.def temp = r16
2
.def zeichen = r17
3
.def Rx = r15
4
5
.equ F_CPU = 4000000
6
.equ BAUD = 1200
7
 
8
; Berechnungen
9
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
10
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
11
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
12
 
13
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
14
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
15
.endif
16
17
  ; Stackpointer initialisieren
18
 
19
    ldi     temp, HIGH(RAMEND)
20
    out     SPH, temp
21
    ldi     temp, LOW(RAMEND)
22
    out     SPL, temp
23
 
24
    ; Baudrate einstellen
25
  
26
  ldi   temp, HIGH(UBRR_VAL)
27
  sts    UBRR0H, temp
28
  ldi    temp, LOW(UBRR_VAL)
29
  sts   UBRR0L, temp
30
31
  ;Frame Format 8Bit
32
33
  ldi   r18, (1<<TXEN0)
34
  sts     UCSR0B, r18
35
  
36
  ldi   r18, (0<<UCSZ02)|(1<<UCSZ01)|(0<<USBS0)|(0<<UCPOL0)
37
  sts   UCSR0C,r18
38
  
39
  ldi   zeichen, 'C'
40
  rcall serout
41
  rjmp ende
42
43
serout:
44
  lds    Rx, UCSR0A
45
  sbrs  Rx, UDRE0 
46
  
47
    rjmp    serout
48
    sts     UDR0, zeichen
49
    ret 
50
51
sync:
52
  ldi    temp, 0
53
sync_1:
54
  ldi    r17, 0
55
sync_loop:
56
  dec    r17
57
  brne  sync_loop
58
  dec    r16
59
  brne  sync_1
60
  ret  
61
ende:
62
  rjmp ende
63
  
64
my_string:  .db "Test!",10,13,0

von Thomas E. (thomase)


Lesenswert?

Swen W. schrieb:
> ldi   r18, (0<<UCSZ02)|(1<<UCSZ01)|(0<<USBS0)|(0<<UCPOL0)
>   sts   UCSR0C,r18

Lass das UCSR0C-Register wie es ist. Dann passt das auch.
Du hast es auf 7-Bit gestellt.

mfg.

von spess53 (Gast)


Lesenswert?

Hi

>ldi   r18, (0<<UCSZ02)|(1<<UCSZ01)|(0<<USBS0)|(0<<UCPOL0)
>  sts   UCSR0C,r18

Das ist 7-Bit USART-Mode. Für 8Bit-Mode muss UCSZn1 und UCSZn0 gesetzt 
sein. Sieh dir die passenden Abschnitte im Datenblatt an.

MfG Spess

von Swen W. (swen_w)


Lesenswert?

Perfekt, das war es.

Vielen Dank für die schnelle Hilfe!

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.