Hallo,
ich bin am verzweifeln. Ich möchte gerne einen MIDI Befehl per UART
Senden. Das funktioniert auch soweit. Nur wenn ich das Senderegister
über den Befehl X+ (aus RAM lesen) befülle, kommt nur Müll an. Beim
Debugen ist alles richtig.
So funktioniert es:
1
ldi r16,0x90 ;Statusbyte
2
rcall send ;Senden
3
4
ldi r16,0x18 ;Note laden
5
rcall send ;Senden
6
7
ldi r16,0x7E ;velocity laden
8
rcall send ;Senden
9
10
ret
11
12
send:
13
sbis UCSR0A,5 ;frei? USR=UCSRA=0x0B UDRE=Bit5
14
rjmp send ;warten, bis UDR bereit
15
out UDR0,r16 ;senden
16
17
ret
laut Debug wurde 90 18 7E gesendet das MIDI-Gerät empfängt das auch.
So funktioniert aber es nicht:
1
ld r16,X+ ;0x90 ;Statusbyte (RAM-Pointer wird durchs lesen erhöht!)
2
rcall send ;Senden
3
4
ld r16,X+ ;0x18 ;Note laden (RAM-Pointer wird durchs lesen erhöht!)
5
rcall send ;Senden
6
7
ld r16,X+ ;0x7E ;velocity laden (RAM-Pointer wird durchs lesen erhöht!)
8
rcall send ;Senden
9
10
ret
11
12
send:
13
sbis UCSR0A,5 ;frei? USR=UCSRA=0x0B UDRE=Bit5
14
rjmp send ;warten, bis UDR bereit
15
out UDR0,r16 ;senden
16
17
ret
laut Debug wurde 90 18 7E gesendet das MIDI-Gerät empfängt aber
80 03 03.
Ich verstehe nicht wieso? Der inhalt von r16 ist jeweils bei beiden
gleich, nur die Art wie das Register gesetzt wurde nicht.
dann hatte der wohl die richtige intuition:
> Simon Küppers (simon):> schonmal mit nem (Speicher-)Oszilloskop überprüft?
ist der USART korrekt (Baudrate!!) konfiguriert?
hat der AVR eine genaue Taktquelle? der interne RC-Oszollator ist nicht
für die UART-geschichte geeignet(+-5% 'Genauigkeit')
Hab jetzt einen Quarz eingelötet und die fuse entsprechend gesetzt,
gleiches Verhalten.
Die USART müsste korrekt konfiguriert sein, sonst würde das erste
Beispiel ja nicht funktionieren, oder???
Hab ein 8 MHZ Quarz, so müsste eigentlich anstatt der "1000000",
"8000000" stehen, nur dann funktioniert garnichts.
Und mit der "1000000"-Einstellung funktioniert folgendes Beispiel
komischerweise richtig:
@ Stefan D.
>Hab ein 8 MHZ Quarz, so müsste eigentlich anstatt der "1000000",>"8000000" stehen, nur dann funktioniert garnichts.>Und mit der "1000000"-Einstellung funktioniert folgendes Beispiel>komischerweise richtig:>am MIDI-Gerät kommt genau das an.
Dann hast du die DIV8 Fuse gesetzt und dein 8 MHz Quarztakt wird durch 8
geteilt.
MFG
Falk
O.K., vielen Dank!
Hab jetzt das DIV8 Fuse gelöscht und auf das UART-Register auf 8000000
gestellt.
Leider ist das selbe Problem immer noch vorhanden.
Das 1. Beispiel funktioniert und das 2. nicht.