www.mikrocontroller.net

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


Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
ldi  r16,0x90    ;Statusbyte
rcall  send    ;Senden

ldi  r16,0x18    ;Note laden
rcall  send    ;Senden

ldi  r16,0x7E    ;velocity laden
rcall  send    ;Senden

ret

send:  
sbis  UCSR0A,5    ;frei?  USR=UCSRA=0x0B UDRE=Bit5
rjmp  send    ;warten, bis UDR bereit
out  UDR0,r16    ;senden

ret
laut Debug wurde 90 18 7E gesendet das MIDI-Gerät empfängt das auch.



So funktioniert aber es nicht:
ld    r16,X+    ;0x90  ;Statusbyte (RAM-Pointer wird durchs lesen erhöht!)
rcall  send        ;Senden

ld    r16,X+    ;0x18  ;Note laden (RAM-Pointer wird durchs lesen erhöht!)
rcall  send        ;Senden

ld    r16,X+    ;0x7E  ;velocity laden (RAM-Pointer wird durchs lesen erhöht!)
rcall  send        ;Senden

ret

send:  
sbis  UCSR0A,5      ;frei?  USR=UCSRA=0x0B UDRE=Bit5
rjmp  send        ;warten, bis UDR bereit
out    UDR0,r16    ;senden

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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, schonmal mit nem (Speicher-)Oszilloskop überprüft?

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, was ist das?

Autor: Joerg X. (Gast)
Datum:

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

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, hab ich beides gemacht:

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

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

Autor: Stefan D. (Gast)
Datum:

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

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die MIDI Daten habe ich so in den SRAM geladen:
ldi  r16,0x90    ;MIDI Statusbyte
STS  0x0060,r16

ldi  r16,0x18    ;MIDI Note  
STS  0x0061,r16

ldi  wr16,0x10    ;MIDI Velocity
STS  0x0062,r16

  

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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')

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, USART hab ich so eingerichtet:
;UART einrichten
  sbi  UCSR0B,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
  ldi  temp,1000000/(31250*16)-1 ;MIDI Baudrate 31250 einstellen
  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:
ldi  r16,0x90    ;Statusbyte
rcall  send    ;Senden

ldi  r16,0x18    ;Note laden
rcall  send    ;Senden

ldi  r16,0x7E    ;velocity laden
rcall  send    ;Senden

ret

send:  
sbis  UCSR0A,5    ;frei?  USR=UCSRA=0x0B UDRE=Bit5
rjmp  send    ;warten, bis UDR bereit
out  UDR0,r16    ;senden

ret
am MIDI-Gerät kommt genau das an.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Stefan D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.