;****************************************************************************************** ; PIC12F1822 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : ; History : ; Laungage : MPLAB MPASM ;****************************************************************************************** ; Description ;****************************************************************************************** LIST P=PIC12F1822,ST=OFF,R=DEC INCLUDE "P12F1822.inc" __CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2 , _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF ; ; Define GENERAL PURPOSE RAM AREA (80 bytes maximum) ; G_TMP EQU 20H ; ; Define Common RAM AREA (16 bytes) ; C_TMP1 EQU 70H INTWRG EQU 71H INTSTS EQU 72H C_CNTER EQU 73H C_FLAG EQU 74H ; ; Define Macro ; SELBANK MACRO #BANK_NO MOVLW #BANK_NO MOVWF BSR ENDM ; ; Program Start ; ORG 0h GOTO START ; ***************************** ; 0.Interrupts ; ***************************** ORG 4h MOVWF INTWRG ; Save W-REG SWAPF STATUS,W ; Save STATUS Register MOVWF INTSTS ; ; CALL INTRPT_TIM1 ; SWAPF INTSTS,W ; Restore STATUS Register MOVWF STATUS ; MOVFW INTWRG ; Restore W-REG RETFIE START ; ***************************** ; 1.Initialized ; ***************************** ; (1)Define OSC (16MHz, IntOSC) SELBANK 1 ; SET BANK1 MOVLW B'11111010' MOVWF OSCCON ; (2)Define I/O port SELBANK 1 ; SET BANK1 MOVLW B'11111000' MOVWF TRISA SELBANK 0 CLRF PORTA ; (3)Define ANSELA Register SELBANK 3 CLRF ANSELA ; All Degital Port ; (4)Define interrupt CLRF C_CNTER CLRF C_FLAG CALL INIT_TIMER1 SELBANK 0 ; ***************************** ; 2.Program main ; ***************************** ; (1)Main loop MAIN ; It does not do anything in this process GOTO MAIN ;****************************************************************************************** ; Function Name : Init_Timer1 ; Title : ; Input : ; Output : ;****************************************************************************************** INIT_TIMER1 ; ******************************************************* ; 1.Define T1CON(TIMER1 CONTROL REGISTER) Register ; T1CON(7-6) TMR1CS1,TMR1CS0: Timer1 Clock Source Select bits ; 11 =Timer1 clock source is Capacitive Sensing Oscillator (CAPOSC) ; 10 =Timer1 clock source is pin or oscillator: ; If T1OSCEN = 0: ; External clock from T1CKI pin (on the rising edge) ; If T1OSCEN = 1: ; Crystal oscillator on T1OSI/T1OSO pins ; 01 =Timer1 clock source is system clock (FOSC) ; 00 =Timer1 clock source is instruction clock (FOSC/4) ; T1CON(5-4) T1CKPS1,T1CKPS0: Timer1 Input Clock Prescale Select bits ; 11 = 1:8 Prescale value ; 10 = 1:4 Prescale value ; 01 = 1:2 Prescale value ; 00 = 1:1 Prescale value ; T1CON(3) T1OSCEN: LP Oscillator Enable Control bit ; 1 = Dedicated Timer1 oscillator circuit enabled ; 0 = Dedicated Timer1 oscillator circuit disabled ; T1CON(2) T1SYNC: Timer1 External Clock Input Synchronization Control bit ; TMR1CS1,TMR1CS0 = 1X ; 1 = Do not synchronize external clock input ; 0 = Synchronize external clock input with system clock (FOSC) ; TMR1CS1,TMR1CS0 = 0X ; This bit is ignored. Timer1 uses the internal clock when TMR1CS<1:0> = 1X. ; T1CON(1) Unimplemented: Read as e0f ; T1CON(0) TMR1ON: Timer1 On bit ; 1 = Enables Timer1 ; 0 = Stops Timer1 ; Clears Timer1 Gate flip-flop ; ******************************************************* SELBANK 0 ; SET BANK0 MOVLW B'00110001' MOVWF T1CON ; ******************************************************* ; 2.Define T1GCON (TIMER1 GATE CONTROL REGISTER) Register ; T1GCON(7) TMR1GE: Timer1 Gate Enable bit ; If TMR1ON = 0: ; This bit is ignored ; If TMR1ON = 1: ; 1 = Timer1 counting is controlled by the Timer1 gate function ; 0 = Timer1 counts regardless of Timer1 gate function ; T1GCON(6) T1GPOL: Timer1 Gate Polarity bit ; 1 = Timer1 gate is active-high (Timer1 counts when gate is high) ; 0 = Timer1 gate is active-low (Timer1 counts when gate is low) ; T1GCON(5) 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 ; Timer1 gate flip-flop toggles on every rising edge. ; T1GCON(4) T1GSPM: Timer1 Gate Single-Pulse Mode bit ; 1 = Timer1 gate Single-Pulse mode is enabled and is controlling Timer1 gate ; 0 = Timer1 gate Single-Pulse mode is disabled ; T1GCON(3) T1GGO/DONE: Timer1 Gate Single-Pulse Acquisition Status bit ; 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 ; This bit is automatically cleared when T1GSPM is cleared. ; T1GCON(2) T1GVAL: Timer1 Gate Current State bit ; Indicates the current state of the Timer1 gate that could be provided to TMR1H:TMR1L. ; Unaffected by Timer1 Gate Enable (TMR1GE). ; T1GCON(1-0) T1GSS1,T1GSS0: Timer1 Gate Source Select bits ; 00 = Timer1 Gate pin ; 01 = Timer0 overflow output ; 10 = Comparator 1 optionally synchronized output (SYNCC1OUT) ; 11 = Comparator 2 optionally synchronized output (SYNCC2OUT) ; ******************************************************* MOVLW B'00000000' MOVWF T1GCON ; ******************************************************* ; 3.Define TMR1 Register ; ******************************************************* ; TMR1 data ( OSC:16MHz, FOSC/4, 1:8 Prescale value, 0.01[S];100Hz ) ; 10mS(100Hz): 16MHz / 4(FOSC/4) / 8(Prescale) / 100(100Hz)==> 0d5,000(Count) ==> 0x1388(Count) ; TMR1 = 0xFFFF - 0x1388 ==> 0xEC77 ; TMR1 data ( OSC:16MHz, FOSC/4, 1:8 Prescale value, 0.1[S];10Hz ) ; 100mS(10Hz): 16MHz / 4(FOSC/4) / 8(Prescale) / 10(10Hz) ==> 0d50,000(Count) ==> 0xC350(Count) ; TMR1 = 0xFFFF - 0xC350 ==> 0x3CAF MOVLW H'3C' MOVWF TMR1H MOVLW H'AF' MOVWF TMR1L ; ******************************************************* ; 4.Define interrupt ; ******************************************************* ; (1)INTCON: INTERRUPT CONTROL REGISTER ; INTCON[7] GIE: Global Interrupt Enable bit ; 1 = Enables all active interrupts / 0 = Disables all interrupts ; INTCON[6] PEIE: Peripheral Interrupt Enable bit ; 1 = Enables all active peripheral interrupts / 0 = Disables all peripheral interrupts ; INTCON[5] TMR0IE: Timer0 Overflow Interrupt Enable bit ; 1 = Enables the Timer0 interrupt / 0 = Disables the Timer0 interrupt ; INTCON[4] INTE: INT External Interrupt Enable bit ; 1 = Enables the INT external interrupt / 0 = Disables the INT external interrupt ; INTCON[3] IOCIE: Interrupt-on-Change Enable bit ; 1 = Enables the interrupt-on-change / 0 = Disables the interrupt-on-change ; INTCON[2] TMR0IF: Timer0 Overflow Interrupt Flag bit ; 1 = TMR0 register has overflowed / 0 = TMR0 register did not overflow ; INTCON[1] INTF: INT External Interrupt Flag bit ; 1 = The INT external interrupt occurred / 0 = The INT external interrupt did not occur ; INTCON[0] IOCIF: Interrupt-on-Change Interrupt Flag bit ; 1 = When at least one of the interrupt-on-change pins changed state / 0 = None of the interrupt-on-change pins have changed state SELBANK 0 ; SET BANK0 MOVLW B'11000000' MOVWF INTCON ; (2)PIE1: PERIPHERAL INTERRUPT ENABLE REGISTER 1 ; PIE1[7] TMR1GIE: Timer1 Gate Interrupt Enable bit ; 1 = Enables the Timer1 Gate Acquisition interrupt / 0 = Disables the Timer1 Gate Acquisition interrupt ; PIE1[6] ADIE: A/D Converter (ADC) Interrupt Enable bit ; 1 = Enables the ADC interrupt / 0 = Disables the ADC interrupt ; PIE1[5] RCIE: USART Receive Interrupt Enable bit ; 1 = Enables the USART receive interrupt / 0 = Disables the USART receive interrupt ; PIE1[4] TXIE: USART Transmit Interrupt Enable bit ; 1 = Enables the USART transmit interrupt / 0 = Disables the USART transmit interrupt ; PIE1[3] SSP1IE: Synchronous Serial Port (MSSP) Interrupt Enable bit ; 1 = Enables the MSSP interrupt / 0 = Disables the MSSP interrupt ; PIE1[2] CCP1IE: CCP1 Interrupt Enable bit ; 1 = Enables the CCP1 interrupt / 0 = Disables the CCP1 interrupt ; PIE1[1] TMR2IE: TMR2 to PR2 Match Interrupt Enable bit ; 1 = Enables the Timer2 to PR2 match interrupt / 0 = Disables the Timer2 to PR2 match interrupt ; PIE1[0] TMR1IE: Timer1 Overflow Interrupt Enable bit ; 1 = Enables the Timer1 overflow interrupt / 0 = Disables the Timer1 overflow interrupt SELBANK 1 ; SET BANK0 MOVLW B'00000001' MOVWF PIE1 ; (3)PIR1: PERIPHERAL INTERRUPT REQUEST REGISTER 1 ; PIR1[7] TMR1GIF: Timer1 Gate Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[6] ADIF: A/D Converter Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[5] RCIF: USART Receive Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[4] TXIF: USART Transmit Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[3] SSP1IF: Synchronous Serial Port (MSSP) Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[2] CCP1IF: CCP1 Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[1] TMR2IF: Timer2 to PR2 Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending ; PIR1[0] TMR1IF: Timer1 Overflow Interrupt Flag bit ; 1 = Interrupt is pending / 0 = Interrupt is not pending SELBANK 0 ; SET BANK0 MOVLW B'11111110' MOVWF PIR1 RETURN ;****************************************************************************************** ; Function Name : Intrpt_tim1 ; Title : interrupt function ; Input : ; Output : ;****************************************************************************************** INTRPT_TIM1 ; **************************************************** ; 1.Initialize ; **************************************************** SELBANK 1 ; SET BANK0 MOVLW B'00000000' MOVWF PIE1 SELBANK 0 ; SET BANK0 MOVLW B'11111110' MOVWF PIR1 ; **************************************************** ; 2.Check counter ; **************************************************** MOVLW H'01' ADDWF C_CNTER,F MOVF C_CNTER,W XORLW H'0A' ; 0x0A(0d10) BTFSC STATUS,Z GOTO INTRPT_TIM1_2 CALL INIT_TIMER1 RETURN ; **************************************************** ; 3.Main process ; (This process operates every time the count reaches 10) ; **************************************************** INTRPT_TIM1_2 MOVF C_FLAG,W XORLW H'00' BTFSS STATUS,Z GOTO INTRPT_TIM1_2A GOTO INTRPT_TIM1_2B INTRPT_TIM1_2A CLRF C_CNTER CLRF C_FLAG MOVLW B'00000111' MOVWF PORTA CALL INIT_TIMER1 RETURN INTRPT_TIM1_2B CLRF C_CNTER MOVLW B'00000001' MOVWF C_FLAG MOVLW B'00000000' MOVWF PORTA CALL INIT_TIMER1 RETURN END