;LZ4GV 2003- Firmware EQU .25 list p=12F629 ; list directive to define processor #include ; processor specific variable definitions __CONFIG _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF ; _HS_OSC _PWRTE_OFF _CP_ON _CPD_ON _BODEN_OFF _MCLRE_ON _WDT_ON ; _EC_OSC ; _LP_OSC ; _XT_OSC ; _INTRC_OSC_CLKOUT ; _EXTRC_OSC_NOCLKOUT ; _EXTRC_OSC_CLKOUT #define _GP0 GPIO,0 ;Pin 7 #define _GP1 GPIO,1 ;Pin 6 #define _GP2 GPIO,2 ;Pin 5 #define _GP3 GPIO,3 ;Pin 4 #define _GP4 GPIO,4 ;Pin 3 #define _GP5 GPIO,5 ;Pin 2 #define STATBIT 0x20,0 ;Bank0, Bank1 FSRMEM EQU 0x55 OPTIONMEM EQU 0x56 PCLMEM EQU 0x57 TMR0MEM EQU 0x58 TMR1LMEM EQU 0x59 TMR1HMEM EQU 0x5A INTCONMEM EQU 0x5B REEADR EQU 0x5C REEDATA EQU 0x5D W_TEMP EQU 0x5E ; STATUS_TEMP EQU 0x5F ; TMR0IF EQU T0IF EE_Count EQU 0x2100 ORG EE_Count ;Initialize EEPROM locations DE 0x00,0x01,0x02,0x03 ORG 0x0000 GOTO START ;********************************************************************** ORG 0x0004 ;Interrupt vector location MOVWF W_TEMP ;Запомня последното състояние на текущите регистри (W register). MOVF STATUS,W ;Move STATUS register into W register MOVWF STATUS_TEMP ;Save off contents of STATUS register ;MOVF PCLATH,W ;Move PCLATH register into W register ;MOVWF PCLATH_TEMP ;Save off contents of PCLATH register BCF STATUS,RP0 ;Bank0 ;;; ;;; GOTO END_INTERRUPT ;--> ; END_INTERRUPT ;Възтановява състоянието на текущите регистри. ;MOVF PCLATH_TEMP,W ;Retrieve copy of PCLATH register ;MOVWF PCLATH ;Restore pre-isr PCLATH register contents MOVF STATUS_TEMP,W ;Retrieve copy of STATUS register MOVWF STATUS ;Restore pre-isr STATUS register contents SWAPF W_TEMP,F ;Restore pre-isr W register contents SWAPF W_TEMP,W ;-//- RETFIE ;Return From Interrupt / Enable Global Interrupts ;********************************************************************** ; BEGIN ;********** Начало *********** MAIN ;;; ;MOVLW .46 ; ;SUBWF ADRESH,W ;ADRESH > W C=1 ;BTFSC STATUS,C ;ADRESH = W C=1 ;NOP ;ADRESH < W C=0 ;;; MOVLW .100 CLRF TMR1L ;Нулира Timer1 MOVWF TMR1HMEM ; COMF TMR1HMEM,W ; MOVWF TMR1H ; BCF PIR1,TMR1IF ;1-overflowed ;;; MOVLW .100 MOVWF TMR0MEM ;Timer0 COMF TMR0MEM,W ; MOVWF TMR0 ; BCF INTCON,T0IF ;1-overflowed ;;; BSF STATUS,RP0 ;Bank 1(3) MOVF OPTION_REG,W ;Запомня състоянието на OPTION_REG. MOVWF OPTIONMEM ; ANDLW B'11111000' ;Нулира само PS2 PS1 PS0 IORLW B'00000001' ;Променя Fosc/4/4 = 4uS MOVWF OPTION_REG ; BCF STATUS,RP0 ; BSF STATUS,RP0 ;Възтановява OPTION_REG. MOVF OPTIONMEM,W ; MOVWF OPTION_REG ; BCF STATUS,RP0 ; ;;; GOTO MAIN ;********** Край ************* ;******************************************************* WRITE ;In:F(REEADR,REEDATA) BSF STATUS,RP0 ;Page 1 MOVF REEADR,W MOVWF EEADR MOVF REEDATA,W MOVWF EEDATA BCF INTCONMEM,GIE ; BTFSC INTCON,GIE ;Запазва състоянието. BSF INTCONMEM,GIE ; BCF INTCON,GIE ;Disable INTs. BTFSC INTCON,GIE ;See AN576 GOTO $-2 ; BSF EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 BSF EECON1,WR ;initiate write WRITE1 BTFSC EECON1,WR ;write complete? GOTO WRITE1 BTFSC INTCONMEM,GIE ; BSF INTCON,GIE ; BCF EECON1,WREN ;disable write BCF STATUS,RP0 ;Page 0 RETURN ; READE ;In:F(REEADR) Out:F(REEDATA),W BSF STATUS,RP0 ;Page 1 MOVF REEADR,W MOVWF EEADR BSF EECON1,RD ;do a read READE1 ; BTFSC EECON1,RD ;rd done? GOTO READE1 ;no then loop MOVF EEDATA,W MOVWF REEDATA BCF STATUS,RP0 ;Page 0 RETURN ; SET_VREF ;In: W .0 to .15 BSF STATUS,RP0 ; MOVWF VRCON ; BSF VRCON,VREN ;Vref Circuit Powered On BSF VRCON,VRR ;Low Range-'1' High Range-'0' BCF STATUS,RP0 ; RETURN ; SET_TMR0 bsf STATUS,RP0 ;Bank1 BCF OPTION_REG,PSA ;0- Prescaler is assigned to the Timer0 module 1- Prescaler is assigned to the WDT BCF OPTION_REG,T0CS ;Clock Source: 0- Internal 1- GP2/T0CKI pin BTFSC OPTION_REG,T0CS ; BCF OPTION_REG,T0SE ;0- Increment on low-to-high transition on GP2/T0CKI pin 1- low-to-high MOVF OPTION_REG,W ; ANDLW B'11111000' ;Нулира само PS2 PS1 PS0 ;IORLW B'00000000' ;Fosc/4/2 4MHz => 2uS ;IORLW B'00000001' ;Fosc/4/4 ;IORLW B'00000010' ;Fosc/4/8 ;IORLW B'00000011' ;Fosc/4/16 ;IORLW B'00000100' ;Fosc/4/32 ;IORLW B'00000101' ;Fosc/4/64 ;IORLW B'00000110' ;Fosc/4/128 IORLW B'00000111' ;Fosc/4/256 4MHz => 256uS MOVWF OPTION_REG ; bcf STATUS,RP0 ;Bank0 RETURN ; SET_WDT bsf STATUS,RP0 ;Bank1 CLRWDT ;Рестартира (PC=0000h) контролера след: ;movlw b'00101010' ;72mS ;movlw b'00101011' ;145mS ;movlw b'00101100' ;290mS ;movlw b'00101101' ;580mS ;movlw b'00101110' ;1,1S movlw b'00101111' ;2,3S movwf OPTION_REG ; bcf STATUS,RP0 ;Bank0 RETURN ; SET_TMR1 ;Timer1 Module: Max period 8uS * 65536 = 524,288mS BCF T1CON,TMR1GE ; BSF T1CON,T1CKPS1 ;Timer prescaler /1 - 0 /2 - 0 /4 - 1 /8 - 1 BSF T1CON,T1CKPS0 ;Timer prescaler 0 1 0 1 BCF T1CON,T1OSCEN ;Oscillator is shut off. BCF T1CON,NOT_T1SYNC ;Asinchronous Operration BCF T1CON,TMR1CS ;Internal Clock Fosc/4 4MHz = 8uS BSF T1CON,TMR1ON ;Timer1 On bit. RETURN ; SET_WPU BSF STATUS,RP0 ;Bank1 BCF WPU,0 ;GP0 1= Individual Pull-up Enabled BCF WPU,1 ;GP1 BCF WPU,2 ;GP2 BCF WPU,4 ;GP4 BCF WPU,5 ;GP5 BSF OPTION_REG,NOT_GPPU ;1= Pull-ups Disabled 0= Pull-ups Enable BCF STATUS,RP0 ;Bank0 RETURN ; SET_INT_PORTCHANGE ; BSF STATUS,RP0 ;Bank1 BCF IOC,IOC5 ;1= Individulal Interrupt-on change enabled BCF IOC,IOC4 ; BCF IOC,IOC3 ; BCF IOC,IOC2 ; BCF IOC,IOC1 ; BCF IOC,IOC0 ; bcf STATUS,RP0 ;Bank1 BSF INTCON,GPIE BCF INTCON,GPIF BSF INTCON,GIE RETURN SET_INT_TMR1 BSF STATUS,RP0 ;Bank1 ;CLRF PIE1 BSF PIE1,TMR1IE BCF STATUS,RP0 ;Bank0 BSF INTCON,PEIE CLRF TMR1H CLRF TMR1L BCF PIR1,TMR1IF BSF INTCON,GIE RETURN ; ;********************************************************************** ;*******Първоначална настройка на микроконтролера********************** START CLRF GPIO CLRF INTCON MOVLW B'00000111' ;Comparator OFF. MOVWF CMCON BSF STATUS,RP0 CALL A3FFh MOVWF OSCCAL ;Fosc=4MHz BSF OPTION_REG,INTEDG ;'1' - Rising RB0 Interrupt BCF STATUS,RP0 CALL SET_WPU ;Pull-up CALL SET_TMR0 ;SET_TMR0 or SET_WDT! ;CALL SET_WDT ; CALL SET_TMR1 BSF STATUS,RP0 MOVLW B'11111111' MOVWF TRISIO ;Port BCF STATUS,RP0 ;CALL SET_INT_PORTCHANGE ;CALL SET_INT_TMR1 ;movlw B'00001111' ;CALL SET_VREF ;In: W .0 to .15 GOTO BEGIN ; ORG 0x03FF A3FFh ;Oscillator calibration. RETLW 0x80 ;x0,x4,x8,xC END