Forum: Mikrocontroller und Digitale Elektronik AVR UART-MIDI - Sehr komisches Verhalten


von Stefan D. (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Hmmm, schonmal mit nem (Speicher-)Oszilloskop überprüft?

von Stefan D. (Gast)


Lesenswert?

nein, was ist das?

von Joerg X. (Gast)


Lesenswert?

Hast du auch den (x-)Pointer initialisiert, also die RAM-Adresse 
geladen? und auch die Daten in den RAM gelegt?

von Stefan D. (Gast)


Lesenswert?

Ja, hab ich beides gemacht:

Den x-pointer hab ich so initialisiert:
1
ldi   XL, LOW(0x0090)
2
ldi   XH, HIGH(0x0090)

Wie gesagt, wenn ich debugge werden auch die richtigen Werte ausgegeben.
Irgendwie funktioniert der RAM-Speicher nicht richtig.

von Stefan D. (Gast)


Lesenswert?

äh, meine
ldi   XL, LOW(0x0060)
ldi   XH, HIGH(0x0060)

von Stefan D. (Gast)


Lesenswert?

Die MIDI Daten habe ich so in den SRAM geladen:
1
ldi  r16,0x90    ;MIDI Statusbyte
2
STS  0x0060,r16
3
4
ldi  r16,0x18    ;MIDI Note  
5
STS  0x0061,r16
6
7
ldi  wr16,0x10    ;MIDI Velocity
8
STS  0x0062,r16

  

von Joerg X. (Gast)


Lesenswert?

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')

von Stefan D. (Gast)


Lesenswert?

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???

von Stefan D. (Gast)


Lesenswert?

hmm, USART hab ich so eingerichtet:
1
;UART einrichten
2
  sbi  UCSR0B,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
3
  ldi  temp,1000000/(31250*16)-1 ;MIDI Baudrate 31250 einstellen
4
  out  UBRR0L,temp

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:
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
am MIDI-Gerät kommt genau das an.

von Falk B. (falk)


Lesenswert?

@ 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


von Stefan D. (Gast)


Lesenswert?

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.

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.