;LZ4GV 2005-08 Firmware EQU .22 list p=12F683 ; list directive to define processor #include ; processor specific variable definitions ;Program Configuration Register __CONFIG _INTRC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _BOD_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _IESO_OFF & _FCMEN_OFF ; _INTRC_OSC_CLKOUT _CP_ON _CPD_ON _BOD_OFF _MCLRE_ON _PWRTE_OFF _WDT_ON _IESO_ON _FCMEN_ON ; _LP_OSC _BOD_NSLEEP ; _XT_OSC _BOD_SBODEN ; _HS_OSC ; _EC_OSC ; _EXTRC_OSC_NOCLKOUT ; _EXTRC_OSC_CLKOUT OSCTUNE_MNL EQU .0 ;Central frequency min .16 - .31 0 .1 - .15 max #define GPIO0 GPIO,0 ;Pin 7 #define GPIO1 GPIO,1 ;Pin 6 #define GPIO2 GPIO,2 ;Pin 5 #define GPIO3 GPIO,3 ;Pin 4 In Onli #define GPIO4 GPIO,4 ;Pin 3 #define GPIO5 GPIO,5 ;Pin 2 #define GPIO5IO TRISIO,5 ;0x20 to 0x6F Bank 0 #define STATBIT 0x20,0 FSRMEM EQU 0x60 ; PCLMEM EQU 0x61 ; ACQT EQU 0x62 ; TMR0MEM EQU 0x63 ; TMR1LMEM EQU 0x64 ; TMR1HMEM EQU 0x65 ; ;0x70 to 0x7F Bank 0,1 INTCONMEM EQU 0x7A ;Bank 0,1 REEADR EQU 0x7B ;Bank 0,1 REEDATA EQU 0x7C ;Bank 0,1 W_TEMP EQU 0x7D ;Bank 0,1 STATUS_TEMP EQU 0x7E ;Bank 0,1 PCLATH_TEMP EQU 0x7F ;Bank 0,1 OPTIONMEM EQU 0xA0 ;Bank 1 ; EQU 0xBF ;End Bank1 TMR0IF EQU T0IF ; #define FSRBANK STATUS,7;Не се използва! EE_ADR1 EQU 0x2100 ;Initialize EEPROM locations ORG EE_ADR1 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 MOVLW 0x20 ;Start Address RAM. MOVWF FSR ;Clear RAM BEGIN1 ; CLRF INDF ; MOVLW 0x7F ;End Address RAM. SUBWF FSR,W ; INCF FSR,F ; BTFSS STATUS,C ;FSR = or > W C=1 GOTO BEGIN1 ;FSR < W C=0 ;********** Начало *********** MAIN MOVLW .4 ; x 1/(Fosc/4/128) = MOVWF TMR0MEM ; COMF TMR0MEM,W ; MOVWF TMR0 ; BCF INTCON,T0IF ;Overflow TMR0 CLRF TMR1L ; MOVLW .250 ; MOVWF TMR1HMEM ; COMF TMR1HMEM,W ; MOVWF TMR1H ; BCF PIR1,TMR1IF ;Overflow TMR1 MOVLW 0x00 ;Pulse Width Modulation MOVWF CCPR1L ;Bit 9 - 2 BCF CCP1CON,DC1B1 ;Bit 1 BCF CCP1CON,DC1B0 ;Bit 0 ; MOVLW .100 ; ; SUBWF ADRESH,W ;ADRESH > W C=1 ; BTFSC STATUS,C ;ADRESH = W C=1 ; GOTO ;ADRESH < W C=0 ; GOTO ; ;;; 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 ;Bank 1 MOVF REEADR,W MOVWF EEADR MOVF REEDATA,W MOVWF EEDAT BCF INTCONMEM,GIE ; BTFSC INTCON,GIE ;Запазва състоянието. BSF INTCONMEM,GIE ; BCF INTCON,GIE ;Забранява всички прекъсвания. BTFSC INTCON,GIE ;See AN576 GOTO $-2 ; BSF EECON1,WREN ;enable write movlw 0x55 ; movwf EECON2 ; movlw 0xAA ; movwf EECON2 ; BSF EECON1,WR ;initiate write BTFSC EECON1,WR ;write complete? GOTO $-1 ; BCF EECON1,WREN ;disable write BTFSC INTCONMEM,GIE ;Възтановява прекъсванията ако са позволени. BSF INTCON,GIE ; BCF STATUS,RP0 ;Bank 0 RETURN ; READE ;In:F(REEADR) Out:F(REEDATA),W BSF STATUS,RP0 ;Bank 1 MOVF REEADR,W MOVWF EEADR BSF EECON1,RD ;do a read BTFSC EECON1,RD ;rd done? GOTO $-1 ;no then loop MOVF EEDAT,W MOVWF REEDATA BCF STATUS,RP0 ;Bank 0 RETURN ; ;Analog-to-Digital Converter READC_GP0 ;Out: F(ADRESH,ADRESL) BCF ADCON0,ADFM ;0- X X X X X X X X / x x 0 0 0 0 0 0 BCF ADCON0,VCFG ;0- Vdd 1- Vref pin BCF ADCON0,CHS1 ;Select A/D Input Chennel: GP0 BCF ADCON0,CHS0 ; GOTO READC ; READC_GP1 ;Out: F(ADRESH,ADRESL) BCF ADCON0,ADFM ;0- X X X X X X X X / x x 0 0 0 0 0 0 BCF ADCON0,VCFG ;0- Vdd (1- Vref pin) BCF ADCON0,CHS1 ;Select A/D Input Chennel: GP1 BSF ADCON0,CHS0 ; GOTO READC ; READC_GP2 ;Out: F(ADRESH,ADRESL) BCF ADCON0,ADFM ;0- X X X X X X X X / x x 0 0 0 0 0 0 BCF ADCON0,VCFG ;0- Vdd 1- Vref pin BSF ADCON0,CHS1 ;Select A/D Input Chennel: GP2 BCF ADCON0,CHS0 ; GOTO READC ; READC_GP4 ;Out: F(ADRESH,ADRESL) BCF ADCON0,ADFM ;0- X X X X X X X X / x x 0 0 0 0 0 0 BCF ADCON0,VCFG ;0- Vdd 1- Vref pin BSF ADCON0,CHS1 ;Select A/D Input Chennel: GP4 BSF ADCON0,CHS0 ; GOTO READC ; READC BSF ADCON0,ADON ;1 = A/D converter module is operating MOVLW .9 ; MOVWF ACQT ;Acquisition Time 20uS. Fosc=4MHz DECFSZ ACQT,F ;- GOTO $-1 ;-^ BSF ADCON0,GO ;Start Convertion BTFSC ADCON0,GO ;- GOTO $-1 ;-^ BCF ADCON0,ADON ;0 = A/D converter is shut_off RETURN ; ; SET_ADC BSF STATUS,RP0 ;Bank1 ;I/O Configuration: 1 - Analog Input 0 - Digital I/O BCF ANSEL,ANS0 ;GP0 BCF ANSEL,ANS1 ;GP1/Vref BCF ANSEL,ANS2 ;GP2 BCF ANSEL,ANS3 ;GP4 BSF ANSEL,ADCS2 ;Select A/D Conversion Clock 16xTosc = 4uS at 4MHz!!! BCF ANSEL,ADCS1 ;-//- BSF ANSEL,ADCS0 ;-//- BCF STATUS,RP0 ;Bank0 RETURN ; SET_TMR0 BSF STATUS,RP0 ;Bank1 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 BCF OPTION_REG,PSA ;0- Prescaler is assigned to the Timer0 module 1- Prescaler is assigned to the WDT BTFSC OPTION_REG,PSA ; GOTO SET_TMR0_1 ;--> 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 ; SET_TMR0_1 BCF STATUS,RP0 ;Bank0 RETURN ; SET_TMR1 ;Timer1 Module: Max period 8uS * 65536 = 524,288mS BCF T1CON,T1GINV ;1= Timer1 gate is inverted 0= Timer1 gate is not inverted BCF T1CON,T1GE ;1= Timer1 is on if Timer1 gate is not active 0- Timer1 is on 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 ;1= 0= LP Oscillator is shut off. BCF T1CON,TMR1CS ;1= 0= Internal Clock (Fosc/4) btfsc T1CON,TMR1CS BCF T1CON,NOT_T1SYNC;1= 0= Synchronize External Clock Input BSF T1CON,TMR1ON ;1=Enables Timer1 0= Stop Timer1 RETURN ; SET_PWM ;Reset Pulse Width Modulation BSF STATUS,RP0 ;Bank1 MOVLW 0xFF ; MOVWF PR2 ;Period register. BCF TRISIO,2 ;GP2 Output! BCF STATUS,RP0 ;Bank0 CLRF CCPR1L ;Bit 9 - 2 BCF CCP1CON,DC1B1 ;Bit 1 BCF CCP1CON,DC1B0 ;Bit 0 BCF T2CON,T2CKPS1 ;Timer prescaler 1 - 0 4 - 0 16 - 1 BCF T2CON,T2CKPS0 ;Timer prescaler 0 1 X BSF T2CON,TMR2ON ;Timer2 is ON. MOVLW B'00001100' ;PWM mode Active High. ;MOVLW B'00001110' ;PWM mode Active Low - Invert. MOVWF CCP1CON ; RETURN ; SET_COMPM MOVLW B'00000111' ;I/O Operating Modes. MOVWF CMCON0 ; bcf CMCON0,CIS ;Input Switch Bit. bcf CMCON0,CINV ;1-Output inverted bcf CMCON1,T1GSS ;0-Timer 1 Gate Source is comparator output bcf CMCON1,CMSYNC ;0-Output is asynchronous ;CALL SET_CVREF ;Enable Comparator Voltage Reference Module RETURN ; SET_CVREF BSF STATUS,RP0 ;Bank1 MOVLW B'00000000' MOVWF VRCON ; BSF VRCON,VRR ;Range BSF VRCON,VREN ;Module Enable Bit. BCF STATUS,RP0 ;Bank0 RETURN ; SET_WPU BSF STATUS,RP0 ;Bank1 ;0- Pull-up disabled 1- Pull-up enabled BCF WPU,0 ;GP0 BCF WPU,1 ;GP1 BCF WPU,2 ;GP2 BCF WPU,4 ;GP4 BCF WPU,5 ;GP5 BSF OPTION_REG,NOT_GPPU ;0- Pull-ups Enable 1- Pull-ups Disabled 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 ; SET_OSC ;Oscillator configuration. BSF STATUS,RP0 ;Bank1 Internal Oscillator Frequency Select bits ;8MHz 4MHz 2MHz 1MHz 500KHz 250KHz 125KHz 31,25KHz BSF OSCCON,IRCF2 ;1 1 1 1 0 0 0 0 BSF OSCCON,IRCF1 ;1 1 0 0 1 1 0 0 BCF OSCCON,IRCF0 ;1 0 1 0 1 0 1 0 BCF OSCCON,SCS ;0- Oscillator Mode Defined By h'2007' ;1- Internal oscillator is used for system clock MOVLW OSCTUNE_MNL ;Central frequency MOVWF OSCTUNE ; BCF STATUS,RP0 ;Bank0 RETURN ; ; ;********************************************************************** ;*******Първоначална настройка на микроконтролера********************** START BCF STATUS,RP0 ;Bank0 CLRF GPIO ;Нулира порта. CLRF INTCON ;Забрана за прекъване. CALL SET_OSC ;Oscillator configuration !!! CALL SET_ADC ;ADC configuration !!! CALL SET_WPU ;Pull-up CALL SET_TMR0 CALL SET_TMR1 CALL SET_COMPM ;Comparator Module !!! BSF STATUS,RP0 ;Select Bank1. MOVLW B'00111111' ; MOVWF TRISIO ;I/O Port BCF STATUS,RP0 ;Select Bank0. ;CALL SET_PWM ;Enable PWM & Reset - GP2 ;CALL SET_INT_PORTCHANGE ;CALL SET_INT_TMR1 GOTO BEGIN END