Microchip PIC18F4550 Timer3 程式是利用 PIC18F4550 內的計時器 3 及中斷來實現,程式開始是設定計時器 3 (10ms) 及中斷旗號,程式便進入循環。當時鐘上升,計時器 3加一直至溢滿便會觸發中斷,中斷副程式將 TimeCount 加一,當 TimeCount 小於 100 LED 不閃動,但 TimeCount 大於 100 及 小於 200 LED便會閃動,大於 200 便會重置 TimeCount,完成中斷副程式後,返回程式繼續循環。
▲ Timer3 流程圖 |
//***** Vector Remapping ************************************************* #pragma interrupt high_isr #pragma code high_vector = 0x08 void high_interrupt (void) { _asm goto high_isr _endasm } #pragma code //***** END Vector Remapping ******************************************** /************************************************************************* /************************************************************************* * Function: void main(void) * * PreCondition: None * Input: None * Output: None * Side Effects: None * Overview: Main program entry point. * Note: None ************************************************************************/ void main (void) { TRISA = 0x00; // Port A As Output // Set Timer 3 OpenTimer3 ( TIMER_INT_ON & // Interrupt: ON T3_16BIT_RW & // 16 bit mode T3_SOURCE_INT & // Use internal clock T3_PS_1_8 & // Prescaler 1:1/2/4/8 T3_OSC1EN_OFF // No oscillator ); WriteTimer3 (59286); // Preset Timer1 value 59286 RCONbits.IPEN = 0; // Interrupt Priority Control: OFF // (RCON register IPEN bit = 0) PIE2bits.TMR3IE = 1; // Timer3 interrupt enable INTCONbits.PEIE = 1; // peripheral interrupt enable // INTCON register bit b6: low interrupt enable / disable // (When interrupt priority control) INTCONbits.GIE = 1; // all interrupt enable // INTCON register bit b7: high interrupt enable / disable // (When interrupt priority control) while (1) // wait for interrupt doing nothing { } } void high_isr (void) { PIR2bits.TMR3IF = 0; // Timer3 interrupt flag to 0 WriteTimer3 (59286); // 0.05μsec × 4 × 8 × 6250 = 10000μsec = 10msec // (FOSC = HS at the system clock 20MHz) // 256 × 256 - 6250 = 59286 // 16 bit timer overflow interrupt occurs TimeCount ++; // 10msec for each increment if (TimeCount <100) // count of 100 or less (1000msec = 10msec × 100) { LATAbits.LATA0 = 0; //RA0 = 0 LED: OFF Scope=0 } else if (TimeCount <200) // count from 100 to 200 (2000msec = 10msec × 100) { LATAbits.LATA0 = 1; // RA0 = 1 LED: ON Scope=1 } else TimeCount = 0; // Reset count = 0 } |
▲ 10ms 波型圖 |
2011 年 03 月 11 日 天氣報告
氣溫:17.2 度 @ 23:00
相對濕度:百分之80%
天氣:多雲
※日本發生黎克特制 8.9級大地震,地震於日本時間下午2時46分發生,震央位於東岸對開約125公里處,震源深度10公里。
沒有留言:
張貼留言