PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART auslesen geht nicht/MEGA 16



1hdsquad
09.12.2006, 19:31
Hallo,
ich bin im Moment dabei, den Code für das Auslesen von Midisignalen mit dem MEGA 16 zu schreiben. Ganz zu Anfang muss ich sagen, dass das mein Einstieg in Mikrokontroller und mein erstes Programm ist, also nich in Lachen ausbrechen bei n00b-Fragen ;-)
Ich habe folgenden Code (Ähnlich dem in der Hilfe, in die ich selbstverständlich geschaut habe):

'################################################# ##
'Midi.bas.BAS
'für
'LED-Keyboard

'################################################# ######

$regfile = "m16def.dat"
$framesize = 40
$swstack = 10
$hwstack = 32
$crystal = 16000000
$baud = 31250

$sim 'Nicht vergessen zu entfernen!!!

Config Serialin = Buffered , Size = 100

Dim A As String * 10

Enable Interrupts

Do
If Ischarwaiting() = 1 Then
Input A
Print A
End If
Wait 1
Loop

Beim simulieren führt er die Schleife aus, bis ich eine Taste drücke. Dann wartet er bei "Input A", bis ich noch eine Taste drücke. Dann springt er aber ganz nach oben in die erste Zeile und macht nichts mehr. Warum führt er nicht die Schleife aus bzw. warum springt er raus????
MFG
David

linux_80
10.12.2006, 01:04
Hi,

soviel ich weiss, wartet das Input solange bis ein Enter (Chr(13)) kommt, dann wird alles bis dahin in die Variable übernommen.
Das ist aber bei Midi nicht so, oder !?
Es gibt da aber Befehle, mit denen man einzelne Bytes einlesen kann, dürfte Inkey sein, evtl. hilft Waitkey auch weiter.
Ischarwaiting schaut doch auf die HardwareUART, Du verwendest aber einen Buffer deswegen sollte Waitkey besser sein.

1hdsquad
10.12.2006, 12:02
Ja, du hast recht, so gehts. Bei MIDI probier ich mal die anderen Befehle aus, die du genannt hast. Danke schön!
MFG
David

1hdsquad
11.12.2006, 19:22
Alter, ich dreh am Rad ;-)
Ich raff das einfach nicht, wie ich serielle Daten auslese. Ich nehme an, du bist mit dem Midiprotokoll nicht so vertraut, deshalb folgendes vorweg:
Ich will die sog. Note-On und Note-Off Befehle auslesen. Sie bestehen aus drei Bytes, einem Statusbyte am Anfang, welches sagt "Jetzt kommt der Notenwert die Midi Kanalnummer" und zwei Datenbytes mit der Tastennummer und -druckstärke.
Das Protokoll benutzt jeweils einen Start- und einen Stopbit, der Startbit ist low, der Stoppbit high.
Wenn keine Daten gesendet werden, ist die Leitung high.
Das Statusbyte für Note-On sieht so aus (in bits): 1001nnnn (Kanal 0-15).
Das erste Datenbyte so: 0kkkkkkkk (Tastennummer 0-127).
Das erste Datenbyte so: 0vvvvvvvv (Velocity/Dynamik 0-127).

Das Statusbyte für Note-Off sieht so aus (in bits): 1000nnnn (Kanal 0-15).
Die Datenbytes sind gleich.

Ich krieg das nicht hin, wie lese ich die Bytes aus, ohne mich "zu verhaspeln", also nicht in der Mitte des Bytes anfangen zu lesen? Ich brauch ja nur die Nummern der Tasten und Dynamik und die Befehle On/Off für meine LEDs...
Und noch was anderes: Heißt PWM nur, dass er zwischen den Zustandswechseln der Pins einfach WAIT macht???? Dann müsste ich ja den anderen Code da rein schreiben. alos vor/nach das WAIT.
MFG
David

Vitis
11.12.2006, 21:22
normalerweise liest der AVR selbst aus, sprich die hardware.
Dann holste dir nurnoch bei Belieben die Daten aus dem entsprechenden
Register, thats it.
Du selbst brauchst garnichts dazu tun, ausser die Hardware richtig zu
konfigurieren. Dann erkennt die UART selbst wann ein Byte beginnt
und wo es wieder endet.
Die UART kann sogar noch mehr, sie kann den Programmablauf
bei erhalt eines Zeichens unterbrechen und dann ne
Unterroutine zur Verarbeitung ausführen. Such mal nach Interrupt
und URXC.
Die PWM kannste einfach hardwaremäßig realisieren per Timer.
Dann gibste dem Timer nurnoch den auszugebenen Wert
und das Ding macht den Rest von selber. nix mit wait.
Das Beginn und Endesignal ist durch das 7te Bit ja deutlich
zu unterscheiden, wenn also bit 7 und bit 4 1 sind beginnt die Note.

Gento
11.12.2006, 23:42
@1hdsquad

Kennst Du den kompletten Midi Dialog ?
Schon mal was mit dem PC in der Richtung gemacht ?
Ich habe und was waren viele Zeilen Pascal Code unter Dos ....

Wo genau liegt Dein Problem ?

Gento

1hdsquad
12.12.2006, 19:53
Erstmal danke für die Posts. Was heißt kompletten MIDi-Dialog? Das ist meine erste MIDI-Erfahrung, aber ich hab das Buch "MIDI in Theorie und Praxis" und da ist alles drin. Ich kenne nicht alle Befehle, aber das Protokoll schon...
Pascal hab ich auch noch nie programmiert, nur HTML und MAXSrcipt (3dsMAX 8).
Mein Problem liegt darin, dass ich als Mensch alle klar weiß. Auch könnt ich die Informationen aus dem Datenstrom auslesen, aber a) ist das sozusagen "Realtime", also nicht mal eben gemütlich, und b) ist mir der AVR "unangenehm intelligent" (wie gesagt mein erstes Prog), ich hätte nicht gedacht, dass es so leicht ist, nach dem Motto: "Da schau, da ist dein Eingangsport, und jetzt gib mir mal die fertigen dezimalen Zahlen"...
Naja, ich schau mal weiter...
MFG