18.01.2005, 16:37
Hi
Hatte vor einiger Zeit schon mal hier gepostet. Aber jetzt komme ich wieder nicht weiter, dh. Verstehe nicht warum das Prog nicht läuft.
Hier erstmal eine Erläuterung damit überhaut eine Chance besteht das Prog nachzuvollziehen. Wie gesagt handelt es sich um ein kleines Effektgerät. Dieses verfügt über 16 Taster. Jeder dieser Taster stellt einen 16tel Note dar und kann entweder gesetzt sein (LED leuchtet) oder eben nicht (LED aus).
Später möchte ich das ganze noch um16 LEDs ergänzen, sodass das ganze eine typische Drumcomputeransteuerung wird.
Das Gerät verfügt darüber hinaus noch über einen Audioein- und Ausgang. In den Eingang wird zB ein Palttenspieler eingesteckt und der Ausgang kommt dann zB ins Mischpult.
Ist nun ein Taster gesetzt so lässt die Schaltung für dieses 16tel eines Takts das Audiosignal unverändert durch. Ist ein Taster nicht gesetzt so wird das Audiosignal mute/stumm geschaltet. Das ganze Gerät zerhackt also die Audiosignale. In der Fachsprache ein Gater oder Apreggiator.
Alles ist soweit fertig außer dass das Prog läuft. Für Tips, Anregungen, Verbesserungsvorschläge, Verbesserungen… und vor allem Fehlerfunde wäre ich sehr dankbar.
MfG Daniel
Hier der Code:
;************************************************* ***********************************
;
; BRAINS
; MIDI-Scratch Apreggiator
;
;************************************************* ***********************************
list p=16F874
#include <P16F874.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC
;************************************************* ***********************************
;
;Beschreibung
;Am Eingang [] ist ein MIDIClock Signal anzulegen. Dieser Takt steuert die 16
;
;Bei jeder der 16 16tel Noten kann mittels der Taster gewählt werden, ob das anliegende
;Audio-Signal für diese Zeit MUTE geschaltet werden soll oder nicht. Der erhaltene Effekt
;ist ein Apreggiatoreffekt.
;
;
;
;************************************************* ***********************************
; Variablen festlegen
MIDI_CL EQU 0x20 ;MIDI_CL-Byte
MIDI_ST EQU 0x21
;MIDI_SP EQU 0x22
COUNTER_6 EQU 0x23
HLS1 EQU 0x24
HLS2 EQU 0x25
OBYTE1 EQU 0x26
OBYTE2 EQU 0x27
TAKTART EQU 0x28 ;Bit0: set=3/4 Takt; n.set=4/4 Takt
;Bit1: set=goto MIDI_IN_ST; n.set=goto MIDI_IN_CL
HILFE1 EQU 0x2C
HILFE2 EQU 0x2D
;************************************************* ***********************************
; IO-PIN-BELEGUNG
;
; Ao OUT (FX)
;
; Bo T0
; B1 T1
; B2 T2
; B3 T3
; B4 T4
; B5 T5
; B6 T6
; B7 T7
;
; D0 T8
; D1 T9
; D2 T10
; D3 T11
; D4 T12
; D5 T13
; D6 T14
; D7 T15
;
; xx MIDI IN
;
;************************************************* ***********************************
bcf STATUS, RP0 ;auf Bank 0 umschalten
bcf ADCON0,0 ;ADC ausschalten
; INIT UART
bsf STATUS, RP0 ;auf Bank 1 umschalten
movlw 0x09 ;Baudrate auf 31250 Baud
movwf SPBRG
bcf TXSTA, BRGH ;low speed Baudrate
bcf TXSTA, SYNC ;enable the serial port
bcf STATUS, RP0 ;auf Bank 0 umschalten
bsf RCSTA, SPEN ;enable the serial port
bsf RCSTA, CREN ;enable reception
bcf RCSTA, FERR
bcf RCSTA, OERR
bcf RCSTA, RX9D
bsf STATUS, RP0 ;auf Bank 1 umschalten
; ADC auf I/O umschalten
movlw 0x06
movwf ADCON1
bcf TRISA,0 ;PortA,0 auf Ausgang setzten
; PortB auf EINGANG setzten
movlw B'11111111'
movwf TRISB
bsf TRISC,7 ;PortC,7 auf Eingang
; PortD auf EINGANG setzten
movlw B'11111111'
movwf TRISD
bcf STATUS, RP0 ;auf Bank 0 umschalten
; COUNTER_6 laden
movlw D'249'
movwf COUNTER_6
; OBYTE1 und OBYTE2 löschen
clrf OBYTE1
clrf OBYTE2
; HILFE1 und HILFE2 löschen
clrf HILFE1
clrf HILFE2
; HLS1 und HLS2 als Grundeinstellung laden
movlw B'00110011'
movwf HLS1
movlw B'00110011'
movwf HLS2
bcf TAKTART,0 ;als Grundeinstellung 4/4 Takt
; MIDI_CL, ST, SP Initialisierung
movlw 0xF8
movwf MIDI_CL
movlw 0xFA
movwf MIDI_ST
; movlw 0xFC
; movwf MIDI_SP
bcf STATUS, RP0 ;auf Bank 0 umschalten
;****** Programmstart **************************************************
MIDI_IN_ST
btfss PIR1,RCIF ;überspringe nachfolgenden Befehl, wenn Bit5 gesetzt ist, dh MIDI_IN_BYTE liegt vor
goto TASTENABFRAGE_ST
bcf PIR1,RCIF ;lösche das Bit, welches einen MidiEmpfang anzeigt
movf RCREG,W ;kopiere RCREG nach W
xorwf MIDI_ST,W ;es wird geprüft, ob das angekommene Byte ein StartBefehl war und das Ergebnis wird in W gespeichert
btfsc STATUS,Z ;prüfe das ZeroFlag: 0: XOR Verknüpfung war wahr
goto MIDI_IN_ST
MIDI_IN_CL ;JA, es war ein StartBit, also weiter
btfss PIR1,RCIF ;überspringe nachfolgenden Befehl, wenn Bit5 gesetzt ist, dh MIDI_IN_BYTE liegt vor
goto TASTENABFRAGE_CL
movf RCREG,W ;kopiere RCREG nach W
xorwf MIDI_CL,W ;es wird geprüft, ob das angekommene Byte ein ClockBefehl war
btfsc STATUS,Z ;prüfe das ZeroFlag: 0: XOR Verknüpfung war wahr
goto MIDI_IN_ST
;****** Counter ************************************************** ************************************************** *****
incfsz COUNTER_6,1 ;COUNTER_6 +1 und Ergebnis wieder in COUNTER_6 speichern - falls das Ergebnis=o => ingnoriere nachfolg. Befehl
goto MIDI_IN_CL
movlw D'249'
movwf COUNTER_6
;****** Positionstest ************************************************** ****************************************
btfss OBYTE1,0 ;prüfe, ob hier die aktuelle Position ist? - Nein, dann gehe zum nächsten Befehl
goto OBYTE1_0NOTSET ;springe zu OBYTE1_0NOTSET
btfss OBYTE1,1
goto OBYTE1_1NOTSET
btfss OBYTE1,2
goto OBYTE1_2NOTSET
btfss OBYTE1,3
goto OBYTE1_3NOTSET
btfss OBYTE1,4
goto OBYTE1_4NOTSET
btfss OBYTE1,5
goto OBYTE1_5NOTSET
btfss OBYTE1,6
goto OBYTE1_6NOTSET
btfss OBYTE1,7
goto OBYTE1_7NOTSET
btfss OBYTE2,0
goto OBYTE2_0NOTSET
btfss OBYTE2,1
goto OBYTE2_1NOTSET
btfss OBYTE2,2
goto OBYTE2_2NOTSET
btfss OBYTE2,3
goto OBYTE2_3NOTSET
btfss OBYTE2,4
goto OBYTE2_4NOTSET
btfss OBYTE2,5
goto OBYTE2_5NOTSET
btfss OBYTE2,6
goto OBYTE2_6NOTSET
btfss OBYTE2,7
goto OBYTE2_7NOTSET
;**** OBYTES 1 + 2 ************************************************** **********************************************
OBYTE1_0NOTSET
bsf OBYTE1,0 ;setze OBYTE,0
btfss HLS1,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_1NOTSET
bsf OBYTE1,1 ;setze OBYTE,1
btfss HLS1,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_2NOTSET
bsf OBYTE1,2 ;setze OBYTE,2
btfss HLS1,2
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_3NOTSET
bsf OBYTE1,3 ;setze OBYTE,3
btfss HLS1,3
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_4NOTSET
bsf OBYTE1,4 ;setze OBYTE,4
btfss HLS1,4
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_5NOTSET
bsf OBYTE1,5 ;setze OBYTE,5
btfss HLS1,5
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_6NOTSET
bsf OBYTE1,6 ;setze OBYTE,6
btfss HLS1,6
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_7NOTSET
bsf OBYTE1,7 ;setze OBYTE,7
btfss HLS1,7
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_0NOTSET ;hier beginnt HLS2********************************************** **************
bsf OBYTE2,0 ;setze OBYTE,0
btfss HLS2,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_1NOTSET
bsf OBYTE2,1 ;setze OBYTE,1
btfss HLS2,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_2NOTSET
bsf OBYTE2,2 ;setze OBYTE,2
btfss HLS2,2
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_3NOTSET
bsf OBYTE2,3 ;setze OBYTE,3
btfsc TAKTART,0 ; 3/4 oder 4/4 Takt? überspringe nachfolgenden Befehl bei 4/4Takt
goto TAKT_3_4
btfss HLS2,3
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_4NOTSET
bsf OBYTE2,4 ;setze OBYTE,4
btfss HLS2,4
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_5NOTSET
bsf OBYTE2,5 ;setze OBYTE,5
btfss HLS2,5
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_6NOTSET
bsf OBYTE2,6 ;setze OBYTE,6
btfss HLS2,6
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_7NOTSET
bsf OBYTE2,7 ;setze OBYTE,7
btfss HLS2,7
goto LOWTAKTENDE
bsf PORTA,0 ;FX high
goto TAKTENDE
;***** Sprungmarken ************************************************** ********************
LOWOUT
bcf PORTA,0
goto MIDI_IN_CL
LOWTAKTENDE
bcf PORTA,0
goto TAKTENDE
TAKTENDE
clrf OBYTE1
clrf OBYTE2
goto MIDI_IN_CL
TAKT_3_4
btfss HLS2,3
goto LOWTAKTENDE
bsf PORTA,0
goto TAKTENDE
;**** Tastenabfrage ************************************************** *******************
TASTENABFRAGE_ST
bsf TAKTART, 1
TASTENABFRAGE_CL
TASTER_0 ;Tastenabfrage
btfss PORTB,0 ;überspringe nachfolgenden Befehl, wenn PORTB,0 gesetzt ist
goto CLEAR_HILFE_0 ;gehe zu CLEAR_HILFE_0
btfss HILFE1,0 ;überspringe nachfolgenden Befehl, wenn HILFE1,0 gesetzt ist
goto INVERT_0 ;gehe zu INVERT_0
goto TASTER_1 ;gehe zur nächsten Tasterabfrage
CLEAR_HILFE_0 ;hier wird das CLEAR_HILFE_0-Bit gelöscht
bcf HILFE1,0
goto TASTER_1
INVERT_0 ;hier wird die aktuelle Position invertiert
bsf HILFE1,0
btfsc HLS1,0
btfss HLS1,0
goto SETZEN_0
bcf HLS1,0
goto TASTER_1
SETZEN_0
bsf HLS1,0
goto TASTER_1
TASTER_1
btfss PORTB,1
goto CLEAR_HILFE_1
btfss HILFE1,1
goto INVERT_1
goto TASTER_2
CLEAR_HILFE_1
bcf HILFE1,1
goto TASTER_2
INVERT_1
bsf HILFE1,1
btfsc HLS1,1
btfss HLS1,1
goto SETZEN_1
bcf HLS1,1
goto TASTER_2
SETZEN_1
bsf HLS1,1
goto TASTER_2
TASTER_2
btfss PORTB,2
goto CLEAR_HILFE_2
btfss HILFE1,2
goto INVERT_2
goto TASTER_3
CLEAR_HILFE_2
bcf HILFE1,2
goto TASTER_3
INVERT_2
bsf HILFE1,2
btfsc HLS1,2
btfss HLS1,2
goto SETZEN_2
bcf HLS1,2
goto TASTER_3
SETZEN_2
bsf HLS1,2
goto TASTER_3
TASTER_3
btfss PORTB,3
goto CLEAR_HILFE_3
btfss HILFE1,3
goto INVERT_3
goto TASTER_4
CLEAR_HILFE_3
bcf HILFE1,3
goto TASTER_4
INVERT_3
bsf HILFE1,3
btfsc HLS1,3
btfss HLS1,3
goto SETZEN_3
bcf HLS1,3
goto TASTER_4
SETZEN_3
bsf HLS1,3
goto TASTER_4
TASTER_4
btfss PORTB,4
goto CLEAR_HILFE_4
btfss HILFE1,4
goto INVERT_4
goto TASTER_5
CLEAR_HILFE_4
bcf HILFE1,4
goto TASTER_5
INVERT_4
bsf HILFE1,4
btfsc HLS1,4
btfss HLS1,4
goto SETZEN_4
bcf HLS1,4
goto TASTER_5
SETZEN_4
bsf HLS1,4
goto TASTER_5
TASTER_5
btfss PORTB,5
goto CLEAR_HILFE_5
btfss HILFE1,5
goto INVERT_5
goto TASTER_6
CLEAR_HILFE_5
bcf HILFE1,5
goto TASTER_6
INVERT_5
bsf HILFE1,5
btfsc HLS1,5
btfss HLS1,5
goto SETZEN_5
bcf HLS1,5
goto TASTER_6
SETZEN_5
bsf HLS1,5
goto TASTER_6
TASTER_6
btfss PORTB,6
goto CLEAR_HILFE_6
btfss HILFE1,6
goto INVERT_6
goto TASTER_7
CLEAR_HILFE_6
bcf HILFE1,6
goto TASTER_7
INVERT_6
bsf HILFE1,6
btfsc HLS1,6
btfss HLS1,6
goto SETZEN_6
bcf HLS1,6
goto TASTER_7
SETZEN_6
bsf HLS1,6
goto TASTER_7
TASTER_7
btfss PORTB,7
goto CLEAR_HILFE_7
btfss HILFE1,7
goto INVERT_7
goto TASTER_8
CLEAR_HILFE_7
bcf HILFE1,7
goto TASTER_8
INVERT_7
bsf HILFE1,7
btfsc HLS1,7
btfss HLS1,7
goto SETZEN_7
bcf HLS1,7
goto TASTER_8
SETZEN_7
bsf HLS1,7
goto TASTER_8
TASTER_8
btfss PORTD,0
goto CLEAR_HILFE_8
btfss HILFE2,0
goto INVERT_8
goto TASTER_9
CLEAR_HILFE_8
bcf HILFE2,0
goto TASTER_9
INVERT_8
bsf HILFE2,0
btfsc HLS2,0
btfss HLS2,0
goto SETZEN_8
bcf HLS2,0
goto TASTER_9
SETZEN_8
bsf HLS2,0
goto TASTER_9
TASTER_9
btfss PORTD,1
goto CLEAR_HILFE_9
btfss HILFE2,1
goto INVERT_9
goto TASTER_10
CLEAR_HILFE_9
bcf HILFE2,1
goto TASTER_10
INVERT_9
bsf HILFE2,1
btfsc HLS2,1
btfss HLS2,1
goto SETZEN_9
bcf HLS2,1
goto TASTER_10
SETZEN_9
bsf HLS2,1
goto TASTER_1
TASTER_10
btfss PORTD,2
goto CLEAR_HILFE_10
btfss HILFE2,2
goto INVERT_2
goto TASTER_11
CLEAR_HILFE_10
bcf HILFE2,2
goto TASTER_11
INVERT_10
bsf HILFE2,2
btfsc HLS2,2
btfss HLS2,2
goto SETZEN_10
bcf HLS2,2
goto TASTER_11
SETZEN_10
bsf HLS2,2
goto TASTER_10
TASTER_11
btfss PORTD,3
goto CLEAR_HILFE_11
btfss HILFE2,3
goto INVERT_3
goto TASTER_12
CLEAR_HILFE_11
bcf HILFE2,3
goto TASTER_12
INVERT_11
bsf HILFE2,3
btfsc HLS2,3
btfss HLS2,3
goto SETZEN_11
bcf HLS2,3
goto TASTER_12
SETZEN_11
bsf HLS2,3
goto TASTER_12
TASTER_12
btfss PORTD,4
goto CLEAR_HILFE_12
btfss HILFE2,4
goto INVERT_12
goto TASTER_13
CLEAR_HILFE_12
bcf HILFE2,4
goto TASTER_13
INVERT_12
bsf HILFE2,4
btfsc HLS2,4
btfss HLS2,4
goto SETZEN_12
bcf HLS2,4
goto TASTER_13
SETZEN_12
bsf HLS2,4
goto TASTER_13
TASTER_13
btfss PORTD,5
goto CLEAR_HILFE_13
btfss HILFE2,5
goto INVERT_13
goto TASTER_14
CLEAR_HILFE_13
bcf HILFE2,5
goto TASTER_14
INVERT_13
bsf HILFE2,5
btfsc HLS2,5
btfss HLS2,5
goto SETZEN_13
bcf HLS2,5
goto TASTER_14
SETZEN_13
bsf HLS2,5
goto TASTER_14
TASTER_14
btfss PORTD,6
goto CLEAR_HILFE_14
btfss HILFE2,6
goto INVERT_14
goto TASTER_15
CLEAR_HILFE_14
bcf HILFE2,6
goto TASTER_15
INVERT_14
bsf HILFE2,6
btfsc HLS2,6
btfss HLS2,6
goto SETZEN_14
bcf HLS2,6
goto TASTER_15
SETZEN_14
bsf HLS2,6
goto TASTER_15
TASTER_15
btfss PORTD,7
goto CLEAR_HILFE_15
btfss HILFE2,7
goto INVERT_15
goto MIDI_IN_CL
CLEAR_HILFE_15
bcf HILFE2,7
goto MIDI_IN_CL
INVERT_15
bsf HILFE2,7
btfsc HLS2,7
btfss HLS2,7
goto SETZEN_15
bcf HLS2,7
goto MIDI_IN_CL
SETZEN_15
bsf HLS2,7
btfss TAKTART, 1 ;teste ob das Hilfsbit, welches die Rückkehrsprungmarke bestimmt gesetzt ist
goto MIDI_IN_CL
bcf TAKTART, 1 ;lösche die Sprungmarke
goto MIDI_IN_ST
;**** Endmarken ************************************************** ***********
MIDI_IN_SP
;COUNTER_6 laden
movlw D'249'
movwf COUNTER_6
;OBYTE1 und OBYTE2 löschen
clrf OBYTE1
clrf OBYTE2
goto MIDI_IN_ST
end
edit by stegr: Bitte in Zukunft den Code-Tag verwenden... Danke...
Hatte vor einiger Zeit schon mal hier gepostet. Aber jetzt komme ich wieder nicht weiter, dh. Verstehe nicht warum das Prog nicht läuft.
Hier erstmal eine Erläuterung damit überhaut eine Chance besteht das Prog nachzuvollziehen. Wie gesagt handelt es sich um ein kleines Effektgerät. Dieses verfügt über 16 Taster. Jeder dieser Taster stellt einen 16tel Note dar und kann entweder gesetzt sein (LED leuchtet) oder eben nicht (LED aus).
Später möchte ich das ganze noch um16 LEDs ergänzen, sodass das ganze eine typische Drumcomputeransteuerung wird.
Das Gerät verfügt darüber hinaus noch über einen Audioein- und Ausgang. In den Eingang wird zB ein Palttenspieler eingesteckt und der Ausgang kommt dann zB ins Mischpult.
Ist nun ein Taster gesetzt so lässt die Schaltung für dieses 16tel eines Takts das Audiosignal unverändert durch. Ist ein Taster nicht gesetzt so wird das Audiosignal mute/stumm geschaltet. Das ganze Gerät zerhackt also die Audiosignale. In der Fachsprache ein Gater oder Apreggiator.
Alles ist soweit fertig außer dass das Prog läuft. Für Tips, Anregungen, Verbesserungsvorschläge, Verbesserungen… und vor allem Fehlerfunde wäre ich sehr dankbar.
MfG Daniel
Hier der Code:
;************************************************* ***********************************
;
; BRAINS
; MIDI-Scratch Apreggiator
;
;************************************************* ***********************************
list p=16F874
#include <P16F874.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC
;************************************************* ***********************************
;
;Beschreibung
;Am Eingang [] ist ein MIDIClock Signal anzulegen. Dieser Takt steuert die 16
;
;Bei jeder der 16 16tel Noten kann mittels der Taster gewählt werden, ob das anliegende
;Audio-Signal für diese Zeit MUTE geschaltet werden soll oder nicht. Der erhaltene Effekt
;ist ein Apreggiatoreffekt.
;
;
;
;************************************************* ***********************************
; Variablen festlegen
MIDI_CL EQU 0x20 ;MIDI_CL-Byte
MIDI_ST EQU 0x21
;MIDI_SP EQU 0x22
COUNTER_6 EQU 0x23
HLS1 EQU 0x24
HLS2 EQU 0x25
OBYTE1 EQU 0x26
OBYTE2 EQU 0x27
TAKTART EQU 0x28 ;Bit0: set=3/4 Takt; n.set=4/4 Takt
;Bit1: set=goto MIDI_IN_ST; n.set=goto MIDI_IN_CL
HILFE1 EQU 0x2C
HILFE2 EQU 0x2D
;************************************************* ***********************************
; IO-PIN-BELEGUNG
;
; Ao OUT (FX)
;
; Bo T0
; B1 T1
; B2 T2
; B3 T3
; B4 T4
; B5 T5
; B6 T6
; B7 T7
;
; D0 T8
; D1 T9
; D2 T10
; D3 T11
; D4 T12
; D5 T13
; D6 T14
; D7 T15
;
; xx MIDI IN
;
;************************************************* ***********************************
bcf STATUS, RP0 ;auf Bank 0 umschalten
bcf ADCON0,0 ;ADC ausschalten
; INIT UART
bsf STATUS, RP0 ;auf Bank 1 umschalten
movlw 0x09 ;Baudrate auf 31250 Baud
movwf SPBRG
bcf TXSTA, BRGH ;low speed Baudrate
bcf TXSTA, SYNC ;enable the serial port
bcf STATUS, RP0 ;auf Bank 0 umschalten
bsf RCSTA, SPEN ;enable the serial port
bsf RCSTA, CREN ;enable reception
bcf RCSTA, FERR
bcf RCSTA, OERR
bcf RCSTA, RX9D
bsf STATUS, RP0 ;auf Bank 1 umschalten
; ADC auf I/O umschalten
movlw 0x06
movwf ADCON1
bcf TRISA,0 ;PortA,0 auf Ausgang setzten
; PortB auf EINGANG setzten
movlw B'11111111'
movwf TRISB
bsf TRISC,7 ;PortC,7 auf Eingang
; PortD auf EINGANG setzten
movlw B'11111111'
movwf TRISD
bcf STATUS, RP0 ;auf Bank 0 umschalten
; COUNTER_6 laden
movlw D'249'
movwf COUNTER_6
; OBYTE1 und OBYTE2 löschen
clrf OBYTE1
clrf OBYTE2
; HILFE1 und HILFE2 löschen
clrf HILFE1
clrf HILFE2
; HLS1 und HLS2 als Grundeinstellung laden
movlw B'00110011'
movwf HLS1
movlw B'00110011'
movwf HLS2
bcf TAKTART,0 ;als Grundeinstellung 4/4 Takt
; MIDI_CL, ST, SP Initialisierung
movlw 0xF8
movwf MIDI_CL
movlw 0xFA
movwf MIDI_ST
; movlw 0xFC
; movwf MIDI_SP
bcf STATUS, RP0 ;auf Bank 0 umschalten
;****** Programmstart **************************************************
MIDI_IN_ST
btfss PIR1,RCIF ;überspringe nachfolgenden Befehl, wenn Bit5 gesetzt ist, dh MIDI_IN_BYTE liegt vor
goto TASTENABFRAGE_ST
bcf PIR1,RCIF ;lösche das Bit, welches einen MidiEmpfang anzeigt
movf RCREG,W ;kopiere RCREG nach W
xorwf MIDI_ST,W ;es wird geprüft, ob das angekommene Byte ein StartBefehl war und das Ergebnis wird in W gespeichert
btfsc STATUS,Z ;prüfe das ZeroFlag: 0: XOR Verknüpfung war wahr
goto MIDI_IN_ST
MIDI_IN_CL ;JA, es war ein StartBit, also weiter
btfss PIR1,RCIF ;überspringe nachfolgenden Befehl, wenn Bit5 gesetzt ist, dh MIDI_IN_BYTE liegt vor
goto TASTENABFRAGE_CL
movf RCREG,W ;kopiere RCREG nach W
xorwf MIDI_CL,W ;es wird geprüft, ob das angekommene Byte ein ClockBefehl war
btfsc STATUS,Z ;prüfe das ZeroFlag: 0: XOR Verknüpfung war wahr
goto MIDI_IN_ST
;****** Counter ************************************************** ************************************************** *****
incfsz COUNTER_6,1 ;COUNTER_6 +1 und Ergebnis wieder in COUNTER_6 speichern - falls das Ergebnis=o => ingnoriere nachfolg. Befehl
goto MIDI_IN_CL
movlw D'249'
movwf COUNTER_6
;****** Positionstest ************************************************** ****************************************
btfss OBYTE1,0 ;prüfe, ob hier die aktuelle Position ist? - Nein, dann gehe zum nächsten Befehl
goto OBYTE1_0NOTSET ;springe zu OBYTE1_0NOTSET
btfss OBYTE1,1
goto OBYTE1_1NOTSET
btfss OBYTE1,2
goto OBYTE1_2NOTSET
btfss OBYTE1,3
goto OBYTE1_3NOTSET
btfss OBYTE1,4
goto OBYTE1_4NOTSET
btfss OBYTE1,5
goto OBYTE1_5NOTSET
btfss OBYTE1,6
goto OBYTE1_6NOTSET
btfss OBYTE1,7
goto OBYTE1_7NOTSET
btfss OBYTE2,0
goto OBYTE2_0NOTSET
btfss OBYTE2,1
goto OBYTE2_1NOTSET
btfss OBYTE2,2
goto OBYTE2_2NOTSET
btfss OBYTE2,3
goto OBYTE2_3NOTSET
btfss OBYTE2,4
goto OBYTE2_4NOTSET
btfss OBYTE2,5
goto OBYTE2_5NOTSET
btfss OBYTE2,6
goto OBYTE2_6NOTSET
btfss OBYTE2,7
goto OBYTE2_7NOTSET
;**** OBYTES 1 + 2 ************************************************** **********************************************
OBYTE1_0NOTSET
bsf OBYTE1,0 ;setze OBYTE,0
btfss HLS1,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_1NOTSET
bsf OBYTE1,1 ;setze OBYTE,1
btfss HLS1,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_2NOTSET
bsf OBYTE1,2 ;setze OBYTE,2
btfss HLS1,2
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_3NOTSET
bsf OBYTE1,3 ;setze OBYTE,3
btfss HLS1,3
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_4NOTSET
bsf OBYTE1,4 ;setze OBYTE,4
btfss HLS1,4
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_5NOTSET
bsf OBYTE1,5 ;setze OBYTE,5
btfss HLS1,5
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_6NOTSET
bsf OBYTE1,6 ;setze OBYTE,6
btfss HLS1,6
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE1_7NOTSET
bsf OBYTE1,7 ;setze OBYTE,7
btfss HLS1,7
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_0NOTSET ;hier beginnt HLS2********************************************** **************
bsf OBYTE2,0 ;setze OBYTE,0
btfss HLS2,0
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_1NOTSET
bsf OBYTE2,1 ;setze OBYTE,1
btfss HLS2,1
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_2NOTSET
bsf OBYTE2,2 ;setze OBYTE,2
btfss HLS2,2
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_3NOTSET
bsf OBYTE2,3 ;setze OBYTE,3
btfsc TAKTART,0 ; 3/4 oder 4/4 Takt? überspringe nachfolgenden Befehl bei 4/4Takt
goto TAKT_3_4
btfss HLS2,3
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_4NOTSET
bsf OBYTE2,4 ;setze OBYTE,4
btfss HLS2,4
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_5NOTSET
bsf OBYTE2,5 ;setze OBYTE,5
btfss HLS2,5
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_6NOTSET
bsf OBYTE2,6 ;setze OBYTE,6
btfss HLS2,6
goto LOWOUT
bsf PORTA,0 ;FX high
goto MIDI_IN_CL
OBYTE2_7NOTSET
bsf OBYTE2,7 ;setze OBYTE,7
btfss HLS2,7
goto LOWTAKTENDE
bsf PORTA,0 ;FX high
goto TAKTENDE
;***** Sprungmarken ************************************************** ********************
LOWOUT
bcf PORTA,0
goto MIDI_IN_CL
LOWTAKTENDE
bcf PORTA,0
goto TAKTENDE
TAKTENDE
clrf OBYTE1
clrf OBYTE2
goto MIDI_IN_CL
TAKT_3_4
btfss HLS2,3
goto LOWTAKTENDE
bsf PORTA,0
goto TAKTENDE
;**** Tastenabfrage ************************************************** *******************
TASTENABFRAGE_ST
bsf TAKTART, 1
TASTENABFRAGE_CL
TASTER_0 ;Tastenabfrage
btfss PORTB,0 ;überspringe nachfolgenden Befehl, wenn PORTB,0 gesetzt ist
goto CLEAR_HILFE_0 ;gehe zu CLEAR_HILFE_0
btfss HILFE1,0 ;überspringe nachfolgenden Befehl, wenn HILFE1,0 gesetzt ist
goto INVERT_0 ;gehe zu INVERT_0
goto TASTER_1 ;gehe zur nächsten Tasterabfrage
CLEAR_HILFE_0 ;hier wird das CLEAR_HILFE_0-Bit gelöscht
bcf HILFE1,0
goto TASTER_1
INVERT_0 ;hier wird die aktuelle Position invertiert
bsf HILFE1,0
btfsc HLS1,0
btfss HLS1,0
goto SETZEN_0
bcf HLS1,0
goto TASTER_1
SETZEN_0
bsf HLS1,0
goto TASTER_1
TASTER_1
btfss PORTB,1
goto CLEAR_HILFE_1
btfss HILFE1,1
goto INVERT_1
goto TASTER_2
CLEAR_HILFE_1
bcf HILFE1,1
goto TASTER_2
INVERT_1
bsf HILFE1,1
btfsc HLS1,1
btfss HLS1,1
goto SETZEN_1
bcf HLS1,1
goto TASTER_2
SETZEN_1
bsf HLS1,1
goto TASTER_2
TASTER_2
btfss PORTB,2
goto CLEAR_HILFE_2
btfss HILFE1,2
goto INVERT_2
goto TASTER_3
CLEAR_HILFE_2
bcf HILFE1,2
goto TASTER_3
INVERT_2
bsf HILFE1,2
btfsc HLS1,2
btfss HLS1,2
goto SETZEN_2
bcf HLS1,2
goto TASTER_3
SETZEN_2
bsf HLS1,2
goto TASTER_3
TASTER_3
btfss PORTB,3
goto CLEAR_HILFE_3
btfss HILFE1,3
goto INVERT_3
goto TASTER_4
CLEAR_HILFE_3
bcf HILFE1,3
goto TASTER_4
INVERT_3
bsf HILFE1,3
btfsc HLS1,3
btfss HLS1,3
goto SETZEN_3
bcf HLS1,3
goto TASTER_4
SETZEN_3
bsf HLS1,3
goto TASTER_4
TASTER_4
btfss PORTB,4
goto CLEAR_HILFE_4
btfss HILFE1,4
goto INVERT_4
goto TASTER_5
CLEAR_HILFE_4
bcf HILFE1,4
goto TASTER_5
INVERT_4
bsf HILFE1,4
btfsc HLS1,4
btfss HLS1,4
goto SETZEN_4
bcf HLS1,4
goto TASTER_5
SETZEN_4
bsf HLS1,4
goto TASTER_5
TASTER_5
btfss PORTB,5
goto CLEAR_HILFE_5
btfss HILFE1,5
goto INVERT_5
goto TASTER_6
CLEAR_HILFE_5
bcf HILFE1,5
goto TASTER_6
INVERT_5
bsf HILFE1,5
btfsc HLS1,5
btfss HLS1,5
goto SETZEN_5
bcf HLS1,5
goto TASTER_6
SETZEN_5
bsf HLS1,5
goto TASTER_6
TASTER_6
btfss PORTB,6
goto CLEAR_HILFE_6
btfss HILFE1,6
goto INVERT_6
goto TASTER_7
CLEAR_HILFE_6
bcf HILFE1,6
goto TASTER_7
INVERT_6
bsf HILFE1,6
btfsc HLS1,6
btfss HLS1,6
goto SETZEN_6
bcf HLS1,6
goto TASTER_7
SETZEN_6
bsf HLS1,6
goto TASTER_7
TASTER_7
btfss PORTB,7
goto CLEAR_HILFE_7
btfss HILFE1,7
goto INVERT_7
goto TASTER_8
CLEAR_HILFE_7
bcf HILFE1,7
goto TASTER_8
INVERT_7
bsf HILFE1,7
btfsc HLS1,7
btfss HLS1,7
goto SETZEN_7
bcf HLS1,7
goto TASTER_8
SETZEN_7
bsf HLS1,7
goto TASTER_8
TASTER_8
btfss PORTD,0
goto CLEAR_HILFE_8
btfss HILFE2,0
goto INVERT_8
goto TASTER_9
CLEAR_HILFE_8
bcf HILFE2,0
goto TASTER_9
INVERT_8
bsf HILFE2,0
btfsc HLS2,0
btfss HLS2,0
goto SETZEN_8
bcf HLS2,0
goto TASTER_9
SETZEN_8
bsf HLS2,0
goto TASTER_9
TASTER_9
btfss PORTD,1
goto CLEAR_HILFE_9
btfss HILFE2,1
goto INVERT_9
goto TASTER_10
CLEAR_HILFE_9
bcf HILFE2,1
goto TASTER_10
INVERT_9
bsf HILFE2,1
btfsc HLS2,1
btfss HLS2,1
goto SETZEN_9
bcf HLS2,1
goto TASTER_10
SETZEN_9
bsf HLS2,1
goto TASTER_1
TASTER_10
btfss PORTD,2
goto CLEAR_HILFE_10
btfss HILFE2,2
goto INVERT_2
goto TASTER_11
CLEAR_HILFE_10
bcf HILFE2,2
goto TASTER_11
INVERT_10
bsf HILFE2,2
btfsc HLS2,2
btfss HLS2,2
goto SETZEN_10
bcf HLS2,2
goto TASTER_11
SETZEN_10
bsf HLS2,2
goto TASTER_10
TASTER_11
btfss PORTD,3
goto CLEAR_HILFE_11
btfss HILFE2,3
goto INVERT_3
goto TASTER_12
CLEAR_HILFE_11
bcf HILFE2,3
goto TASTER_12
INVERT_11
bsf HILFE2,3
btfsc HLS2,3
btfss HLS2,3
goto SETZEN_11
bcf HLS2,3
goto TASTER_12
SETZEN_11
bsf HLS2,3
goto TASTER_12
TASTER_12
btfss PORTD,4
goto CLEAR_HILFE_12
btfss HILFE2,4
goto INVERT_12
goto TASTER_13
CLEAR_HILFE_12
bcf HILFE2,4
goto TASTER_13
INVERT_12
bsf HILFE2,4
btfsc HLS2,4
btfss HLS2,4
goto SETZEN_12
bcf HLS2,4
goto TASTER_13
SETZEN_12
bsf HLS2,4
goto TASTER_13
TASTER_13
btfss PORTD,5
goto CLEAR_HILFE_13
btfss HILFE2,5
goto INVERT_13
goto TASTER_14
CLEAR_HILFE_13
bcf HILFE2,5
goto TASTER_14
INVERT_13
bsf HILFE2,5
btfsc HLS2,5
btfss HLS2,5
goto SETZEN_13
bcf HLS2,5
goto TASTER_14
SETZEN_13
bsf HLS2,5
goto TASTER_14
TASTER_14
btfss PORTD,6
goto CLEAR_HILFE_14
btfss HILFE2,6
goto INVERT_14
goto TASTER_15
CLEAR_HILFE_14
bcf HILFE2,6
goto TASTER_15
INVERT_14
bsf HILFE2,6
btfsc HLS2,6
btfss HLS2,6
goto SETZEN_14
bcf HLS2,6
goto TASTER_15
SETZEN_14
bsf HLS2,6
goto TASTER_15
TASTER_15
btfss PORTD,7
goto CLEAR_HILFE_15
btfss HILFE2,7
goto INVERT_15
goto MIDI_IN_CL
CLEAR_HILFE_15
bcf HILFE2,7
goto MIDI_IN_CL
INVERT_15
bsf HILFE2,7
btfsc HLS2,7
btfss HLS2,7
goto SETZEN_15
bcf HLS2,7
goto MIDI_IN_CL
SETZEN_15
bsf HLS2,7
btfss TAKTART, 1 ;teste ob das Hilfsbit, welches die Rückkehrsprungmarke bestimmt gesetzt ist
goto MIDI_IN_CL
bcf TAKTART, 1 ;lösche die Sprungmarke
goto MIDI_IN_ST
;**** Endmarken ************************************************** ***********
MIDI_IN_SP
;COUNTER_6 laden
movlw D'249'
movwf COUNTER_6
;OBYTE1 und OBYTE2 löschen
clrf OBYTE1
clrf OBYTE2
goto MIDI_IN_ST
end
edit by stegr: Bitte in Zukunft den Code-Tag verwenden... Danke...