list p=16f628A #include errorlevel -302 __CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC #define GATE1 PORTA,1 #define GATE2 PORTA,0 #define RS_LED PORTB,5 #define GLED1 PORTA,2 #define GLED2 PORTA,3 #define TPAT1 b'11111111' #define TPAT2 b'01010101' #define CYCLCNT 2 #define SEQ_LEN d'96' ; 24x4 = 96 = 1 Length w_temp EQU 0x71 status_temp EQU 0x72 TMP_DATA EQU 0x24 MIDI_CCNT EQU 0x25 RUN_STATE EQU 0x26 ; bit 0 = RUN/STOP, bit 1 = GATE GO TRIG_PAT EQU 0x27 TRIG_CNT EQU 0x28 CNT1 EQU 0x29 CNT2 EQU 0x2a ORG 0x000 goto main ;Interrupt handling ORG 0x004 movwf w_temp movf STATUS,w movwf status_temp btfss PIR1,RCIF goto ret_main ;Not serial int. then return. ;Clear WDT clrwdt banksel TMP_DATA movf RCREG,w movwf TMP_DATA movlw 0xf8 ;Case MIDI Clock subwf TMP_DATA,f btfsc STATUS,Z goto is_clock decf TMP_DATA,f ; Ignore 0xf9 decf TMP_DATA,f btfsc STATUS,Z goto is_start ; 0xfa = MIDI Start decf TMP_DATA,f btfsc STATUS,Z goto is_continue ; 0xfb = MIDI Continue decf TMP_DATA,f btfsc STATUS,Z goto is_stop ; 0xfc = MIDI stop goto ret_main ; Any other MIDI Data will ignore. is_continue bsf RUN_STATE,0 ; Do not reset counter on CONTINUE goto ret_main is_stop bcf RUN_STATE,0 ; MIDI STOP goto ret_main is_start movlw d'1' ; MIDI START movwf MIDI_CCNT ;Prepare for 1st trigger movlw CYCLCNT ;Set 1st pattern & count. movwf TRIG_CNT call pat_chk ;Init pattern bsf RUN_STATE,0 ; Set State to RUN goto ret_main is_clock btfss RUN_STATE,0 goto ret_main decfsz MIDI_CCNT,f ; 1length = 96 tick goto ret_main movlw SEQ_LEN movwf MIDI_CCNT bsf RUN_STATE,1 ; After 96 tick then GATE ON ret_main bcf RCSTA,FERR ;Clear framing err. bcf RCSTA,OERR ;Clera overrun err. movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w bsf INTCON,GIE ;Enable int. retfie ;Int. handle routine end here. main ;Main routine bcf STATUS,RP0 ;Reg. Bank to 0 bcf STATUS,RP1 clrf INTCON ;Disable Int. clrf PORTA ;Init ports. clrf PORTB movlw 0x07 movwf CMCON ;Comparator to OFF. bsf STATUS,RP0 ;Reg. Bank to 1 clrf TRISA ;PORTA for OUTPUT movlw b'00001110';PORTB 1,2 for Serial. 3 for Input. movwf TRISB movlw d'39' movwf SPBRG ;Set 39 to baud generator. movlw b'00100100';BRGH=1 312500bps,TXEN=1 movwf TXSTA ;BRGH=1 bcf STATUS,RP0 ;Back to bank 0 ;Init. Serial port Int. bsf INTCON,PEIE;Enable Peripheral Int. bsf STATUS,RP0 ;Bank=1 bsf PIE1,RCIE ;Enable Serial rec. Int. bcf STATUS,RP0 ;Bank=0 bsf INTCON,GIE ;Int. Enable. ;Setup MIDI Clock counter. movlw SEQ_LEN movwf MIDI_CCNT ;Setup trigger counter. movlw CYCLCNT movwf TRIG_CNT ;Select Pattern & set. call pat_chk ;Clear state. clrf RUN_STATE ;Set rec. ready. movlw b'10010000';SPEN=1,SREN=1 movwf RCSTA ;After init., flash LED once. bsf RS_LED call dly_ms call dly_ms bcf RS_LED main_loop btfsc RUN_STATE,0 goto RLED_ON goto RLED_OFF RLED_ON bsf RS_LED goto back_loop RLED_OFF bcf RS_LED goto back_loop back_loop btfss RUN_STATE,1 goto main_loop ;GATE 1 btfss TRIG_PAT,0 goto chk_gat2 bsf GATE1 bsf GLED1 chk_gat2 btfss TRIG_PAT,1 goto do_wait bsf GATE2 bsf GLED2 do_wait call dly_ms call dly_ms call dly_ms bcf GATE1 bcf GLED1 bcf GATE2 bcf GLED2 bcf RUN_STATE,1 ;Mover trigger pattern to Next. rrf TRIG_PAT,f decfsz TRIG_CNT,f goto main_loop ;Trigger patter, re-init. movlw CYCLCNT movwf TRIG_CNT ;Select pattern & set. call pat_chk goto main_loop ;Send 1chr routine(Not used) send_char movwf TXREG bsf STATUS,RP0 ; Bank=1 send_wait btfss TXSTA,TRMT goto send_wait bcf STATUS,RP0 ; Bank=0 return pat_chk ;Check pattern & set routine btfsc PORTB,3 goto setpat2 setpat1 movlw TPAT1 goto do_setpat setpat2 movlw TPAT2 do_setpat movwf TRIG_PAT return ;millsec delay routine (Not accurate). dly_ms movlw d'10' movwf CNT1 dly_ms1 movlw d'250' movwf CNT2 dly_ms2 nop nop nop nop decfsz CNT2,f goto dly_ms2 decfsz CNT1,f goto dly_ms1 return ;EEPROM Address ORG 0x2100 END