;www.lz4gv.com 2004-04 Firmware EQU .18 list p=16F819 ; list directive to define processor #include ; processor specific variable definitions __CONFIG _INTRC_IO & _PWRTE_ON & _BODEN_ON & _CCP1_RB3 & _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _WDT_OFF & _MCLR_OFF ; _EXTRC_CLKOUT _PWRTE_OFF _BODEN_OFF _CCP1_RB2 _CP_ALL _DEBUG_ON _WRT_ENABLE_512 _CPD_ON _LVP_ON _WDT_ON _MCLR_ON ; _EXTRC_IO _WRT_ENABLE_1024 ; _INTRC_CLKOUT _WRT_ENABLE_1536 ; _EXTCLK ; _HS_OSC ; _XT_OSC ; _LP_OSC OSCTUNE_MNL EQU .0 ;Central frequency min .32 - .63 0 .1 - .31 max #define RA0 PORTA,0 #define RA1 PORTA,1 #define RA2 PORTA,2 #define RA3 PORTA,3 #define RA4 PORTA,4 #define RA5 PORTA,5 #define RA6 PORTA,6 #define RA7 PORTA,7 #define RB0 PORTB,0 #define RB1 PORTB,1 #define RB2 PORTB,2 #define RB3 PORTB,3 #define RB4 PORTB,4 #define RB5 PORTB,5 #define RB6 PORTB,6 #define RB7 PORTB,7 #define STATBIT 0x20,0 PCLMEM EQU 0x73 ; OPTIONMEM EQU 0x74 ; FSRMEM EQU 0x75 ; ACQT EQU 0x76 ; TMR0MEM EQU 0x77 ; TMR1LMEM EQU 0x78 ; TMR1HMEM EQU 0x79 ; INTCONMEM EQU 0x7A ;0x70 to 0x7F Bank 0,1,2,3 REEADR EQU 0x7B ;-//- REEDATA EQU 0x7C ;-//- W_TEMP EQU 0x7D ;-//- STATUS_TEMP EQU 0x7E ;-//- PCLATH_TEMP EQU 0x7F ; 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,RP1 ;Bank0 bcf STATUS,RP0 ; ;******* ;******* 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 .4 ; MOVWF TMR0MEM ; COMF TMR0MEM,W ; MOVWF TMR0 ; BCF INTCON,TMR0IF ;Overflow TMR0 CLRF TMR1L ; MOVLW .250 ; MOVWF TMR1HMEM ; COMF TMR1HMEM,W ; MOVWF TMR1H ; BCF PIR1,TMR1IF ;Overflow TMR1 MOVLW .0 ;Pulse Width Modulation MOVWF CCPR1L ;Bit 9 - 2 BCF CCP1CON,CCP1X ;Bit 1 BCF CCP1CON,CCP1Y ;Bit 0 CALL READC_RA0 ;Out:F(ADRESH) MOVLW .100 ; SUBWF ADRESH,W ;ADRESH > W C=1 BTFSC STATUS,C ;ADRESH = W C=1 GOTO ;ADRESH < W C=0 GOTO ; GOTO MAIN ;********** Край ************* ;********************************************************************** READC_RA0 ;Analog-to-Digital Converter Out: F(ADRESH) BCF ADCON0,CHS2 ;Select A/D Input Chennel: RA0 BCF ADCON0,CHS1 ; BCF ADCON0,CHS0 ; GOTO READC ; READC_RA1 ;Out: F(ADRESH) BCF ADCON0,CHS2 ;Select A/D Input Chennel: RA1 BCF ADCON0,CHS1 ; BSF ADCON0,CHS0 ; GOTO READC ; READC_RA2 ;Out: F(ADRESH) BCF ADCON0,CHS2 ;Select A/D Input Chennel: RA2 BSF ADCON0,CHS1 ; BCF ADCON0,CHS0 ; GOTO READC ; READC_RA3 ;Out: F(ADRESH) BCF ADCON0,CHS2 ;Select A/D Input Chennel: RA3 BSF ADCON0,CHS1 ; BSF ADCON0,CHS0 ; GOTO READC ; READC_RA4 ;Out: F(ADRESH) BSF ADCON0,CHS2 ;Select A/D Input Chennel: RA4 BCF ADCON0,CHS1 ; BCF ADCON0,CHS0 ; GOTO READC ; READC BSF ADCON0,ADON ;1 = A/D converter module is operating MOVLW .18 ;Fosc=4MHz MOVWF ACQT ;Acquisition Time 40uS. READC_AC ; DECFSZ ACQT,F ; GOTO READC_AC ;-^ BSF ADCON0,GO ;Start Convertion READC_CH ; BTFSC ADCON0,GO ; GOTO READC_CH ;-^ BCF ADCON0,ADON ;0 = A/D converter is shut_off RETURN ; ; WRITE ;In:F(REEADR,REEDATA) BSF STATUS,RP1 ; BCF STATUS,RP0 ;Bank2 MOVF REEADR,W ; MOVWF EEADR MOVF REEDATA,W MOVWF EEDATA BSF STATUS,RP1 ; BSF STATUS,RP0 ;Bank3 BCF EECON1,EEPGD ;0 - Accesses data memory EEPROM BCF INTCONMEM,GIE ; BTFSC INTCON,GIE ; BSF INTCONMEM,GIE ; BCF INTCON,GIE ;Disable INTs. BTFSC INTCON,GIE ;See AN576 GOTO $-2 ; BSF EECON1,WREN ;1 - Allows write cycles MOVLW 0x55 ; MOVWF EECON2 ; MOVLW 0xAA ; MOVWF EECON2 ; BSF EECON1,WR ;1 - initiates a write cycles WRITE_CH ; BTFSC EECON1,WR ;0 - Write cycles to the EEPROM is complete GOTO WRITE_CH ;-^ BTFSC INTCONMEM,GIE ; BSF INTCON,GIE ; BCF EECON1,WREN ;disable write BCF STATUS,RP1 ; BCF STATUS,RP0 ;Bank0 RETURN ; READE ;In:F(REEADR) BSF STATUS,RP1 ; BCF STATUS,RP0 ;Bank2 MOVF REEADR,W ;Out:F(REEDATA),W MOVWF EEADR BSF STATUS,RP1 ; BSF STATUS,RP0 ;Bank3 BCF EECON1,EEPGD ;0 - Accesses data memory EEPROM BSF EECON1,RD ;1 - initiates an EEPOM read READE_CH BTFSC EECON1,RD ;rd done? GOTO READE_CH ;no then loop BSF STATUS,RP1 ; BCF STATUS,RP0 ;Bank2 MOVF EEDATA,W MOVWF REEDATA BCF STATUS,RP1 ; BCF STATUS,RP0 ;Bank0 RETURN ; ; SET_OSC ;Oscillator configuration. BSF STATUS,RP0 ;Bank1 MOVWF OSCCON ; MOVLW OSCTUNE_MNL ;Central frequency MOVWF OSCTUNE ; BCF STATUS,RP0 ;Bank0 RETURN ; ; SET_ADC BSF STATUS,RP0 ;Bank1 MOVWF ADCON1 ; BCF ADCON1,ADFM ;X X X X X X X X / x x BSF ADCON1,ADCS2 ;Select A/D Conversion Clock 16xTosc = 4uS at 4MHz!!! BCF STATUS,RP0 ;Bank0 BCF ADCON0,ADCS1 ;Select A/D Conversion Clock BSF ADCON0,ADCS0 ;-//- RETURN ; SET_TMR0 BSF STATUS,RP0 ;Bank1 MOVWF OPTION_REG ; BSF OPTION_REG,NOT_RBPU ;'1' - Pull-ups Disabled BSF OPTION_REG,INTEDG ;'1' -Rising RB0 Interrupt BCF STATUS,RP0 ;Bank0 RETURN ; SET_TMR1 ;Timer1 Module: Max period 8uS * 65536 = 524,288mS 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_PWM ;Reset Pulse Width Modulation BSF STATUS,RP0 ;Bank1 BCF TRISB,3 ;RB3 Output! MOVLW 0xFF ; MOVWF PR2 ;Period register. BCF STATUS,RP0 ;Bank0 CLRF CCPR1L ;Bit 9 - 2 BCF CCP1CON,CCP1X ;Bit 1 BCF CCP1CON,CCP1Y ;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. MOVWF CCP1CON ; RETURN ; ;*******Първоначална настройка на микроконтролера********************** START BANKSEL PORTA CLRF PORTA CLRF PORTB CLRF INTCON ;Забрана за прекъване. ;MOVLW B'01110000' ;Internal oscillator 8MHz MOVLW B'01100000' ;Internal oscillator 4MHz ;MOVLW B'00000000' ;Internal oscillator 31,25KHz CALL SET_OSC ;Oscillator configuration! MOVLW B'00000110' ;All Digital I/O !!! ;MOVLW B'00001110' ;Analog Input RA0 ;MOVLW B'00000101' ;Analog Input RA0,RA1,Vref+(RA3) ;MOVLW B'00000100' ;Analog Input RA0,RA1,RA3 ;MOVLW B'00000000' ;Analog Input RA0,RA1,RA2,RA3,RA4 CALL SET_ADC ;Analog & Digital I/O configuration! MOVLW B'00000111' ;Fosc/4/256 4MHz = 0,256mS CALL SET_TMR0 CALL SET_TMR1 CALL SET_PWM ;Enable PWM & Reset BSF STATUS,RP0 ;Select Bank1. MOVLW B'00000000' ; MOVWF TRISA ;PortA MOVLW B'11111111' ; MOVWF TRISB ;PortB BCF STATUS,RP0 ;Select Bank0. GOTO BEGIN END