watterott ;title =
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29

Thema: MIDI Monitor mit Bascom und Atmega8

  1. #21
    Spaghetti-Coder
    Registriert seit
    10.11.2016
    Beiträge
    59
    Hallo hpt_neu,
    in Case Ton ist noch ein Fehler von mir, schreibe das mal so:
    Case Ton:
    If Zeichen <> 144 Then
    Laut = Zeichen
    Toggle Portd.5 ' singnalisieren
    End If
    Status = Suchen
    End Select
    Hat aber glaube ich nichts mit dem 1/2 sec Problem zu tun.
    Nimm zum Testen mal alle! LCD Befehl raus, du hast ja noch die LEDs dran zum prüfen.
    Wenn jetzt immer noch soviel Zeit zwischen Taste drücken und LED vergeht, dann frage ich mich, ob das MIDI tatsächlich sofort sendet.
    Es ist so nichts zu sehen, was den Interrupt und damit den Toggle am Anfang verhindert. Folglich muss die LED sofort angehen.
    Was du noch beachten musst, sind die anderen Befehle, die evtl. gesendet werden. Die LED togglet dabei so schnell, dass du das übersiehst, weil sie nur im ms-Bereich an ist. Du hast keinen Logikanalyzer, der das Signal aufzeichnen kann?

  2. #22
    Kabelträger
    Registriert seit
    28.12.2016
    Beiträge
    13
    Servus Basti - nichts geändert. Man sieht, dass die Led am Beginn der ISR feuert, aber die Led nach Case Ton nicht reagiert, wenn zu schnell gedrückt wird ......
    Lässt man etwas Zeit, dann geht's (mit und ohne LCD -Anzeige).

  3. #23
    Spaghetti-Coder
    Registriert seit
    10.11.2016
    Beiträge
    59
    Hallo hpt_neu,
    ich sehe gerade, dass du keine Stackwerte angegeben hast. Füge mal dies mal ganz oben ein:
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    Hast du einen Logikanalyzer?

  4. #24
    Kabelträger
    Registriert seit
    28.12.2016
    Beiträge
    13
    Hallo Basti,
    Stackwerte sind es nicht ....
    Lobikanalyzer hab ich nicht, aber Oszilloskop und einen Midi-Monitor für den PC, der die Auswertung locker schafft. Sollte meiner Meinung auch mit dem µC möglich sein, oder? Was möchtest du vom Logikanalyzer wissen?

  5. #25
    Administrator Avatar von DON
    Registriert seit
    19.11.2016
    Ort
    Herford
    Beiträge
    368
    Das muss noch für deine Bedürfnisse angepasst werden.

    PHP-Code:
    $regfile "m328pdef.dat"
    $crystal 16000000
    $hwstack 
    128
    $swstack 
    128
    $framesize 
    128

    Enable Interrupts
    Config Serialin 
    Buffered Size 10                      
    Dim Happen 
    As String 10
    Dim Buffer 
    As String 10 At _rs232inbuf0 Overlay
    Dim Lang 
    As Byte Looping As Byte
    $baud 
    9600

    Config Portc.0 
    Output Led Alias Portc.0
    Config Portc.1 
    Output Led2 Alias Portc.1
    Led 
    1
    Led2 
    1
    Wait 1
    Led 
    0
    Led2 
    0

    Do
     If 
    Ischarwaiting() = 1 Then Gosub Daten
      
    Loop
    End

    Daten
    :
    Waitms 10' das muss angepasst werden.
    '
    Input Buffer Noecho
    Lang 
    Len(buffer)

    Happen Mid(buffer 3)

    If 
    Happen "AX1" Then
     Led 
    1
     End 
    If
    If 
    Happen "BX1" Then
    Led 
    0
    End 
    If
    If 
    Happen "AX2" Then
     Led2 
    1
     End 
    If
    If 
    Happen "BX2" Then
    Led2 
    0
    End 
    If

    Buffer "          "
    Happen "          "
    Clear Serialin0

    Return 
    Geändert von DON (06.01.2017 um 18:15 Uhr)
    Ein Mensch mag noch so herausragende Fähigkeiten haben – wenn er arrogant und selbstsüchtig ist, sind sie nichts wert.
    Konfuzius


  6. #26
    Spaghetti-Coder
    Registriert seit
    10.11.2016
    Beiträge
    59
    Hallo hpt_neu,
    es wird meistens nicht gerne gesehen, wenn man in mehreren Foren postet ohne dies deutlich zu machen.

    Du kannst einfach einen Hinweis geben auf die andere Aktivität.
    Allerdings musst du dann immer noch damit rechnen, dass sich einige Leute zurückziehen.

    Zu deinem Problem wurde dir dort auch der Hinweis gegeben, dass die Erkennung und Verarbeitung der Bytes wesentlich schneller durchgeführt wird, als die Übertragung. Es macht meiner Meinung nach wenig Sinn, darauf zu bestehen, dass der Controller zwischen zwei Bytes nicht 5000 Zyklen rumpennt sondern 5100, wie das evtl. mit ganz vielen Tricks zu erreichen wäre.

    Für sehr wichtig halte ich den Hinweis, dass nicht jede Taste einen 3er-Block an Bytes überträgt, und besonders, dass die 144 fehlen kann. Auch der Hinweis, dass Statusbytes immer das MSB gesetzt haben. Beides wird in dem Schnipsel von mir nicht betrachtet. Ist also nicht weiter verwunderlich, dass das Programm nicht die Ausgabe macht, die es sollte. Mir fehlt die Zeit, die Doku zum Midi Protokoll zu studieren, dass denke ich, solltest du machen.

    Den Logikanalyzer hätte ich genutzt, um genau zu sehen, was übertragen wird. Dass geht nicht über LEDs oder so.
    Was du probieren kannst, ist die Ausgabe jedes empfangenen Bytes in einen Soft-UART, den du möglichst schnell laufen lässt. Wenn der sicher fertig ist, bevor das nächste Byte komplett übertragen wurde, dann könntest du am PC verfolgen, was da tatsächlich ankommt.

    Wenn du das mal ausprobieren möchtest, dann gib mal Bescheid. Die paar Zeilen Code sind schnell erstellt.

  7. #27
    Kabelträger
    Registriert seit
    28.12.2016
    Beiträge
    13
    Werte Experten!
    Inzwischen habe ich einiges probiert und bin auch weitergekommen. Dabei hat meiner Meinung die Entkoppelung der ISR vom Hauptprogramm mittels Ringspeicher am meisten gebracht. So kann in einer kurz gehaltenen ISR eine schnelle Tastenbetätigung erkannt werden. Jedoch habe ich jetzt ein Phänomen bei der Auswertung, bei dem ich wirklich Hilfe benötige.
    Beim Auslesen aus dem Ringspeicher ist es mir gelungen, mit einer einfachen Version, wo ich nur nach dem MIDI-Befehl „144“ (das bedeutet Taste wurde betätigt, am Midi-Kanal 0) abfrage und darauf reagiere die beiden folgenden Bytes auszulesen und auszuwerten. Allerdings tritt dabei ein für mich unerklärlicher Effekt auf, welchen ich im angehängten Listing auch dokumentiere.
    Es funktioniert bis jetzt nur die eine Version, in der ich gleich nach der Abfrage:
    If Wert1 = 144 Then ' wenn 144 kommt
    Gosub Incr_rdindex ' Lesezeiger erhöhen
    End If
    das End einfüge, bzw. einfügen muss,damit alles in Echtzeit funktioniert!
    Sobald ich jedoch auch die beiden folgenden Bytes in dieser Schleife ebenfalls mit einlesen möchte, funktionieren die Tastenbetätigungen nur mehr etwa im Sekundentakt! Jede schnellere Betätigung wird nicht erkannt! Warum? Wo ist mein Denkfehler, oder liegt sogar ein Fehler beim Aufruf der ISR vor, dass nicht alle Register oder Werte gerettet werden?
    Ich habe mit und ohne Unterprogramm-Aufrufen getestet – immer der gleiche Effekt!


    '************************************************* ***********************
    Main:
    If Rdindex = Wrindex Then ' sollte kein Zeichen empfangen werden
    Locate 1 , 1
    Lcd "nix da"
    Else
    Wert1 = Buffer(rdindex)
    If Wert1 = 144 Then ' wenn 144 kommt
    Gosub Incr_rdindex
    End If 'dieses end if muß sein damit es funkt!
    Gosub Einlesen
    Gosub Auswerten
    ' Diese Version mit dem 3 Zeilen oberhalb stehenden End if funktioniert in
    ' Echtzeit, jedoch nur, wenn nach der Abfrage auf 144 das End if folgt!
    ' Wenn ich Einlesen und Auswerten in die obere If Wert1=144 - Schleife
    ' einschließen möchte, weil ja nur dann, wenn die 144 kommt auch
    ' die beiden nächsten Bytes relevant sind, dann funktioniert es nicht mehr!!! ????
    ' Warum ???
    ' Konkret: Es funktionieren die Tastenanschläge, jedoch mit
    ' ca. 1/2 Sek. Wartezeit zwischen jeder Betätigung!
    ' Werden die Tasten schneller angeschlagen, werden sie verschluckt!
    ' Anmerkung:
    ' --> wenn oberes endif auskommentiert wird, werden die unteren 3 Zeilen
    ' aktiviert, da ja, wenn kein 144 kommt, der Lesezeiger erhöht werden muß!
    ' Else
    ' Gosub Incr_rdindex
    ' End If

    End If
    Goto Main
    '***************** ISR - Empfangen *****************
    Onrxd:
    Zeichen = Udr 'gelesenes Byte
    If Zeichen < 145 Then ' 254 ausscheiden
    Buffer(wrindex) = Zeichen 'Byte in Buffer an n-te Stelle
    Incr Wrindex ' Schreib-Zeiger erhöhen
    If Wrindex > Bufsize Then
    Wrindex = 1
    End If
    End If
    Return
    ' **************************************************
    '=========== UP:Lese- Zeiger berechnen ==============
    Incr_rdindex:
    Incr Rdindex
    If Rdindex > Bufsize Then
    Rdindex = 1
    End If
    Return
    '================================================= ===
    Einlesen:
    ' Waitms 1
    Wert2 = Buffer(rdindex)
    Gosub Incr_rdindex ' Lesezeiger erhöhen
    ' Waitms 1
    Wert3 = Buffer(rdindex)
    Gosub Incr_rdindex ' Lesezeiger erhöhen
    Return
    '================================================= ====
    Auswerten:
    'auswerten von Byte 2 und Byte 3
    If Wert2 = 95 Then ' Ton_h
    If Wert3 > 1 Then
    Portd.5 = 1
    Else
    Portd.5 = 0
    End If
    End If
    ' anderer Ton
    If Wert2 = 96 Then ' Ton_c
    If Wert3 > 1 Then
    Portd.6 = 1
    Else
    Portd.6 = 0
    End If
    End If
    Return
    '================================================= ====

  8. #28
    Administrator Avatar von DON
    Registriert seit
    19.11.2016
    Ort
    Herford
    Beiträge
    368
    Ein Mensch mag noch so herausragende Fähigkeiten haben – wenn er arrogant und selbstsüchtig ist, sind sie nichts wert.
    Konfuzius


  9. #29
    Kabelträger
    Registriert seit
    28.12.2016
    Beiträge
    13
    Danke Don - den Monitor habe ich auch - aber ich möchte ja mit dem Controller --> siehe #14 !!!

Lesezeichen

Lesezeichen

Berechtigungen

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