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
Lesezeichen