.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
out UBRRH, temp
28
ldi temp, LOW(UBRR_VAL)
29
out UBRRL, temp
30
31
; Frame-Format: 8 Bit
32
33
ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
34
out UCSRC, temp
35
36
sbi UCSRB,TXEN ; TX aktivieren
37
;(einige Sende-Tests)
Fand ich interessant und kam auf die Idee, diesen Code für den Mega8 auf
meinen Mega644 zuzuschneiden. Also Datenblatt her...
Das ist dabei rausgekommen:
1
.def temp = r16 ; Register für kleinere Arbeiten
2
.def zeichen = r17 ; in diesem Register wird das Zeichen an die
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
15
.endif
16
17
; Stackpointer initialisieren
18
19
lds temp, HIGH(RAMEND)
20
sts SPH, temp
21
lds temp, LOW(RAMEND)
22
sts SPL, temp
23
24
; Baudrate einstellen
25
26
lds temp, HIGH(UBRR_VAL)
27
sts UBRR0H, temp
28
lds temp, LOW(UBRR_VAL)
29
sts UBRR0L, temp
30
31
; Frame-Format: 8 Bit
32
33
lds temp, (1<<UCSZ01)|(1<<UCSZ00)
34
sts UCSR0C, temp
35
36
lds temp,UCSR0B
37
sbr temp,TXEN0
38
sts UCSR0B,temp ; TX aktivieren
39
;(einige Sende-Tests)
Nur leider sendet der µC nach dem Flashen... rein gar nichts!
Woran liegt das? Habe ich ein Bit falsch gesetzt oder Schwachsinn mit
den Registern angestellt? Ich finde den Fehler jedenfalls nicht mehr
allein :(
Hoffe, dass mal jemand reinschaut ;)
Gruß,
euer LDer
@nmbx, nein, danach folgt noch der (Original-)code aus dem Tutorial, wie
ich mit dem ";(einige Sende-Tests)" versucht habe, anzudeuten, das in
beiden Codeblöcken am Ende steht.
Für Leute, die das Tut nun nicht auskramen wollen:
Hm, wo finde ich die?
Also das Datenblatt ist ja LANG und ich habe ehrlich gesagt keine große
Lust, es komplett durchzulesen. Passt auch gerade nicht in mein
Köpfchen...
Also welcher Punkt?
Gruß,
LDer
LDer schrieb:> Also das Datenblatt ist ja LANG
Wie wärs mit dem Inhaltsverzeichnis?
> Also welcher Punkt?
Wie wärs mit: "16.6 USART Initialization"
Peter
Peter Dannegger schrieb:>> Also welcher Punkt?>> Wie wärs mit: "16.6 USART Initialization"
Oh, danke. Also Blindheit meinserseits. Auch gut^^
Da steht folgendes:
1
USART_Init:
2
; Set baud rate
3
out UBRRHn, r17
4
out UBRRLn, r16
5
; Enable receiver and transmitter
6
ldi r16, (1<<RXENn)|(1<<TXENn)
7
out UCSRnB,r16
8
; Set frame format: 8data, 2stop bit
9
ldi r16, (1<<USBSn)|(3<<UCSZn0)
10
out UCSRnC,r16
11
ret
nur dumm, dass der out-Befehl nicht auf Register wie UBRRnH bzw konkret
UBRR0H anwendbar ist. und es eben nicht UBRRHn wie im Datenblatt,
sondern vielmehr UBRRnH ist. Kann man aber auch noch mit leben.
Zu allem Überfluss steht da doch nichts anderes, als das was ich gemacht
habe. Oder doch?
Jedenfalls bringt auch die Änderung meines Codes auf Folgendes nichts:
1
2
; Frame-Format: 8 Bit
3
4
lds temp, (1<<USBS0)|(3<<UCSZ00)
5
sts UCSR0C, temp
6
7
lds temp,UCSR0B
8
sbr temp,TXEN0
9
sbr temp,RXEN0
10
sts UCSR0B,temp ; TX aktivieren
Wobei ich jetzt nur den relevanten Teil poste.
Gruß,
LDer
> lds temp, HIGH(RAMEND)> sts SPH, temp> lds temp, LOW(RAMEND)> sts SPL, temp
Was soll denn LDS hier??
Das ist wohl ein bisschen zu viel des Guten.
> Also das Datenblatt ist ja LANG und ich habe ehrlich gesagt keine große> Lust, es komplett durchzulesen.
Eigentlich habe ich aber auch keine Lust, dir zu helfen. Warum sollte
ich?
Sascha Weber schrieb:> setzt nicht etwa die Bits TXEN0 und RXEN0, da der Befehl sbr eine> Bitmaske und keine Bitnummern haben möchte!> sbr temp,(1<<TXEN0) | (1<<RXEN0)> sollte da schon eher angebracht sein!
cool, danke, ich habe eine Ausgabe!
Also falsch gesetzte Bits. Jetzt habe ich allerdings das Problem, dass
ich nur Müll empfange, statt "T" bzw. 01010100 (hab es gekürzt, sodass
nur das T übertragen wird) kommt immer "ô" bzw. 11110100 an... :(
Anscheinend werden die ersten vier Bits (von MSB an gesehen) als 1,
dafür die letzten Bits korrekt übertragen.
ersthelfer schrieb:> Was soll denn LDS hier??> Das ist wohl ein bisschen zu viel des Guten.
Dann sag mir doch, wie ich es besser machen kann :)
ersthelfer schrieb:> Eigentlich habe ich aber auch keine Lust, dir zu helfen. Warum sollte> ich?
1. hast du es doch bereits getan, indem du mich auf lds hingewiesen
hast.
2. Warum versucht du es dann? Niemand zwingt dich.
Gruß,
LDer
ADD: mein derzeitiger Code:
> Funktioniert blendend!
... und überhaupt, seit wann kann man SPL und SPH nicht mehr über out
erreichen?
rumpöbeln hilft hier eben nicht weiter, sondern nachdenken wie du
gemerkt hast