Fehler im UART ATMega 168P

OP #3803693
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
Angehängte Dateien:
Gast #3803705
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

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