;LZ4GV 2017-2019 Firmware EQU .2 list p=16f18313 ; list directive to define processor #include ; processor specific variable definitions ;Set Configuration Register __CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_OFF ; _FEXTOSC_LP _RSTOSC_EXT4X _CLKOUTEN_ON _CSWEN_OFF _FCMEN_ON ; _FEXTOSC_XT _RSTOSC_SOSC ; _FEXTOSC_HS _RSTOSC_LFINT ; _FEXTOSC_ECL _RSTOSC_HFINT32 (x2) ; _FEXTOSC_ECM _RSTOSC_EXT1X ; _FEXTOSC_ECH ; __CONFIG _CONFIG2, _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_HIGH & _PPS1WAY_OFF & _STVREN_OFF & _DEBUG_OFF ; _MCLRE_ON _PWRTE_OFF _WDTE_SWDTEN _LPBOREN_ON _BOREN_OFF _BORV_LOW _PPS1WAY_ON _STVREN_ON _DEBUG_ON ; _WDTE_SLEEP _BOREN_SBOREN _BORV_HIGH = 2.70V _BORV_LOW = 2.45V ; _WDTE_ON _BOREN_SLEEP __CONFIG _CONFIG3, _WRT_OFF & _LVP_OFF ; _WRT_ALL _LVP_ON ; _WRT_HALF ; _WRT_BOOT __CONFIG _CONFIG4, _CP_OFF & _CPD_OFF ; _CP_ON _CPD_ON OSCTUNE_MNL EQU .0 ;Central frequency min .32 - .63 0 .1 - .31 max #define PORTA0 PORTA,0 ;Pin 7 #define PORTA1 PORTA,1 ;Pin 6 #define PORTA2 PORTA,2 ;Pin 5 #define PORTA3 PORTA,3 ;Pin 4 In Only #define PORTA4 PORTA,4 ;Pin 3 #define PORTA5 PORTA,5 ;Pin 2 #define PORTA5IO TRISA,5 ;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 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 PIR0,IOCIF ;PORTA Change Interrupt Global Flag GOTO INT_PORTCHANGE ;--> btfsc PIR1,TMR1IF ;Overflow TMR1 GOTO INT_TMR1 ;--> btfsc PIR0,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 MOVLB .0 ;Bank0 bcf PIR0,IOCIF ;PORTA Change Interrupt Global Flag GOTO INT_END ;--> INT_TMR1 bcf PIR1,TMR1IF ;TMR1 Overflow Interrupt Flag GOTO INT_END ;--> INT_EXTINT bcf PIR0,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 TMR0L ; BCF PIR0,TMR0IF ;Overflow TMR0 MOVLW 0xDB ; MOVWF TMR1L ; MOVLW 0x0B ; MOVWF TMR1H ; BCF PIR1,TMR1IF ;Overflow TMR1 MOVLB .5 ;Bank5 movlw 0x80 ;Pulse Width Modulation 1 movwf CCPR1H ;Bit 9 - 2 BCF CCPR1L,7 ;Bit 1 BCF CCPR1L,6 ;Bit 0 MOVLB .0 ; MOVLB .12 ;Bank12 MOVLW 0x80 ;Pulse Width Modulation 5 MOVWF PWM5DCH ;Bit 9 - 2 BCF PWM5DCL,7 ;Bit 1 BCF PWM5DCL,6 ;Bit 0 MOVLB .0 ;Bank0 ; 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 ; MOVF T0CON0,W ;Запомня състоянието на T0CON0 MOVWF OPTIONMEM ;Променя TMR0 ANDLW B'11110000' ;Нулира само 3-0 IORLW B'00000001' ;Променя Fosc/4/4 = 4uS MOVWF T0CON0 MOVF OPTIONMEM,W ; MOVWF T0CON0 ;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) MOVLB .2 ;Bank2 BTFSS CM1CON0,C1OUT ; 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 ; #define SS1_Pin PORTA,0 ;Pin_8 movlw 0x00 ;MSB iorlw b'10000000' ;Next byte Write bit=1 bcf SS1_Pin ;PORT Pin Enable Chip Select Output (low) CALL MASTER_SPI1 movlw 0x00 ;LSB Write CALL MASTER_SPI1 bsf SS1_Pin ;Disable Chip Select Output (high) movlw 0x00 ;7bit andlw b'01111111' ;Next byte Read bit7=0 bcf SS1_Pin ;PORT Pin Enable Chip Select Output (low) CALL MASTER_SPI1 CALL MASTER_SPI1 ;8bit Read Out:W bsf SS1_Pin ;Disable Chip Select Output (high) ;movwf ;********************************************************************** MASTER_SPI1 ;In: W Out:W movlb .4 movwf SSP1BUF ;Synchronous Serial Port Receive Buffer/Transmit Register MASTER_SPI1a btfss SSP1STAT,BF ;1= Receive complete, SSP1BUF is full 0= Receive not complete, SSP1BUF is empty Read Only goto MASTER_SPI1a movf SSP1BUF,W ;Get Data from SSPBUF 0 -> SSP1STAT,BF ;btfsc SSP1CON1,WCOL ;Write Collision Detect bit Clear by Software ;btfsc SSP1CON1,SSPOV ;Receive Overflow Indicator bit Clear by Software movlb .0 RETURN ;********************************************************************** MOVLW '$' CALL UAT ;********************************************************************** 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 ;********************************************************************** ;------------------------------------------------------------------------------ ;********** Край ************* ;********************************************************************** WRITE ;In:F(REEADR,REEDATA) MOVLB .17 ;Bank3 MOVF REEADR,W ; MOVWF NVMADRL movlw 0xF0 movwf NVMADRH MOVF REEDATA,W MOVWF NVMDAT BSF NVMCON1,NVMREGS ;1 = Access EEPROM 0 = Access Program Flash Memory BCF INTCONMEM,GIE ; BTFSC INTCON,GIE ;Запазва състоянието. BSF INTCONMEM,GIE ; BCF INTCON,GIE ;Disable INTs. BTFSC INTCON,GIE ;See AN576 GOTO $-2 ; BSF NVMCON1,WREN ;1= Allows write cycles 0= MOVLW 0x55 ; MOVWF NVMCON2 ; MOVLW 0xAA ; MOVWF NVMCON2 ; BSF NVMCON1,WR ; BTFSC NVMCON1,WR ;1= Write Cycles 0= Write cycles to the EEPROM is complete GOTO $-1 ;-^ ;BTFSC NVMCON1,WRERR ;1= Write Terminated 0= Write Operation Completed ;NOP BCF NVMCON1,WREN ;disable write BTFSC INTCONMEM,GIE ; BSF INTCON,GIE ; MOVLB .0 ;Bank0 RETURN ; READE ;In:F(REEADR) Out:F(REEDAT),W MOVLB .17 ;Bank3 MOVF REEADR,W MOVWF NVMADRL movlw 0xF0 movwf NVMADRH BSF NVMCON1,NVMREGS ;1 = Access EEPROM 0 = Access Program Flash Memory BSF NVMCON1,RD ;1 - initiates an EEPOM read BTFSC NVMCON1,RD ;rd done? GOTO $-1 ;no then loop MOVF NVMDATL,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_AN4 EQU B'00010000' RA5_AN5 EQU B'00010100' ; EQU B'11111000' ;DAC Output ; EQU B'11111100' ;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 ;Page212 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 16MHz 8MHz 4MHz 1MHz Select A/D Conversion Clock. ;RCOSC Fosc/64 Fosc/32 Fosc/16 Fosc/8 Fosc/4 Fosc/2 BSF ADCON1,ADCS2 ;x 1 0 1 0 1 0 BCF ADCON1,ADCS1 ;1 1 1 0 0 0 0 BCF ADCON1,ADCS0 ;1 0 0 1 1 0 0 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 ;Page X 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,C1OUT ;1= 0= C1OUT Is Internal Only * BSF CM1CON0,C1ON ;1= Comarator1 Enabled 0= MOVLB .0 ;Bank0 RETURN ; SET_FVR ;Fixed Voltage Reference MOVLB .2 ;Page156 BSF FVRCON,FVREN ;1= FVR Enable ;For Comparator and DAC BSF 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 Page293 ;movlw 0x01 ;.416 01A0h 19200 bps UART Fosc=32MHz movlw 0x00 ;.103 0067h 19200 bps UART Fosc=8MHz movwf SPBRGH ;.51 0033h 19200 bps UART Fosc=4MHz ;movlw 0xA0 ;movlw 0x67 movlw 0x33 MOVWF SPBRGL MOVLB .1 ;Bank1 ;BCF TRISC,4 ;TX (RC4) Serial Output ;BSF TRISC,5 ;RX (RC5) Serial Input ;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 ; SET_SPI1 ;Настройка на SPI1 модула ;BCF PIR1,SSP1IF ;BSF PIE1,SSP1IE ;Bank1 ;BSF INTCON,PEIE ;BSF INTCON,GIE movlb .1 ;BCF TRISB,6 ;SCK1 0=Master/1=Slave ;BSF TRISB,4 ;SDI1 ;BCF TRISC,7 ;SDO1 ;BCF TRISC,6 ;SS1 0=Master/1=Slave movlb .4 ;Bank4 BCF SSP1CON3,BOEN ;Buffer Overwrite Enable bit ;1= SSP1BUF може да се променя по всяко време 0= If new byte is received with BF = 1 => SSPOV = 1, and the SSP1BUF is not updated BCF SSP1STAT,SMP ;1= Input data sampled at end of data output time 0= Input data sampled at middle of data output time BSF SSP1STAT,CKE ;1= Transmit occurs on transition from active to Idle clock state 0= Transmit occurs on transition from Idle to active clock state BCF SSP1CON1,CKP ;1= Idle state for SCK is a high level 0= Idle state for SCK is a low level BCF SSP1CON1,SSPM3 ;0000= SPI Master mode, clock = Fosc/4 BCF SSP1CON1,SSPM2 ;0001= SPI Master mode, clock = Fosc/16 BSF SSP1CON1,SSPM1 ;0010= SPI Master mode, clock = Fosc/64 32MHz => SCK = 500KHz BCF SSP1CON1,SSPM0 ;0011= SPI Master mode, clock = TMR2 output/2 ;1010= SPI Master mode, clock = FOSC/(4 * (SSPxADD+1)) ;0100= SPI Slave mode, clock = SCKx pin, SSx pin control enabled ;0101= SPI Slave mode, clock = SCKx pin, SSx pin control disabled, SSx can be used as I/O pin BSF SSP1CON1,SSPEN ;1= Enables serial port and configures SCKx, SDOx, SDIx and SSx as the source of the serial port pins 0 = Disables, I/O port movlb .0 RETURN ; ;SET_SPI2 ;Настройка на SPI1 модула ;BCF TRISB,7 ;SCK2 0=Master/1=Slave ;BCF TRISB,5 ;SDI2 ;BCF TRISC,1 ;SDO2 ;BCF TRISC,0 ;SS2 0=Master/1=Slave ;RETURN ; SET_PWM5 ;Pulse Width Modulation Page169 movlb .29 ;Page144 movlw b'00000010' ;PWM5 -> RA2 pin5 movwf RA2PPS movlb .0 MOVLW 0xFF ; MOVWF PR2 ;Period register. Bank0 MOVLB .12 ;Bank12 BCF PWM5CON,PWM5POL ;1 = PWM output is active-low 0 = PWM output is active-high BSF PWM5CON,PWM5EN ;1 = PWM module is enabled 0 = PWM module is disabled ;BTFSS PWM5CON,PWM5OUT ;Read module output level clrf PWM5DCH ;Bit 9 - 2 bcf PWM5DCL,7 ;Bit 1 bcf PWM5DCL,6 ;Bit 0 MOVLB .0 ;Bank0 CLRW ;Page271 IORLW b'00000000' ;<6:3> 1:1 ;IORLW b'00001000' ; 1:2 IORLW b'00000000' ;<1:0> /1 ;IORLW b'00000001' ;<1:0> /4 ;IORLW b'00000010' ;<1:0> /16 ;IORLW b'00000011' ;<1:0> /64 MOVWF T2CON BSF T2CON,TMR2ON ;1= Timer2 is On CLRF TMR2 ; BCF PIR1,TMR2IF ; BTFSS PIR1,TMR2IF ;New PWM cycle? GOTO $-1 ; movlb .1 ; bcf TRISA,TRISA2 ;Output! movlb .0 ; RETURN ; SET_PWM6 ;Pulse Width Modulation Page169 ; SET_TMR0 ;Page 251 MOVF T0CON1,W ; ANDLW B'00011111' ;<7-5> ;000 = T0CKIPPS (True) ;001 = T0CKIPPS (Inverted) IORLW B'01000000' ;FOSC/4 ;011 = HFINTOSC ;100 = LFINTOSC ;110 = SOSC ;111 = CLC1 MOVWF T0CON1 ; BCF T0CON1,T0ASYNC ;1 = not synchronized to system clocks 0 = synchronized to FOSC/4 MOVF T0CON1,W ; ANDLW B'11110000' ;Нулира само 3-0 ;IORLW B'00000000' ;1:1 ;IORLW B'00000001' ;1:2 4MHz => 2uS ;IORLW B'00000010' ;1:4 ;IORLW B'00000011' ;1:8 ;IORLW B'00000100' ;1:16 ;IORLW B'00000101' ;1:32 ;IORLW B'00000110' ;1:64 ;IORLW B'00000111' ;1:128 IORLW B'00001000' ;1:256 4MHz => 256uS MOVWF T0CON1 ; T0CON0 ;3-0 TMR0 output postscaler (divider) select bits BCF T0CON0,T016BIT ;1 = TMR0 is a 16-bit timer 0 = TMR0 is an 8-bit timer BSF T0CON0,T0EN RETURN ; SET_TMR1 ;Timer1 Module: Max period 8uS * 65536 = 524,288mS (Fosc=4MHz) Page258 BCF T1CON,TMR1CS1 ;1=ClockSource LFINTOSC 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,T1SOSC ;LP Oscillator Enable 1 = SOSC requested as the clock source 0 = T1CKI enabled as the clock source BTFSC T1CON,TMR1CS1 BSF T1CON,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 ;BCF T1GCON,T1GPOL ;1 = Timer1 gate is active-high(Timer1 counts when gate is high) 0 = Timer1 gate is active-low (Timer1 counts when gate is low) ;BCF T1GCON,T1GTM ;Timer1 Gate Toggle Mode bit 1 = Timer1 Gate Toggle mode is enabled 0 = Timer1 Gate Toggle mode is disabled and toggle flip-flop is cleared ;BCF T1GCON,T1GSPM ;Timer1 Gate Single-Pulse Mode bit1 = Timer1 Gate Single-Pulse mode is enabled and is controlling Timer1 gate 0 = Timer1 Gate Single-Pulse mode is disabled ;BCF T1GCON,T1GGO_NOT_DONE ;1 = Timer1 gate single-pulse acquisition is ready, waiting for an edge 0 = Timer1 gate single-pulse acquisition has completed or has not been started ;btfss T1GCON,T1GVAL ;Timer1 Gate Value Status bit Indicates the current state of the Timer1 gate, latched at Q1, provided to TMRxH:TMRxL ;BCF T1GCON,T1GSS1 ;1 **Timer1 Gate Source Select bits** 1 0 0 ;BCF T1GCON,T1GSS0 ;1- Comparator 2 optionally synchronized output 0- Comparator 1 optionally synchronized output 1- Timer0 overflow output 0- Timer1 gate pin 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_PORTCHANGE ;Page86 ??? 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 CLRF IOCAF ;PORTA Flag Register Bank7 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 BSF INTCON,INTEDG ;1=Rising RA2/INT Interrupt 0=Falling RA2/INT Interrupt MOVLB .1 ;Bank1 BSF PIE0,INTE ;1=RA2/INT Change Interrupt Enables 0=RA2/INT Change Interrupt Disable MOVLB .0 ;Bank0 BCF PIR0,INTF ;RA2/INT Change Interrupt Flag 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. Page68 MOVLB .18 ; OSCCON2 ;6-4 Current Oscillator Source Select bits (read-only) ;3-0 Current Divider Select bits (read-only) movlw b'00000011' ; 4MHz ;movlw b'00000100' ; 8MHz ;movlw b'00000101' ;12MHz ;movlw b'00000110' ;16MHz ;movlw b'00000111' ;32MHz movwf OSCFRQ ;HFINTOSC FREQUENCY SELECTION REGISTER MOVLW OSCTUNE_MNL ;Central frequency MOVWF OSCTUNE ; clrw ;6-4 New Oscillator Source Request ;111 EXTOSC(1) iorlw b'01100000' ;110 HFINTOSC (1 MHz) ;101 Reserved ;100 LFINTOSC ;011 SOSC ;010 Reserved ;001 EXTOSC with 4xPLL(1) ;iorlw b'00000000' ;000 HFINTOSC with 2x PLL (32 MHz) ;3-0 New Divider Selection Request iorlw b'00000000' ;1:1 ;iorlw b'00000001' ;1:2 movwf OSCCON1 ;Само ако "_CSWEN_ON" !!! ;BCF OSCCON3,CWSHOLD ;BCF OSCCON3,SOSCPWR ;BCF OSCCON3,SOSCBE ; OSCCON3,NOSCR ;Read btfss OSCCON3,ORDY ;1= Oscillator Ready 0= A clock switch is in progress goto $-1 ; OSCSTAT1,EXTOR ;All Read ; OSCSTAT1,HFOR ; OSCSTAT1,LFOR ; OSCSTAT1,SOR ; OSCSTAT1,ADOR ; OSCSTAT1,PLLR ; OSCEN,EXTOEN ;All Read ; OSCEN,HFOEN ; OSCEN,LFOEN ; OSCEN,SOSCEN ; OSCEN,ADOEN MOVLB .0 ;Bank0 RETURN ; ; SET_IO ;Настройка на портовете In, Out, Analog, Pull-up Page129 ;MOVLB .2 ;DATA LATCH Register ;MOVLW B'00000000' ; ;MOVWF LATA ; MOVLB .3 ;1= Analog Input 0= Digital I/O MOVLW B'00000000' ;X X ANSA5 ANSA4 X ANSA2 ANSA1 ANSA0 MOVWF ANSELA ;X X RA5 RA4 RA3 RA2 RA1 RA0 ;MOVLB .4 ;1=Pull-up Enable 0=Pull-up Disabled ;MOVLW B'00000000' ; ;MOVWF WPUA ; ;MOVLB .5 ;OPEN-DRAIN Control Register ;MOVLW B'00000000' ;1 = Port pin operates as open-drain drive ;MOVWF ODCONA ; ;MOVLB .6 ;SLEW RATE CONTROL REGISTER ;MOVLW B'00000000' ;1 = Port pin slew rate is limited 0 = Port pin slews at maximum rate ;MOVWF SLRCONA ; ;MOVLB .7 ;INPUT LEVEL CONTROL REGISTER ;MOVLW B'00000000' ;1= ST Input 0= TTL Input ;MOVWF INLVLA ;X X RA5 RA4 RA3 RA2 RA1 RA0 MOVLB .1 ;Bank1 MOVLW B'00111111' ;1=Input 0=Output MOVWF TRISA ;PortA<5:0> MOVLB .0 ;Bank0 RETURN ;********************************************************************** ;*******Първоначална настройка на микроконтролера********************** START MOVLB .0 ;Bank0 CLRF INTCON ;Забранява всички прекъсвания. Page86 CLRF PORTA ; CALL SET_OSC ;Oscillator configuration !!! CALL SET_IO ;Настройка на портовете In/Out, Analog, Pull-up... !!! ;CALL SET_TMR0 ;Настройка на Timer0 ;CALL SET_TMR1 ;Настройка на Timer1 ;CALL SET_WDT ;;; ;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_PWM5 ;Enable PWM5 ;CALL SET_PWM6 ;Enable PWM6 ;;;; ;CALL SET_UART ;;;Set RX/TX Baud Rates Asynchronous Modes ;CALL SET_SPI1 ;;; ;CALL SET_SPI2 ;;;не готова GOTO BEGIN ;--^ ;********************************************************************** ;Only 2KB to 0x7FF END ;********************************************************************** ;********************************************************************** ;CALL SET_PWM1 ;Enable PWM1 = CCP1 Дублира се, има специално изградени два PWM5 и PWM6 ;********************************************************************** SET_PWM1 ;Page278 movlb .29 ;Page144 movlw b'00001100' ;CCP1 -> RA2 pin5 movwf RA2PPS movlb .0 MOVLW 0xFF ; MOVWF PR2 ;Period register. Bank0 MOVLB .5 ; MOVLW B'00001111' ;<3:0>PWM mode MOVWF CCP1CON ; BSF CCP1CON,CCP1FMT ;1 = Left-aligned format XXXX XXXX XX00 000 BSF CCP1CON,CCP1EN ;1 = CCP is enabled 0 = CCP is disabled ;BTFSS CCP1CON,CCP1OUT ; clrf CCPR1H ;Bit 9 - 2 bcf CCPR1L,7 ;Bit 1 bcf CCPR1L,6 ;Bit 0 MOVLB .0 ;Bank0 CLRW ;Page271 IORLW b'00000000' ;<6:3> 1:1 ;IORLW b'00001000' ; 1:2 IORLW b'00000000' ;<1:0> /1 ;IORLW b'00000001' ;<1:0> /4 ;IORLW b'00000010' ;<1:0> /16 ;IORLW b'00000011' ;<1:0> /64 MOVWF T2CON BSF T2CON,TMR2ON ;1= Timer2 is On CLRF TMR2 ; BCF PIR1,TMR2IF ; BTFSS PIR1,TMR2IF ;New PWM cycle? GOTO $-1 movlb .1 ; bcf TRISA,TRISA2 ;Output! movlb .0 ; RETURN ;**********************************************************************