Gast
#625269
Hallo Leute, ich bin gerade dabei einen gewissen Teil eines Protokolls (MIDI-Program-Change-Befehle) mit meinem PIC entgegenzunehmen. Das tut noch nicht so ganz wie ich will. Der ProgChange-Befehl setzt sich folgendermaßen zusammen: C nn pp C= Hex C (bin 12) nn = Channelnumber (in diesem Beispiel noch 0) pp = Preset von 1 bis 127. Es wird also immer ein Status- und ein Datenbyte gesendet. Schaltung und eigentlicher UART-Empfang funktionieren. Mit folgendem Code hab ichs getestet: ISR btfss PIR1, RCIF ; Pruefen ob Interupt durch Receive ausgeloest wurde goto ISREND ; Wenn nein, gehe zu Ende von ISR movfw RCREG ; Empfangsregister auslesen movwf preset ; nach preset schreiben call RS232Send bcf PIR1, RCIF ; Receive-Interupt-Bit wieder loeschen ISREND retfie ; Zurückkehren aus Interuptroutine damit kann ich eben eine 3 schicken und bekomme 003 angezeigt usw... Und dies soll nun die nue ISR mit Auswertung sein, hier passieren seltsame, teils unwillkürlich scheinende Dinge. sieht an den 7-segmentern so aus, also ob teilweise mehrere (alle?) presets durchlaufen werden. Hat vl. jemand einen tip? ISR btfss PIR1, RCIF ; Pruefen ob Interupt durch Receive ausgeloest wurde goto ISREND ; Wenn nein, gehe zu Ende von ISR movfw RCREG ; Empfangsregister auslesen btfsc Flags,1 ; Wurde schon ein Statusbyte (Bit1) empfangen? goto EmpfangStatusByte ; Wenn nein gehe zu Empfang Statusbyte goto EmpfangDatenByte ; Wenn ja, gehe zu Empfan Datenbyte EmpfangStatusByte movwf Bytetemp ; Schreibe Empfangsbyte in TempVariable movlw h'C' ; Als erstes wird der Hexwert "C"(=Programm Change) subwf Bytetemp,0 ; vom Sekundären Empfangspuffer abgezogen subwf Channel,0 ; Danach Wird die Kanalnummer abgezogen btfss STATUS,Z ; Ist das Ergebnis = "0" ? goto MAIN ; Wenn nein, gehe zurück zu Main bsf Flags,1 ; Markiere dass der erste Teil Empfangen wurde goto ISREND ; Beende ISR EmpfangDatenByte bcf Flags, 1 ; Setze Empfangsbytezuordnung wieder zurück, für die ; Nächste Nachricht movwf Bytetemp ; Schreibe Empfangsbyte in TempVariable sublw D'127' ; Ziehe Maximalwert ab btfsc STATUS, Z ; Ist das Ergebnis Null? goto PresetZuweisung ; Wenn ja, gehe zur Zuweisung btfsc STATUS, C ; Ist das Carry-Bit gesetzt? goto PresetZuweisung ; Wenn ja, gehe zur Zuweisung goto ISREND ; Wenn nein, dann Wars wohl nix! PresetZuweisung movfw Bytetemp movwf preset goto ISREND ISREND call RS232Send bcf PIR1, RCIF ; Receive-Interupt-Bit wieder loeschen retfie ; Zurückkehren aus Interuptroutine irgendwie versteh ich nicht o ganz wie ich mit dem simulator umgehen soll.....