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
|