; 4channel DMX512 receiver ; with adress selection ; ; Jean-Philippe DOR ; Mei 2001 ; checked 20/05/2001 ;
list p=16F84,f=inhx8m __config _XT_OSC & _WDT_OFF & _PWRTE_ON #include <p16F84.INC> o_count equ 0x1A offset equ 0x19 d equ 0x18 d1 equ 0x10 ; d(ata) d2 equ 0x11 d3 equ 0x12 d4 equ 0x13 d5 equ 0x14 compt equ 0x15 ; compteur de temps de break ch_comp equ 0x16 ; compteur de frame ch_assign equ 0x17 ; canal assigné au μC status equ 0x03 porta equ 0x05 portb equ 0x06
org 0x00 goto start org 0x05 start bsf STATUS,RP0 ; Changement de bank movlw 0x00 ; port b out movwf TRISB movlw 0x1F ; portA input movwf TRISA movlw b'11011000' movwf OPTION_REG movlw b'00100000' ; no interupt allowed movwf INTCON bcf STATUS,5 begin movlw 0x00 ; init a 00 des vars movwf d movwf d1 movwf d2 movwf d3 movwf d4 movwf compt movwf ch_assign movwf o_count movlw 0xff movwf ch_comp movlw 0x0f movwf offset
r_ch movf porta,0 ; Lit portA movwf ch_assign ; Place le tout dans ch_assign rlf ch_assign,1 movf ch_assign,0 ; rotate droit andlw 0x3C movwf ch_assign ; Place tout dasn ch_assign w_idle btfss porta,0 goto w_idle
w_brea btfsc porta,0 ; Attend le passage de idle(1) goto w_brea ; a break(0) nop nop
c_brea btfsc porta,0 ; Scrutte le break et regarde goto c_time ; grace au comptreur que c'est incf compt,1 ; bien supérieur à 88μS goto c_brea
c_time movf compt,0 ; check time du break sublw 0x10 ; 10h=16d->16x4μs=64μs btfsc status,0 goto begin ;Ce n'était pas un break
w_star btfsc porta,0 ;C'était un break goto w_star ;Attente du START
incf ch_comp,1 ;????????NEW w_stop btfss porta,0 goto w_stop
w_sc1 clrf d w_sc btfsc porta,0 ;Attente SC channel 1 goto w_sc bcf status,0 incf ch_comp,1 ;????????NEW c'était NOP ??? movf porta,0 ;bit 0 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 1 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 2 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 3 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 4 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 5 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 6 andlw 0x01 iorwf d,1 rrf d,1
movf porta,0 ;bit 7 andlw 0x01 iorwf d,1 rrf d,1
rrf d,1 ;remise en ordre movf offset,0 addwf ch_comp,0 movwf FSR movf d,0 movwf INDF
incf o_count,1 movf o_count,0 bcf status,2 xorlw 0x04 btfss status,2 goto suite
c_offs clrf o_count movlw 0x04 subwf offset,1
suite bcf status,0 ;Clear bit cy movf ch_assign,0 ;w=ch_assign subwf ch_comp,0 ;d lww=ch_comp-ch_assign btfss status,0 ;test cy goto w_sc1 ;NON ch1 bcf status,2 movf d1,0 xorlw 0xff btfsc status,2 goto on1 goto off1
on1 bsf portb,0 goto ch2
off1 bcf portb,0
ch2 bcf status,2 movf d2,0 xorlw 0xff btfsc status,2 goto on2 goto off2
on2 bsf portb,2 goto ch3
off2 bcf portb,2
ch3 bcf status,2 movf d3,0 xorlw 0xff btfsc status,2 goto on3 goto off3
on3 bsf portb,4 goto ch4
off3 bcf portb,4
ch4 bcf status,2 movf d4,0 xorlw 0xff btfsc status,2 goto on4 goto off4
on4 bsf portb,6 goto fin
off4 bcf portb,6
fin bcf portb,1 bcf portb,3 bcf portb,5 bcf portb,7 goto begin end |