//****************************************************************************************** // PIC12F1822 Sample Program // Project : // Program Name : // Programer : // Create date : // History : // Laungage : HI_TECH PICC C Laungage Version 9.83 //****************************************************************************************** // Description //****************************************************************************************** #include __CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF ); __CONFIG( WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_HI & LVP_OFF ) ; // volatile unsigned char G_counter=0; volatile unsigned char G_flag =0; void Init_Timer1(void); void main() { // ***************************** // 1.Initialized // ***************************** // (1)Define OSC (16MHz, IntOSC) OSCCON = 0b01111010; // 16MHz, IntOSC // (2)Define ANSELA (ALL Digital Port) ANSELA = 0x00; // (3)Define I/O port PORTA = 0b00000000; TRISA = 0b00111000; // (4)Initialized Timer1 Init_Timer1(); // ***************************** // 2.Program main // ***************************** // It does not do anything in this process while(1); } //****************************************************************************************** // Function Name : Init_Timer1 // Title : Initialized Timer1 // Input : // Output : //****************************************************************************************** void Init_Timer1(void) { // ******************************************************* // 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 // ******************************************************* T1CON = 0b00110001; // ******************************************************* // 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) // ******************************************************* T1GCON = 0b00000000; // ******************************************************* // 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 TMR1H = 0x3C; TMR1L = 0xAF; // ******************************************************* // 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 INTCON = 0b11000000; // (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 PIE1 = 0b00000001; // (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 PIR1 = 0b11111110; } //****************************************************************************************** // Function Name : Intrpt_tim1 // Title : interrupt function // Input : // Output : //****************************************************************************************** void interrupt Intrpt_tim1(void) { // **************************************************** // 1.Initialize // **************************************************** PIE1 = 0b00000000; PIR1 = 0b11111110; // **************************************************** // 2.Check counter // **************************************************** if( G_counter < 10 ){ G_counter++; Init_Timer1(); return; } // **************************************************** // 3.Main process // (This process operates every time the count reaches 10) // **************************************************** if(G_flag == 0){ G_flag = 1; PORTA = 0b00000111; }else{ G_flag = 0; PORTA = 0b00000000; } G_counter=0; Init_Timer1(); }