Forum: Mikrocontroller und Digitale Elektronik Midi-Ausgabe mit AVR klappt nicht


von Daniel C. (dan1el)


Lesenswert?

Hallo,

bisher habe ich Midibefehle mit At89C2051 über Bascom-8051 immer 
folgendermassen ausgegeben, was einwandfrei funktioniert:

$baud = 31250
Open "com3.1:31250" For Output As #1
Put #1 , 153   'kanal
Put #1 , 45     'ton
Put #1 , 90     'lautstärke
Close #1

(hier als Beispiel die Ausgabe eines Tons auf Kanal 10)


Jetzt bin ich auf Bascom-AVR und AtMega32 umgestiegen und habe das selbe 
dort folgendermassen probiert:

$baud = 31250
Open "comd.1:31250" For Output As #1
(alternativ: Open "comd.1:31250,8,n,1" For Output As #1 )
Put #1 , 153
Put #1 , 45
Put #1 , 90
Close #1

Hier sollen die Midibefehle ebenfalls über TXD (portbit d.1) ausgegeben 
werden, deshalb comd.1.
Midi ist ja ein serielles Protokoll mit 31250Baud, 8 Bit, noParity, 1 
Stopbit, daher bei der alternativen Open-Variante die anderen Parameter.

Leider funktioniert die Übertragung mit dem AVR überhaupt nicht. Zuerst 
dachte ich, vielleicht schwingt der Oszillator auf der falschen 
Frequenz, aber $crystal = 8000000  ist völlig ok (sonst hatte es mit der 
Baudrate ja nicht mehr hingehauen).
Dann habe ich mal ein Multimeter an PinD.1 (TXD) gegen GND 
angeschlossen, da tut sich anscheinend überhaupt nichts (beim At89C2051 
ließen sich so auf jeden Fall im Sendebetrieb leichte bis mittlere 
Spannungsschwankungen an TXD feststellen).
Daher vermute ich, dass der AVR gar keine Daten an das Midigerät 
übermittelt.
Stellt sich nur die Frage, woran das liegen kann!
Habe ich möglicherweise den UART nicht richtig konfiguriert?

Wenn jemand eine Idee hat, bitte melden!

Viele Grüsse,
Daniel

von Falk B. (falk)


Lesenswert?

@ Daniel C. (dan1el)

>Leider funktioniert die Übertragung mit dem AVR überhaupt nicht. Zuerst
>dachte ich, vielleicht schwingt der Oszillator auf der falschen
>Frequenz, aber $crystal = 8000000  ist völlig ok (sonst hatte es mit der
>Baudrate ja nicht mehr hingehauen).

;-)
Die Angabe $crystal = 8000000 bedeutet NICHT, dass BASCOM den Oszillator 
auf 8 MHz einstellt, sonder sagt BASCOM, das DU dafür sorgst, dass der 
Oszillator auf 8 MHz schwingt. Und für MIDI, welches quasi RS232 ist, 
sollte es schon ein Quarzoszillator sein. Den muss man per AVR Fuses 
einschalten.

>Habe ich möglicherweise den UART nicht richtig konfiguriert?

Wahrscheinlich.

AVR-Tutorial: UART
http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

MfG
Falk

von Daniel C. (dan1el)


Lesenswert?

Hallo Falk,
Danke für die schnelle Antwort!
Der Oszillator schwingt wie gesagt auf 8Mhz, hatte ich schon per Fuse 
eingeschaltet und auch überprüft.

Den angegebenen Artikel muss ich mir noch mal genauer anschauen, hatte 
ich neulich schon mal überflogen.

Wenn sonst noch jemand eine Idee hat, bitte melden!
Daniel

von Daniel C. (dan1el)


Lesenswert?

so, hab jetzt noch mal nachgemessen, der txd bleibt die ganze zeit auf 
hi, da tut sich nichts.

habe jetzt auch noch mal den artikel genauer durchgelesen und auch noch 
mal alles, was unter bascom über den uart geschrieben wird.

so wie ich das sehe, müsste es eigentlich funktionieren.

oder gibt es beim mega32 irgendwelche fuses, die den uart standardmässig 
deaktivieren?
habe beim auslesen der fuses auf jeden fall nichts in der richtung 
entdeckt.

wenn es mit dem 89C2051er geht, warum nicht erst recht mit dem M32er? 
das macht mich irgendwie stutzig.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>oder gibt es beim mega32 irgendwelche fuses, die den uart standardmässig
>deaktivieren?

Nein.

Es liegt aber mit Sicherheit nicht am Mega32, sondern 
höchstwahrscheinlich an der UART-Init. Leider kenne ich mich mit BASCOM 
nicht aus, aber unter ASM ticken alle meine MIDI-Controller lustig vor 
sich hin :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?


von Daniel C. (dan1el)


Lesenswert?

hallo,
danke für die Antworten, das problem ist gelöst.

durch die verwendung von $baud und open habe ich den hardware-uart und 
den software-uart durcheinandergeworfen, durch simples streichen der 
"$baud = 31250"-Zeile funktioniert es jetzt!

hatte deswegen auch mal im bascom-forum nachgefragt und dort die o.g. 
antwort erhalten. wen es interessiert:
http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&p=31287#31287

viele grüsse und frohe festtage,
daniel

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.