LIST p=16C74 ; Device PIC16C74 ; Oscillator HS (12MHz) ; Watch Dog Timer On ; Processor Mode ; Brown Out Detect ; Code Protect Off ; Power Up Timer On include "registor.h" include "pic.h" ; *********** ; *** RAM *** ; *********** ;bank 0 (H'20' - H'7F') tmp_w equ H'20' ;W reg. (Interrupt) tmp_s equ H'21' ;STATUS reg. (Interrupt) tmp_fsr equ H'22' ;FSR (Interrupt) ledblnk equ H'23' ;LED blink counter errflg equ H'24' ;error flag for LED rcvdata equ H'25' ;serial receive data snddata equ H'26' ;serial send data bdata equ H'27' ;receive byte data bccdata equ H'28' ;BCC data count equ H'29' ;length counter adrsh equ H'2a' ;address pointer adrsl equ H'2b' ;bank 1 (H'A0' - H'FF') ; ************ ; *** code *** ; ************ org H'000' ;reset goto start org H'004' ;interrupt vector goto interval ; ************* ; *** start *** ; ************* start: clrwdt _bank1 _movfi OPTIONZ,B'10000011' ;b7 RBPU=1 任意のポートラッチ値でportBプルアップしない ;b6 INTEDG=0 立ち下がりエッジで割り込み ;b5 RTS=0 TMR0は内部命令サイクルクロック ;b4 RTE=0 TMR0は立ち上がりでカウント ;b3 PSA=0 プリスケーラをTMR0にアサイン ;b2-0 011 プリスケーラ TMR0=1/16 ;interval=1/12*4*16*(256-69)uS _bank0 _movfi RCSTA,B'10010000' ;b7 SPEN=1 Serial Port enable ;b6 RC8/9=0 8bit ;b5 SREN=0 not use when ASYNC ;b4 CREN=1 Receive enable ;b3 not use ;b2 (FERR) Framing error ;b1 (OERR) Overrun error ;b0 (RCD8) 9th bit of receive data _bank1 _movfi TXSTA,B'00100100' ;Asynchronous Output ;b7 no use ;b6 TX8/9=0 8bit ;b5 TXEN=1 Transmit Enable ;b4 SYNC=0 Asynchronous mode ;b3 no use ;b2 BRGH=1 High speed ;b1 (TRMT) Transmit shift register empty ;b0 (TXD8) 9thbit transmit data for parity _movfi ADCON1,B'00000110' ;protA,portE all digital I/O _movfi TRISA,B'00111111' ;(0=out) A13 - A8 _movfi TRISB,B'11111111' ;(0=out) A7 - A0 _movfi TRISC,B'10111000' ;(0=out) Serial(2),DIPSW3-1,EXTADRS,WE,OE _movfi TRISD,B'11111111' ;(0=out) D7 - D0 _movfi TRISE,B'00000101' ;(0=out) DIPSW4,LED,A14 _bank0 _movfi PORTC,B'00000010' _movfi PORTE,B'00000010' _ifb0f 2,PORTE,start2 ;Read DIPSW4 _bank1 _movfi SPBRG,D'77' ;SW4=ON 9600bps _bank0 goto start4 start2 _bank1 _movfi SPBRG,D'155' ;SW4=OFF 4800bps _bank0 start4 _movfi ledblnk,D'0' _movfi errflg,D'0' _movfi TMR0,D'69' _movfi INTCON,B'10100000' ;Interrupt enable ;b7 Global interrupt enable ;b6 Peripheral interrupt enable ;b5 TOIF interrupt enable ;b4 INT interrupt enable ;b3 RB port change interrupt enable ;b2 TMR0 overflow interrupt enable ;b1 External interrupt flag ;b0 RB port change interrupt flag call ramclr ;RAM clear loop0 _movfi errflg,0 loop call get1c ;wait ':' _ifeqfi errflg,0,loop0 _ifeqfi rcvdata,':',loop0 _movfi bccdata,H'00' call get1b ;length _ifeqfi errflg,0,loop6 _movff count,bdata call get1b ;address H _ifeqfi errflg,0,loop6 _movff adrsh,bdata call get1b ;address L _ifeqfi errflg,0,loop6 _movff adrsl,bdata call get1b ;00 command _ifeqfi errflg,0,loop6 call wopen loop1 _ifnefi count,0,loop2 decf count,f call get1b ;data _ifeqfi errflg,0,loop6 call write incfsz adrsl,f ;address+1 goto loop1 incf adrsh,f goto loop1 loop2 call wclose call get1b ;BCC _ifeqfi errflg,0,loop6 _ifnefi bccdata,H'00',loop3 _movfi errflg,5 goto loop6 loop3 call get1c ;CR/LF _ifeqfi errflg,0,loop6 _ifnefi rcvdata,H'0d',loop _ifnefi rcvdata,H'0a',loop _movfi errflg,6 goto loop6 loop6 clrwdt ;error stop goto loop6 ; ***************** ; *** RAM clear *** ; ***************** ramclr call wopen _movfi adrsl,H'00' ;RAM clear _movfi adrsh,H'00' _movfi bdata,H'ff' ramclr0 clrwdt call write incfsz adrsl,f ;address+1 goto ramclr1 incf adrsh,f ramclr1 _ifeqfi adrsh,H'80',ramclr0 call wclose return ; ****************** ; *** Write open *** ; ****************** wopen bsf PORTC,2 ;external address off bsf PORTC,0 ;OE=H _di _bank1 _movfi TRISA,B'00000000' ;(0=out) A13 - A8 _movfi TRISB,B'00000000' ;(0=out) A7 - A0 _movfi TRISD,B'00000000' ;(0=out) D7 - D0 _movfi TRISE,B'00000100' ;(0=out) DIPSW4,LED,A14 _bank0 _ei _movfi INTCON,B'00100000' ;Interrupt enable ;b7 Global interrupt enable ;b6 Peripheral interrupt enable ;b5 TOIF interrupt enable ;b4 INT interrupt enable ;b3 RB port change interrupt enable ;b2 TMR0 overflow interrupt enable ;b1 External interrupt flag ;b0 RB port change interrupt flag bcf PORTE,1 ;LED ON return ; ******************* ; *** Write close *** ; ******************* wclose _di _bank1 _movfi TRISA,B'00111111' ;(0=out) A13 - A8 _movfi TRISB,B'11111111' ;(0=out) A7 - A0 _movfi TRISD,B'11111111' ;(0=out) D7 - D0 _movfi TRISE,B'00000101' ;(0=out) DIPSW4,LED,A14 _bank0 _ei bcf PORTC,2 ;external address on bcf PORTC,0 ;OE=L _movfi INTCON,B'10100000' ;Interrupt enable ;b7 Global interrupt enable ;b6 Peripheral interrupt enable ;b5 TOIF interrupt enable ;b4 INT interrupt enable ;b3 RB port change interrupt enable ;b2 TMR0 overflow interrupt enable ;b1 External interrupt flag ;b0 RB port change interrupt flag return ; ******************** ; *** Write to RAM *** ; ******************** write _movff PORTB,adrsl ;address set _movff PORTA,adrsh _ifb0f 6,adrsh,write1 bcf PORTE,0 goto write2 write1 bsf PORTE,0 write2 _movff PORTD,bdata ;data set bcf PORTC,1 ;WE=L bsf PORTC,1 ;WE=H return ; ***************** ; *** get 1char *** ; ***************** get1c clrwdt _ifb1f 5,PIR1,get1c ;wait data _ifb0f 1,RCSTA,get1c1 _ifb0f 2,RCSTA,get1c1 _movff rcvdata,RCREG return get1c1 _movff rcvdata,RCREG ;receive error _movfi RCSTA,B'10000000' ;error reset _movfi RCSTA,B'10010000' _movfi rcvdata,'?' _movfi errflg,1 return ; ***************** ; *** get 1byte *** ; ***************** get1b call get1c _ifeqfi errflg,0,get1b1 call chkhex _ifeqfi errflg,0,get1b1 swapf rcvdata,f _movff bdata,rcvdata call get1c _ifeqfi errflg,0,get1b1 call chkhex _ifeqfi errflg,0,get1b1 movf rcvdata,w iorwf bdata,f movf bdata,w ;BCC addwf bccdata,f get1b1 return ; *** check HEX *** chkhex _ifltfi rcvdata,'0',chkhex1 _movfi errflg,2 return chkhex1 _ifltfi rcvdata,'9'+D'1',chkhex2 movf rcvdata,w addlw D'256'-'0' movwf rcvdata return chkhex2 _ifltfi rcvdata,'A',chkhex3 _movfi errflg,3 return chkhex3 _ifltfi rcvdata,'F'+D'1',chkhex4 movf rcvdata,w addlw D'256'-'A'+D'10' movwf rcvdata return chkhex4 _movfi errflg,4 return ; ****************** ; *** send 1char *** ; ****************** snd1c _di _bank1 _ifb0f 1,TXSTA,snd1c1 _bank0 _ei goto snd1c snd1c1 _bank0 _ei _movff TXREG,snddata return ; ******************************* ; *** Interrupt routine (1mS) *** ; ******************************* interval movwf tmp_w ;tmp_w=W swapf STATUS,w ;tmp_s(low)=STATUS(high) movwf tmp_s ;tmp_s(high)=STATUS(low) movf FSR,w ;tmp_fsr=FSR movwf tmp_fsr _ifeqfi errflg,0,interv2 incfsz ledblnk,f ;LED blink goto interv1 _movfi ledblnk,D'256'-D'250' _ifb0f 1,PORTE,interv2 bsf PORTE,1 goto interv1 interv2 bcf PORTE,1 interv1 _movfi TMR0,D'69' bcf INTCON,2 ;clear INTflag movf tmp_fsr,w ;FSR=tmp_fsr movwf FSR swapf tmp_s,w ;STATUS(low)=tmp_s(high) movwf STATUS ;STATUS(high)=tmp_s(low) swapf tmp_w,f ;W=tmp_w swapf tmp_w,w retfie end