;LZ4GV 2014-01 Firmware EQU .6 list p=16f1829 ; list directive to define processor #include ; processor specific variable definitions ;Set Configuration Register __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF ; _FOSC_LP _WDTE_ON _PWRTE_OFF _MCLRE_ON _CP_ON _CPD_ON _BOREN_OFF _CLKOUTEN_ON _IESO_ON _FCMEN_ON ; _FOSC_XT _WDTE_NSLEEP _BOREN_NSLEEP ; _FOSC_HS _WDTE_SWDTEN _BOREN_SBODEN ; _FOSC_EXTRC ; _FOSC_ECL ; _FOSC_ECM ; _FOSC_ECH __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_HI & _LVP_OFF ;_BORV_HI = 2.55 to 2.85V ; _WRT_BOOT _PLLEN_ON _STVREN_ON _BORV_LO _LVP_ON ;_BORV_LO = 1.80 to 2.05V ; _WRT_HALF ; _WRT_ALL OSCTUNE_MNL EQU .0 ;Central frequency min .32 - .63 0 .1 - .31 max #define PORTA0 PORTA,0 ;Pin_19 #define PORTA1 PORTA,1 ;Pin_18 #define PORTA2 PORTA,2 ;Pin_17 #define PORTA3 PORTA,3 ;Pin_4 #define PORTA4 PORTA,4 ;Pin_3 #define PORTA5 PORTA,5 ;Pin_2 #define PORTA5_IO TRISA,5 ; #define PORTB4 PORTB,4 ;Pin_13 #define PORTB5 PORTB,5 ;Pin_12 #define PORTB6 PORTB,6 ;Pin_11 #define PORTB7 PORTB,7 ;Pin_10 #define PORTB7_IO TRISB,7 ; #define PORTC0 PORTC,0 ;Pin_16 #define PORTC1 PORTC,1 ;Pin_15 #define PORTC2 PORTC,2 ;Pin_14 #define PORTC3 PORTC,3 ;Pin_7 #define PORTC4 PORTC,4 ;Pin_6 #define PORTC5 PORTC,5 ;Pin_5 #define PORTC6 PORTC,6 ;Pin_8 #define PORTC7 PORTC,7 ;Pin_9 #define PORTC7_IO TRISC,7 ; ;0x20 to 0x6F Bank 0 #define STATBIT 0x20,0 ; ;TMR0MEM EQU 0x6A ; ;TMR1LMEM EQU 0x6B ; ;TMR1HMEM EQU 0x6C ; ;FSRMEM EQU 0x6D ; ;PCLMEM EQU 0x6E ; ;0x70 to 0x7F Bank 0,1,2,3..... ACQT EQU 0x79 ;ADC Bank1 RADRESL EQU 0x7A ;ADC RADRESH EQU 0x7B ;ADC REEADR EQU 0x7C ;EEPROM REEDATA EQU 0x7D ;EEPROM OPTIONMEM EQU 0x7E ; INTCONMEM EQU 0x7F ; ;0x0A0 to 0x0EF Bank 1 ;0x120 to 0x16F Bank 2 ;0x1A0 to 0x1EF Bank 3 ;0x220 to 0x26F Bank 4 ;0x2A0 to 0x2EF Bank 5 ;0x320 to 0x32F Bank 6 #define WPAGE PCLATH,3 ;0- Work. Page0 1- Work. Page1 #define Bank0_1 BSR,0 ;0= Bank0 1= Bank1 INDF EQU INDF0 FSR EQU FSR0L ORG 0xF000 ;Initialize EEPROM locations 0xF000 - 0xF0FF DE 0x00,0x01,0x02,0x03 ORG 0x0000 GOTO START ;**************************************************************** ORG 0x0004 ;Interrupt vector location clrf BSR ;Bank0 clrf PCLATH ;0- Work. Page0 btfsc INTCON,IOCIF ;PORTA/PORTB Change Interrupt Global Flag GOTO INT_PORTCHANGE ;--> btfsc PIR1,TMR1IF ;Overflow TMR1 GOTO INT_TMR1 ;--> btfsc INTCON,INTF ;INT External Interrupt Flag GOTO INT_EXTINT GOTO INT_END ;--> ;------------------------------------------------------------------------------ ; USER INTERRUPT SERVICE ROUTINE GOES HERE ;------------------------------------------------------------------------------ INT_PORTCHANGE MOVLB .7 ;Bank7 CLRF IOCAF ;PORTA Flag Register Interrupt-On-Change CLRF IOCBF ;PORTB Flag Register Interrupt-On-Change MOVLB .0 ;Bank0 bcf INTCON,IOCIF ;PORTA/PORTB Change Interrupt Global Flag GOTO INT_END ;--> INT_TMR1 bcf PIR1,TMR1IF ;TMR1 Overflow Interrupt Flag GOTO INT_END ;--> INT_EXTINT bcf INTCON,INTF ;INT External Interrupt Flag GOTO INT_END ;--> INT_END ;Automatically handles context restoration for W, STATUS, BSR, FSR, and PCLATH RETFIE ;Return From Interrupt / Enable Global Interrupts ;**************************************************************** BEGIN MOVLW 0x20 ;Start Address RAM. MOVWF FSR0L ; CLRF FSR0H CLRF FSR1L CLRF FSR1H CLRRAM ; CLRF INDF0 ; ; INDF1 ; MOVLW 0x7F ;End Address RAM. SUBWF FSR0L,W ;FSR0H INCF FSR0L,F ; BTFSS STATUS,C ;FSR = or > W C=1 GOTO CLRRAM ;FSR < W C=0 ;********** Начало *********** MAIN ;------------------------------------------------------------------------------ ; MAIN PROGRAM MOVLW .4 ; MOVWF TMR0 ; BCF INTCON,TMR0IF ;Overflow TMR0 MOVLW 0xDB ; MOVWF TMR1L ; MOVLW 0x0B ; MOVWF TMR1H ; BCF PIR1,TMR1IF ;Overflow TMR1 MOVLB .5 ;Bank5 MOVLW 0x80 ;Pulse Width Modulation MOVWF CCPR1L ;Bit 9 - 2 BCF CCP1CON,DC1B1 ;Bit 1 BCF CCP1CON,DC1B0 ;Bit 0 MOVLB .0 ;Bank5 ; MOVLW .100 ; ; SUBWF RADRESH,W ;ADRESH > W C=1 ; BTFSC STATUS,C ;ADRESH = W C=1 ; GOTO ;ADRESH < W C=0 ; GOTO ; ; movlw .50 ; sublw .20 ;W < .20 C=1 ; BTFSC STATUS,C ;W = .20 C=1 ; GOTO ;W > .20 C=0 ; GOTO ; MOVLB .1 ;Bank 1 MOVF OPTION_REG,W ;Запомня състоянието на OPTION_REG. MOVWF OPTIONMEM ;Променя TMR0 ANDLW B'11111000' ;Нулира само PS2 PS1 PS0 IORLW B'00000001' ;Променя Fosc/4/4 = 4uS MOVWF OPTION_REG ; MOVLB .0 ;Bank 0 MOVLB .1 ;Bank 1 MOVF OPTIONMEM,W ; MOVWF OPTION_REG ; MOVLB .0 ;Bank 0 ;CALL READE ;In:F(REEADR) Out:F(REEDAT),W ;CALL WRITE ;In:F(REEADR,REEDATA) MOVLW RA0_AN0 ; CALL READ_ADC ;In: W(Analog Select) Out:F(RADRESH,RADRESL) ;MOVLW '$' ;CALL UAT MOVLB .2 ;Bank2 BTFSS CM1CON0,C1OUT ; NOP BTFSS CM2CON0,C2OUT ; NOP MOVLB .0 ;Bank0 ;******* BCF INTCON,GIE ;Disable All INTs. BTFSC INTCON,GIE ;See AN576 GOTO $-2 ; BSF INTCON,GIE ;Enable All INTs. ;******* GOTO MAIN ;------------------------------------------------------------------------------ ;********** Край ************* ;********************************************************************** WRITE ;In:F(REEADR,REEDATA) MOVLB .3 ;Bank3 MOVF REEADR,W ; MOVWF EEADRL MOVF REEDATA,W MOVWF EEDATL BCF EECON1,CFGS BCF EECON1,EEPGD ;1= Program Memory 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 0= MOVLW 0x55 ; MOVWF EECON2 ; MOVLW 0xAA ; MOVWF EECON2 ; BSF EECON1,WR ; BTFSC EECON1,WR ;1= Write Cycles 0= Write cycles to the EEPROM is complete GOTO $-1 ;-^ ;BTFSC EECON1,WRERR ;1= Write Terminated 0= Write Operation Completed ;NOP BCF EECON1,WREN ;disable write BTFSC INTCONMEM,GIE ; BSF INTCON,GIE ; MOVLB .0 ;Bank0 RETURN ; READE ;In:F(REEADR) Out:F(REEDAT),W MOVLB .3 ;Bank3 MOVF REEADR,W MOVWF EEADRL BCF EECON1,CFGS BCF EECON1,EEPGD ;1= Program Memory 0= Accesses data memory EEPROM BSF EECON1,RD ;1 - initiates an EEPOM read BTFSC EECON1,RD ;rd done? GOTO $-1 ;no then loop MOVF EEDATL,W MOVWF REEDATA MOVLB .0 ;Bank0 RETURN ; ; RA0_AN0 EQU B'00000000' ;Analog Channel Select bits <5:2> RA1_AN1 EQU B'00000100' RA2_AN2 EQU B'00001000' RA4_AN3 EQU B'00001100' RB4_AN10 EQU B'00101000' RB5_AN11 EQU B'00101100' RC0_AN4 EQU B'00010000' RC1_AN5 EQU B'00010100' RC2_AN6 EQU B'00011000' RC3_AN7 EQU B'00011100' RC6_AN8 EQU B'00100000' RC7_AN9 EQU B'00100100' ; EQU B'01111000' ;DAC Output ; EQU B'01111100' ;FVR Module READ_ADC ;Analog-to-Digital Converter In: W(Analog Select) Out:F(RADRESH,RADRESL) MOVLB .1 ;Bank1 MOVWF ADCON0 ;Analog Channel Select bits <5:2> BSF ADCON0,ADON ;1= A/D Converter Module Enable 0= Disable ;MOVLW .20 ;Fosc=32MHz ;MOVLW .5 ;Fosc= 8MHz MOVLW .2 ;Fosc= 4MHz MOVWF ACQT ;Min Acquisition Time 5uS DECFSZ ACQT,F ;- GOTO $-1 ;-^ BSF ADCON0,ADGO ;Start Convertion BTFSC ADCON0,ADGO ; GOTO $-1 ;-^ BCF ADCON0,ADON ;0 = A/D converter is shut_off MOVF ADRESH,W MOVWF RADRESH MOVF ADRESL,W MOVWF RADRESL MOVLB .0 ;Bank0 RETURN ; ; SET_ADC ;Page147 MOVLB .1 ;Bank1 BCF ADCON1,ADFM ;1= X X / x x x x x x x x 0= X X X X X X X X / x x ;<1MHz 32MHz 20MHz 8MHz 4MHz Select A/D Conversion Clock. ;IntOSC Fosc/64 Fosc/32 Fosc/16 Fosc/8 BCF ADCON1,ADCS2 ;x 1 0 1 0 BCF ADCON1,ADCS1 ;1 1 1 0 0 BSF ADCON1,ADCS0 ;1 0 0 1 1 BCF ADCON1,ADNREF ;1= Vref- pin 0= Vss BCF ADCON1,ADPREF1 ;1= Vref+ FVR module 1= Vref+ pin 0= Reserved 0=Vdd BCF ADCON1,ADPREF0 ;1= 0= 1= 0= MOVLB .0 ;Bank0 RETURN ; SET_COMPM ;Page173 MOVLB .2 ;Bank2 ;Comarator1 BCF CM1CON1,C1INTP ; BCF CM1CON1,C1INTN ; ;C1VP connects to: BCF CM1CON1,C1PCH1 ;1= VSS 1= FVR Vref 0= DAC Vref 0= C1IN+ pin BCF CM1CON1,C1PCH0 ;1= 0= 1= 0= ;C1VN connects to: BCF CM1CON1,C1NCH1 ;1= C12IN3- pin 1= C12IN2- pin 0= C12IN1- pin 0= C12IN0- pin BCF CM1CON1,C1NCH0 ;1= 0= 1= 0= BCF CM1CON0,C1SYNC ;1= Synchronous 0= Output to Timer1, I/O Pin Is Asinchronous BCF CM1CON0,C1HYS ;1= Hysteresis Enabled 0= Hysteresis Disabled BSF CM1CON0,C1SP ;1= Higher Speed, Normal 0= Low Speed Mode, Low-power Operates BCF CM1CON0,C1POL ;1= Output Inverted 0= Comparator Output Is Non Inverted BCF CM1CON0,C1OE ;1= 0= C1OUT Is Internal Only BSF CM1CON0,C1ON ;1= Comarator1 Enabled 0= ;Comarator2 BCF CM2CON1,C2INTP ; BCF CM2CON1,C2INTN ; ;C2VP connects to: BCF CM2CON1,C2PCH1 ;1= VSS 1= FVR Vref 0= DAC Vref 0= C2IN+ pin BCF CM2CON1,C2PCH0 ;1= 0= 1= 0= ;C2VN connects to: BCF CM2CON1,C2NCH1 ;1= C12IN3- pin 1= C12IN2- pin 0= C12IN1- pin 0= C12IN0- pin BCF CM2CON1,C2NCH0 ;1= 0= 1= 0= BCF CM2CON0,C2SYNC ;1= Synchronous 0= Output to Timer1, I/O Pin Is Asinchronous BCF CM2CON0,C2HYS ;1= Hysteresis Enabled 0= Hysteresis Disabled BSF CM2CON0,C2SP ;1= Higher Speed, Normal 0= Low Speed Mode, Low-power Operates BCF CM2CON0,C2POL ;1= Output Inverted 0= Comparator Output Is Non Inverted BCF CM2CON0,C2OE ;1= 0= C1OUT Is Internal Only BSF CM2CON0,C2ON ;1= Comarator2 Enabled 0= CLRF SRCON0 ;Page167 CLRF SRCON1 ; MOVLB .0 ;Bank0 RETURN ; SET_FVR ;Fixed Voltage Reference Page145 MOVLB .2 ;Bank2 BSF FVRCON,FVREN ;1= FVR Enable ;For Comparator and DAC BCF FVRCON,CDAFVR1 ;1= 4.096V 1= 2.048V 0= 1.024V 0= is OFF BCF FVRCON,CDAFVR0 ;1= 0= 1= 0= ;For ADC bsf FVRCON,ADFVR1 ;1= 4.096V 1= 2.048V 0= 1.024V 0= is OFF bcf FVRCON,ADFVR0 ;1= 0= 1= 0= BTFSS FVRCON,FVRRDY ;1 = Fixed Voltage Reference otput is ready for use NOP ;BCF FVRCON,TSEN ;1 = Temperature indicator is enabled ;BCF FVRCON,TSRNG ;1 = VDD > 3.6V (High Range) 0 = VDD > 1.8V (Low Range) MOVLB .0 ;Bank0 RETURN ; SET_UART MOVLB .3 ;Bank3 ;MOVLW .103 ;19200 bps UART Fosc=8MHz MOVLW .51 ;19200 bps UART Fosc=4MHz MOVWF SPBRGL ; CLRF SPBRGH ; MOVLB .1 ;Bank1 BCF TRISB,7 ;TX (RB7) Serial Output BSF TRISB,5 ;RX (RB5) Serial Input MOVLB .3 ;Bank1 ;Trasnit Status & Control Register ;BCF TXSTA,CSRC ;Don't care BCF TXSTA,TX9 ;1= 9-bit TX 0= 8-bit TX BSF TXSTA,TXEN ;1= Enable TX 0= Disable TX BCF TXSTA,SYNC ;1= Synchronous Mode 0= Asynchronous Mode ;BCF TXSTA,SENDB ;1= 0= BSF TXSTA,BRGH ;1= High Speed 0= Low Speed ;BTFSC TXSTA,TRMT ;1= Empty Transmit Shift Reg. 0= Full ;NOP ; ;BCF TXSTA,TX9D ;9bit Parity Bit ;BTFSC BAUDCON,ABDOVF ; ;NOP ;BTFSC BAUDCON,RCIDL ; ;NOP BCF BAUDCON,SCKP ;1= Transmit Inverted Data 0= Non-Inverted BSF BAUDCON,BRG16 ;1= 16-Bit Baud Rate Generator 0= 8-Bit BRG BCF BAUDCON,WUE ;Wake-up Enabled bit BCF BAUDCON,ABDEN ;1= Auto_Baud Detect Enabled 0= Desabled ;Receive Status & Control Register BSF RCSTA,SPEN ;1= Serial Port Enabbled 0= BCF RCSTA,RX9 ;1= 9-bit RX 0= 8-bit RX ;BCF RCSTA,SREN ;Don't care BCF RCSTA,CREN ;1= Enables Continuous Receive 0= Disables BCF RCSTA,ADDEN ;1= Enable Address Detection 0= Disabled ;BTFSC RCSTA,FERR ;1= Framing Error 0= No Framing Error ;NOP ;BTFSC RCSTA,OERR ;1= Overrun Error 0= No Overrun Error ;NOP ;BTFSC RCSTA,RX9D ;9th bit of Receive Data ;NOP MOVLB .0 ;Bank0 RETURN ; UAT ;Universal Asynchronous Transmiter In: W BTFSS PIR1,TXIF GOTO $-1 MOVLB .3 ;Bank3 MOVWF TXREG MOVLB .0 BTFSS PIR1,TXIF ;1= Transmit Buffer is Empty GOTO $-1 ;XORWF CHSUM,F ;Пресмята контролната сума на изпратените данни. RETURN ; SET_PWM1 ;Pulse Width Modulation Page218 MOVLB .5 ;Bank5 MOVLW B'00001100' ;<3:2>=xxxx11xx => PWM mode IORLW B'00000000' ;<7:6>=00xxxxxx => Single output; P1A modulated; P1B, P1C, P1D assigned as port pins ;IORLW B'01000000' ;<7:6>=01xxxxxx => Full-Bridge output forward ;IORLW B'10000000' ;<7:6>=10xxxxxx => Half-Bridge output; P1A, P1B modulated with dead-band control; P1C, P1D assigned as port pins ;IORLW B'01000000' ;<7:6>=01xxxxxx => Full-Bridge output reverse IORLW B'00000000' ;<1:0>=xxxxxx00 => PWM mode; P1A, P1C active-high; P1B, P1D active-high ;IORLW B'00000001' ;<1:0>=xxxxxx01 => PWM mode; P1A, P1C active-high; P1B, P1D active-low ;IORLW B'00000010' ;<1:0>=xxxxxx10 => PWM mode; P1A, P1C active-low; P1B, P1D active-high ;IORLW B'00000011' ;<1:0>=xxxxxx11 => PWM mode; P1A, P1C active-low; P1B, P1D active-low MOVWF CCP1CON ; CLRF PSTR1CON ;Only Single Output CCP1CON='00xx11xx' BSF PSTR1CON,STR1SYNC ;1 = Output steering update occurs on next PWM period BSF PSTR1CON,STR1A ;1=P1A pin has the PWM ;Page 240 ;MOVLW .3 ;Only Half-Bridge Mode ;MOVWF PWM1CON ;<6:0> Death Time X * Tosc * 4 BCF PWM1CON,P1RSEN ;0 = ECCPASE must be cleared in software to restart the PWM. ;1 = The ECCPASE bit clears automatically once the shutdown event goes away. MOVLB .5 ;Bank5 CLRF CCPR1L ;Bit 9 - 2 BCF CCP1CON,DC1B1 ;Bit 1 BCF CCP1CON,DC1B0 ;Bit 0 MOVLB .5 ;Bank5 CCP1 is based off TMRx in PWM Mode ;TMR2 TMR4 TMR6 BCF CCPTMRS,C1TSEL1 ;0 0 1 BCF CCPTMRS,C1TSEL0 ;0 1 0 BCF CCP1AS,CCP1ASE ;0=CCP outputs are operating 1=CCP outputs are in shutdown state ;Disabl C1_high C2_high C1&C2 INT_low ...... BCF CCP1AS,CCP1AS2 ;0 0 0 0 1 BCF CCP1AS,CCP1AS1 ;0 0 1 1 0 BCF CCP1AS,CCP1AS0 ;0 1 0 1 0 ;P1A & P1C to '0' P1A & P1C to '1' P1A & P1C to tri-state BCF CCP1AS,PSS1AC1 ;0 0 1 BCF CCP1AS,PSS1AC0 ;0 1 X ;P1B & P1D to '0' P1B & P1D to '1' P1B & P1D to tri-state BCF CCP1AS,PSS1BD1 ;0 0 1 BCF CCP1AS,PSS1BD0 ;0 1 X MOVLB .0 ;Bank0 MOVLW 0xFF ; MOVWF PR2 ;Period register. Bank0 ;1:1 1:2 ..... 1:16 BCF T2CON,T2OUTPS3 ;0 0 Page199 BCF T2CON,T2OUTPS2 ;0 0 BCF T2CON,T2OUTPS1 ;0 0 BCF T2CON,T2OUTPS0 ;0 1 BCF T2CON,T2CKPS1 ;Timer prescaler 0= /1 0= /4 1= /16 1= /64 BCF T2CON,T2CKPS0 ;Timer prescaler 0 1 X 1= BSF T2CON,TMR2ON ;0= 1=Timer2 is On MOVLB .2 ;Bank2 Page123 BCF APFCON1,P1DSEL ;0=P1D ->RC2 1=P1D ->RC0 BCF APFCON1,P1CSEL ;0=P1C ->RC3 1=P1C ->RC1 ;BCF APFCON1,P2BSEL ;0=P2B ->RC2 1=P2B ->RA4 ;BSF APFCON1,CCP2SEL ;0=CCP2->RC3 1=CCP2->RA5 MOVLB .0 ;Bank0 CLRF TMR2 ; BCF PIR1,TMR2IF ; BTFSS PIR1,TMR2IF ;New PWM cycle? GOTO $-1 ; MOVLB .1 ;Bank1 BCF TRISC,5 ;P1A = RC5 Output! ;BCF TRISC,4 ;P1B = RC4 Output! ;BCF TRISC,3 ;P1C = RC3/RC1 Output! ;BCF TRISC,2 ;P1D = RC2/RC0 Output! MOVLB .0 ;Bank0 RETURN ; SET_PWM3 ;Pulse Width Modulation Page218 MOVLB .6 ;Bank6 MOVLW B'00001100' ;<3:2>=xxxx11xx => PWM mode <7:6>=00xxxxxx => Single output active-high ! MOVWF CCP3CON ;Page236 MOVLB .6 CLRF CCPR3L ;Bit 9 - 2 Bank6 BCF CCP3CON,DC3B1 ;Bit 1 BCF CCP3CON,DC3B0 ;Bit 0 MOVLB .5 ;Bank5 CCP1 is based off TMRx in PWM Mode ;TMR2 TMR4 TMR6 BCF CCPTMRS,C3TSEL1 ;0 0 1 BCF CCPTMRS,C3TSEL0 ;0 1 0 MOVLB .0 ;Bank0 MOVLW 0xFF ; MOVWF PR2 ;Period register. Use TMR2 Bank0 ;MOVWF PR4 ;Period register. Use TMR4 Bank8 ! ;MOVWF PR6 ;Period register. Use TMR6 Bank8 ! MOVLB .0 ;1:1 1:2 ..... 1:16 Page199 BCF T2CON,T2OUTPS3 ;0 0 BCF T2CON,T2OUTPS2 ;0 0 BCF T2CON,T2OUTPS1 ;0 0 BCF T2CON,T2OUTPS0 ;0 1 BCF T2CON,T2CKPS1 ;Timer prescaler 0= /1 0= /4 1= /16 1= /64 BCF T2CON,T2CKPS0 ;Timer prescaler 0 1 X 1= BSF T2CON,TMR2ON ;0= 1=Timer2 is On ;T4CON ;Bank8 ;T6CON ;Bank8 MOVLB .0 ;Bank0 CLRF TMR2 ; BCF PIR1,TMR2IF ; BTFSS PIR1,TMR2IF ;New PWM cycle? GOTO $-1 ; ;TMR4 ;Bank8 ;PIR3,TMR4IF ;Bank0 ;TMR6 ;Bank8 ;PIR3,TMR6IF ;Bank0 MOVLB .1 ;Bank1 BCF TRISA,2 ;RA2 Output! MOVLB .0 ;Bank0 RETURN ; SET_PWM4 ;Pulse Width Modulation Page218 MOVLB .6 ;Bank6 MOVLW B'00001100' ;<3:2>=xxxx11xx => PWM mode <7:6>=00xxxxxx => Single output active-high ! MOVWF CCP4CON ; MOVLB .6 ;Bank6 CLRF CCPR4L ;Bit 9 - 2 BCF CCP4CON,DC4B1 ;Bit 1 BCF CCP4CON,DC4B0 ;Bit 0 MOVLB .5 ;Bank5 CCP1 is based off TMRx in PWM Mode ;TMR2 TMR4 TMR6 BCF CCPTMRS,C4TSEL1 ;0 0 1 BCF CCPTMRS,C4TSEL0 ;0 1 0 MOVLB .0 ;Bank0 MOVLW 0xFF ; MOVWF PR2 ;Period register. Bank0 ;MOVWF PR4 ;Period register. Bank8 ! ;MOVWF PR6 ;Period register. Bank8 ! MOVLB .0 ;1:1 1:2 ..... 1:16 Page199 BCF T2CON,T2OUTPS3 ;0 0 BCF T2CON,T2OUTPS2 ;0 0 BCF T2CON,T2OUTPS1 ;0 0 BCF T2CON,T2OUTPS0 ;0 1 BCF T2CON,T2CKPS1 ;Timer prescaler 0= /1 0= /4 1= /16 1= /64 BCF T2CON,T2CKPS0 ;Timer prescaler 0 1 X 1= BSF T2CON,TMR2ON ;0= 1=Timer2 is On ;T4CON ;Bank8 ;T6CON ;Bank8 MOVLB .0 ;Bank0 CLRF TMR2 ; BCF PIR1,TMR2IF ; BTFSS PIR1,TMR2IF ;New PWM cycle? GOTO $-1 ; ;TMR4 ;Bank8 ;TMR6 ;Bank8 ;PIR3,TMR4IF ;Bank0 ;PIR3,TMR6IF ;Bank0 MOVLB .1 ;Bank1 BCF TRISC,6 ;RC6 Output! MOVLB .0 ;Bank0 RETURN ; SET_TMR0 ;Page183 MOVLB .1 ;Bank1 BCF OPTION_REG,TMR0CS ;0=Intrnal Clock Source Fosc/4 1=T0CKI pin (RA4) BTFSC OPTION_REG,TMR0CS ; BCF OPTION_REG,TMR0SE ;0= Low -> High T0CKI 1= High -> Low T0CKI BCF OPTION_REG,PSA ;0 - Prescaler Is Assigned To The TMR0 Module 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 MOVLB .0 ;Bank0 RETURN ; SET_TMR1 ;Timer1 Module: Max period 8uS * 65536 = 524,288mS (Fosc=4MHz) Page187 BCF T1CON,TMR1CS1 ;1=Capacitive Sens OSC 1=External Clock T1CKI (RA5) 0=System Clock (Fosc) 0=Insrtuction Clock (Fosc/4) BCF T1CON,TMR1CS0 ;1= 0= 1= 0= BSF T1CON,T1CKPS1 ;Timer prescaler 1= /8 1= /4 0= /2 0= /1 BSF T1CON,T1CKPS0 ;Timer prescaler 1 0 1 0 BCF T1CON,T1OSCEN ;1=Enable TMR1 Oscillator 0=Oscillator Circuit Disable BTFSC T1CON,TMR1CS1 BSF T1CON,NOT_T1SYNC;0= 1=Do not synchronize external clock input BSF T1CON,TMR1ON ;0=Stop Timer1 1=Enables Timer1 BCF T1GCON,TMR1GE ;0= Always Counting 1= Gate Control ;;;Page196 RETURN ; SET_WDT ;Page103 MOVLB .1 ;Bank1 MOVLW B'00010110' ;1:65536 1mS to 256S MOVWF WDTCON ; BCF WDTCON,SWDTEN ;1=WDT Is Turned ON If Configuration 2007h Enable 0=WDT Is Turned OFF MOVLB .0 ;Bank0 RETURN ; SET_INT_DISABLE ;Page87 CLRF INTCON MOVLB .1 ;Bank1 CLRF PIE1 CLRF PIE2 CLRF PIE3 MOVLB .0 ;Select Bank0. RETURN SET_INT_PORTCHANGE ;Page141 MOVLB .7 ;Bank7 MOVLW B'00000000' ;7 6 IOCAx5 IOCAx4 IOCAx3 IOCAx2 IOCAx1 IOCAx0 MOVWF IOCAP ;1=Interrupt-on-change Positive Enabled 0=Interrupt-on-change Positive Disabled MOVLW B'00000000' ;7 6 IOCAx5 IOCAx4 IOCAx3 IOCAx2 IOCAx1 IOCAx0 MOVWF IOCAN ;1=Interrupt-on-change Negative Enabled 0=Interrupt-on-change Negative Disabled MOVLW B'00000000' ;IOCBx7 IOCBx6 IOCBx5 IOCBx4 3 2 1 0 MOVWF IOCBP ;1=Interrupt-on-change Positive Enabled 0=Interrupt-on-change Positive Disabled MOVLW B'00000000' ;IOCBx7 IOCBx6 IOCBx5 IOCBx4 3 2 1 0 MOVWF IOCBN ;1=Interrupt-on-change Negative Enabled 0=Interrupt-on-change Negative Disabled CLRF IOCAF ;PORTA Flag Register Bank7 CLRF IOCBF ;PORTB Flag Register MOVLB .0 ;Bank0 bcf INTCON,IOCIF ;PORTA/PORTB Change Interrupt Global Flag bsf INTCON,IOCIE ;1=PORTA/PORTB Change Interrupt Enables 0=PORTA/PORTB Change Interrupt Disable RETURN SET_INT_EXTINT ;Pin RA2 Page87 MOVLB .1 ;Bank1 BSF OPTION_REG,INTEDG;1=Rising RA2/INT Interrupt 0=Falling RA2/INT Interrupt bsf INTCON,INTE ;1=RA2/INT Change Interrupt Enables 0=RA2/INT Change Interrupt Disable bcf INTCON,INTF ;RA2/INT Change Interrupt Flag MOVLB .0 ;Bank0 RETURN SET_INT_TMR1 MOVLB .1 ;Bank1 BSF PIE1,TMR1IE ;1=Enables TMR1 Overflow Interrupt 0=Disables TMR1 Overflow Interrupt MOVLB .0 ;Bank0 BCF PIR1,TMR1IF ;TMR1 Overflow Interrupt Flag BSF INTCON,PEIE ;1=Enables All Peripheral Interrupts 0=Disables All Peripheral Interrupts RETURN ; SET_OSC ;Oscillator configuration. MOVLB .1 ;Bank1 BCF OSCCON,SPLLEN ;1= 4x PLL Enable 0= Disable Fmax = 8MHz x4 = 32MHz LFINTOSC ;16MHz 8MHz 4MHz 2MHz 1MHz 500KHz 250KHz 125KHz 31,25KHz 31KHz BSF OSCCON,IRCF3 ;1 1 1 1 0 0 0 0 0 0 BSF OSCCON,IRCF2 ;1 1 1 1 0 1 1 1 0 0 BCF OSCCON,IRCF1 ;1 1 0 0 1 1 1 0 1 0 BSF OSCCON,IRCF0 ;1 0 1 0 1 1 0 1 0 0 BCF OSCCON,SCS1 ;1=Internal Oscillator Block 0= Clock Source Defined By h'2007' 0= Timer1 oscillator BCF OSCCON,SCS0 ;X= 0= 1= BCF OSCSTAT,OSTS ;0=Running from an Internal Oscillator MOVLW OSCTUNE_MNL ;Central frequency MOVWF OSCTUNE ; MOVLB .0 ;Bank0 RETURN ; ; SET_IO ;Настройка на портовете In, Out, Analog, Pull-up MOVLB .2 ;Bank2 CLRF LATA ;Page121 CLRF LATB CLRF LATC MOVLB .3 ;Bank3 1= Analog Input 0= Digital I/O MOVLW B'00000000' ;X X X ANSA4 X ANSA2 ANSA1 ANSA0 MOVWF ANSELA ;X X RA5 RA4 RA3 RA2 RA1 RA0 MOVLW B'00000000' ;ANSB7 ANSB6 ANSB5 ANSB4 X X X X MOVWF ANSELB ;RB7 RB6 RB5 RB4 X X X X MOVLW B'00000000' ;ANSC7 ANSC6 X X ANSC3 ANSC2 ANSC1 ANSC0 MOVWF ANSELC ;RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 MOVLB .4 ;Bank4 1=Pull-up Enable 0=Pull-up Disabled MOVLW B'00000000' ; MOVWF WPUA ; MOVLW B'00000000' ; MOVWF WPUB ; MOVLW B'00000000' ; MOVWF WPUC ; MOVLB .7 ;Bank7 1= ST Input 0= TTL Input MOVLW B'00000000' ; MOVWF INLVLA ;X X RA5 RA4 RA3 RA2 RA1 RA0 MOVLW B'00000000' MOVWF INLVLB ;RB7 RB6 RB5 RB4 X X X X MOVLW B'00000000' MOVWF INLVLC ;RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 MOVLB .1 ;Bank1 BSF OPTION_REG,NOT_WPUEN ;1=Pull-up Global Disabled 0=Pull-up Global Enable MOVLW B'00111111' ;1=Input 0=Output MOVWF TRISA ;PortA<5:0> MOVLW B'11110000' ; MOVWF TRISB ;PortB<7:4> MOVLW B'11111111' ; MOVWF TRISC ;PortC<7:0> MOVLB .0 ;Bank0 RETURN ;********************************************************************** ;*******Първоначална настройка на микроконтролера********************** START MOVLB .0 ;Bank0 BCF WPAGE ;0- Work. Page0 1- Work. Page1 CALL SET_INT_DISABLE ;Забранява всички прекъсвания. CLRF PORTA CLRF PORTB CLRF PORTC CALL SET_OSC ;Oscillator configuration !!! ;CALL SET_TMR0 ;Настройка на Timer0 ;CALL SET_TMR1 ;Настройка на Timer1 ;CALL SET_WDT ; CALL SET_IO ;Настройка на портовете In, Out, Analog, Pull-up !!! ;CALL SET_INT_PORTCHANGE ;CALL SET_INT_EXTINT ;CALL SET_INT_TMR1 ;BSF INTCON,GIE ;1=Enables All Interrupts 0=Disables All Interrupts ;CALL SET_ADC ; ;CALL SET_COMPM ;Настройка на компаратoрите. ;CALL SET_FVR ; ;CALL SET_PWM1 ;Enable PWM - RC5,RC4,RC3,RC2 ;CALL SET_PWM3 ;Enable PWM - RA2 ;CALL SET_PWM4 ;Enable PWM - RC6 ;CALL SET_UART ;Set RX/TX Baud Rates Asynchronous Modes GOTO BEGIN ;--^ ;********************************************************************** END