;LZ4GV 01-2004 Firmware EQU .20 list p=12F675 ; 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 #define _GP0 GPIO,0 #define _GP1 GPIO,1 #define _GP2 GPIO,2 #define _GP3 GPIO,3 #define _GP4 GPIO,4 #define _GP5 GPIO,5 #define _GP5_IO TRISIO,5 ; EQU 0x20 W_TEMP EQU 0x55 ;Bank 1 STATUS_TEMP EQU 0x56 PCLATH_TEMP EQU 0x57 OPTIONMEM EQU 0x58 ;= 0xD8 TMR0MEM EQU 0x59 TMR1LMEM EQU 0x5A TMR1HMEM EQU 0x5B PCLMEM EQU 0x5C ACQT EQU 0x5D REEADR EQU 0x5E REEDATA EQU 0x5F TMR0IF EQU T0IF 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 GOTO ;ADRESH < W C=0 GOTO ; ;;; CLRF TMR1L ;Нулира Timer1. MOVWF TMR1HMEM ; COMF TMR1HMEM,W ; MOVWF TMR1H ; BCF PIR1,TMR1IF ;1-overflowed ;;; CLRF 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 ; ;;; ;******* Край ******** ;********************************************************************** WRITE ;In:F(REEADR,REEDATA) BSF STATUS,RP0 ;Page 1 MOVF REEADR,W MOVWF EEADR MOVF REEDATA,W MOVWF EEDATA BCF INTCON,GIE BSF EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 BSF EECON1,WR ;initiate write WRITE1 BTFSC EECON1,WR ;write complete? GOTO WRITE1 ;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 ; ;Analog-to-Digital Converter READC_GP0 ;Out: F(ADRESH) BCF ADCON0,ADFM ;bit 9 8 7 6 5 4 3 2 x x BCF ADCON0,VCFG ;Voltage Reference 0-Vdd 1-Vref pin BCF ADCON0,CHS1 ;Analog Channel Select bits BCF ADCON0,CHS0 ; GOTO READC READC_GP1 ;Out: F(ADRESH) BCF ADCON0,ADFM ;bit 9 8 7 6 5 4 3 2 x x BCF ADCON0,VCFG ;Voltage Reference 0-Vdd 1-Vref pin BCF ADCON0,CHS1 ;Analog Channel Select bits BSF ADCON0,CHS0 ; GOTO READC READC_GP2 ;Out: F(ADRESH) BCF ADCON0,ADFM ;bit 9 8 7 6 5 4 3 2 x x BCF ADCON0,VCFG ;Voltage Reference 0-Vdd 1-Vref pin BSF ADCON0,CHS1 ;Analog Channel Select bits BCF ADCON0,CHS0 ; GOTO READC READC_GP4 ;Out: F(ADRESH) BCF ADCON0,ADFM ;bit 9 8 7 6 5 4 3 2 x x BCF ADCON0,VCFG ;Voltage Reference 0-Vdd 1-Vref pin BSF ADCON0,CHS1 ;Analog Channel Select bits: AN3 BSF ADCON0,CHS0 ; GOTO READC READC BSF ADCON0,ADON ;1 = A/D converter module is operating MOVLW .18 ;Acquisition Time 40uS MOVWF ACQT ;Fosc=4MHz READ_ADC_A1 ; DECFSZ ACQT,F ; GOTO READ_ADC_A1 ;-^ BSF ADCON0,GO ;Start convertion ADC. READ_ADC_A2 ;Conversion Time 11 x 4uS = 44uS BTFSC ADCON0,GO ; GOTO READ_ADC_A2 ;-^ BCF ADCON0,ADON ;0 = A/D converter is shut_off RETURN ; SET_ADC BSF STATUS,RP0 ; MOVLW B'01010000' ;Fosc/16 4MHz = 4uS MOVWF ANSEL ;Digital I/O-'0' Analog I/O-'1' BCF ANSEL,ANS3 ;GP4 BCF ANSEL,ANS2 ;GP2 BCF ANSEL,ANS1 ;GP1/Vref BCF ANSEL,ANS0 ;GP0 BCF STATUS,RP0 ; 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 CLRWDT ;Рестартира (PC=0000h) контролера след: clrf TMR0 bsf STATUS,RP0 ;Bank1 BSF OPTION_REG,PSA ;0- Prescaler is assigned to the Timer0 module 1- Prescaler is assigned to the WDT ;2,3S 1,1S 580mS 290mS 145mS 72mS bsf OPTION_REG,PS2 ;1 1 1 1 0 0 bsf OPTION_REG,PS1 ;1 1 0 0 1 1 bsf OPTION_REG,PS0 ;1 0 1 0 1 0 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_COMP MOVWF CMCON bcf CMCON,CINV ;'1'-Output Inverted '0'-Not Inverted bcf CMCON,CIS ;'1'-In Connect to GP1 '0'-In Connect to GP0 RETURN ; ;*******Първоначална настройка на микроконтролера********************** START BCF STATUS,RP1 ;Bank0 BCF STATUS,RP0 ; CLRF GPIO CLRF INTCON ;Забрана за прекъване. MOVLW B'00000111' ;Comparator OFF. CALL SET_COMP BSF STATUS,RP0 CALL A3FFh MOVWF OSCCAL ; CLRF WPU ;Weak Pull-up Register. BCF STATUS,RP0 CALL SET_ADC 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 BSF STATUS,RP0 ;Bank1 MOVLW B'00000000' ;1=Pull-up enabled 0=Pull-up disabled MOVWF WPU BSF OPTION_REG,NOT_GPPU ;'1' - Pull-ups Disabled BSF OPTION_REG,INTEDG ;'1' - Rising RB0 Interrupt BCF STATUS,RP0 ;Bank0 ;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