星期五, 9月 09, 2005

PIC的中斷結構

picint_struct
從上圖可以看出pic的中斷還是一個擴充的結構,可以看的出來是由原來的一個基本的中斷控制器擴充周邊中斷(PEIE)來達成的。
所以啟動擴充裝置的中斷,除了要啟動GIE (Gblobal),和該周邊的中斷Enable外,還要Enable PEIE.

PIC有自動防止INT重複進入的問題:
進入中段時,GEIE會自動清除。
執行RETFIE退出中斷時,GEIE會自動enable.

PIC只有一個中斷位址:0x0004.
所以在Interrupt Service Routine中要一一polling各interrupt的flag,並且清除他。


所以一個使用Timer2作time tick的code是:

#include <pic.h>

unsigned char tick;
unsigned char sec;

void interrupt timer2(void)
{
if(TMR2IF){
TMR2IF=0;
tick++;
if(tick>=125){
tick=0;
sec++;
}
}
}

void main(void)
{
T2CON = 0x4A; // post 10, pre 16
PR2 = 250; // 16 x 250 = 40000
// 20M inst = 20/4 = 5M
// count 125 = 1sec

tick=0;
sec=0;
TMR2IE = 1;
PEIE = 1; // the int hirachy, TMR2 belongs to Periperial
GIE = 1; // Global
TMR2ON=1;

TRISB=0x1F;
while(1) {
if(sec%2){
PORTB = 0x00;
}else{
PORTB = 0xE0;
}
}
}

沒有留言:

張貼留言