title "PIC16F630 Synchronous-Serial-Load program" list p=16f630,f=inhx32 #include errorlevel -302 ;Keeps bank-select errors from showing on builds __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT ;PORT ALLOCATIONS ;************************************************************************************* ;PORTA data_ln = d'0' clock_ln = d'1' interrupt = d'2' ;TEMPORARY REGISTER EQUATES ;************************************************************************************* ch_num_temp = 40h ;Storage register for temp. channel ch_num = 41h ;Stores selected channel count1 = 42h ;General purpose temp counter register count2 = 43h ;General purpose temp counter register temp_count = 44h ;General purpose temp counter register ;START OF PROGRAM ROUTINES ;************************************************************************************* ;Reset vector for start-up and BOD resets org 0x000 goto Start ;Interrupt vector contains interrupt routine. org 0x004 bcf intcon,gie goto send_serial Start ;configure internal oscillator bsf status,rp0 ;Set file register bank to 1 call 0x3FF ;Retrieve factory calibration value movwf osccal ;Update register with factory calibr. ;initialize control registers movlw b'00000000' ;Sets portC to all outputs movwf trisC movlw b'00000100' ;Sets portA to all outputs except RA2 movwf trisA movlw b'01000000' ;Bit-7 = 0 to enable portA pull-up resistors, & movwf option_reg ;---bit-6 = 1 to set RA2/Int on rising edge movlw b'00000100' ;Enables weak pull-up resistor on RA2 only movwf wpua bcf status,rp0 ;Set file register bank to 0 movlw 07h ;Sets up comparitor to digital outputs movwf cmcon ;Initialize values and wait to send data clrf portA clrf portC clrf ch_num_temp clrf intcon bsf portA,data_ln bsf portA,clock_ln ; You must first fill "ch_num_temp" with an 8-bit value ; movlw d'?' ; movwf ch_num_temp send_serial movf ch_num_temp,w ;For testing only movwf ch_num ;Register for rotating bits movlw d'8' ;Sets temporary conter for 8 bits movwf temp_count bcf portA,data_ln ;Data LOW and Clock HIGH = packet ready (T1) bsf portA,clock_ln call start_delay ;Time delay for packet ready (T1) bcf portA,clock_ln ;Clock goes LOW for start bit (T2) call data_delay bit_move btfsc ch_num,0 ;Is bit to be sent a '1' or '0' bsf portA,data_ln ;If '1', then set modules data pin to '1' call data_delay rrf ch_num,f ;Moves in next bit. Loads LSB first bsf portA,clock_ln ;Set modules clock pin '1': (rising edge) call clock_delay ;Settling delay: may be longer or shorter (T3) bcf portA,clock_ln ;Clears modules clock pin for clock pulse bcf portA,data_ln ;Initialize modules data pin to Low decfsz temp_count,f ;Have all 8 bits been sent? goto bit_move ;No? Then continue sending done bsf portA,data_ln ;Yes? Then time to latch packet bsf portA,clock_ln ;Both set = Data Latched (T4) wait btfsc portA,interrupt ;Wait until button is released goto wait sleep_loop movlw b'10010000' ;Sets GIE & RA2/Int, and clears INTF movwf intcon sleep ;Takes 2uS to wake up nop ;Allows interrupt vector to be used (0x004) ;------------------------------------------------------------------------------------- ;********Delay = 47uS******** start_delay clrf count1 movlw 05h ;Change this value to adjust delay time movwf count1 loop_1 decfsz count1,f goto loop_1 return ;------------------------------------------------------------------------------------- ;********Delay = 9uS********* clock_delay clrf count2 movlw 01h ;Change this value to adjust delay time movwf count2 loop_3 decfsz count2,f goto loop_3 return ;------------------------------------------------------------------------------- ;********Delay = 9uS********** data_delay clrf count2 movlw 01h ;Change this value to adjust delay time movwf count2 loop_2 decfsz count2,f goto loop_2 return ;------------------------------------------------------------------------------------ end