-         

Ergebnis 1 bis 7 von 7

Thema: UART auslesen geht nicht/MEGA 16

  1. #1
    1hdsquad
    Gast

    UART auslesen geht nicht/MEGA 16

    Anzeige

    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):
    Code:
    '###################################################
    '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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    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.

  3. #3
    1hdsquad
    Gast
    Ja, du hast recht, so gehts. Bei MIDI probier ich mal die anderen Befehle aus, die du genannt hast. Danke schön!
    MFG
    David

  4. #4
    1hdsquad
    Gast
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    @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

  7. #7
    1hdsquad
    Gast
    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 .
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •