PDA

View Full Version : timer của PIC18


littlephoc
27-09-2007, 03:13 PM
mình muốn dùng timer1 để tạo ra xung 1ms , chip mình dùng là PIC18F2620, dùng thạch anh 8Hmz
OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT & T1_PS_1_8 &
T1_OSC1EN_OFF); //タイマ1の設定,8ビットモード,割込 使用


//////////////////////

void isr_low_handler(void)
{
if(PIR1bits.TMR1IF){ // タイマ1割り込み?
PIR1bits.TMR1IF=0; // タイマ1割り込みフラグを0にする
if(--cnt1 <=0){
cnt1=10;
LATAbits.LATA4=!LATAbits.LATA4;
}


Nhưng kết quả không ra như ý muốn, thời gian dài hơn và không chính xác.
Mong chỉ giùm mình cách tính với.

namqn
27-09-2007, 10:32 PM
mình muốn dùng timer1 để tạo ra xung 1ms , chip mình dùng là PIC18F2620, dùng thạch anh 8Hmz
OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_INT & T1_PS_1_8 &
T1_OSC1EN_OFF); //タイマ1の設定,8ビットモード,割込 使用


//////////////////////

void isr_low_handler(void)
{
if(PIR1bits.TMR1IF){ // タイマ1割り込み?
PIR1bits.TMR1IF=0; // タイマ1割り込みフラグを0にする
if(--cnt1 <=0){
cnt1=10;
LATAbits.LATA4=!LATAbits.LATA4;
}


Nhưng kết quả không ra như ý muốn, thời gian dài hơn và không chính xác.
Mong chỉ giùm mình cách tính với.
Bạn đang dùng C18 phải không? Thời gian dài hơn ở mức độ nào, 1 vài chu kỳ xung clock hay gấp đôi, gấp ba thời gian mong muốn?

Tôi sẽ đặt lệnh giảm biến cnt1 ra bên ngoài lệnh if trong đoạn code trên.

Thân,

littlephoc
01-10-2007, 09:50 AM
bỏ biến cnt1 đi.
lẽ ra với setup như vậy, mình hi vọng time là 0.5*256*8=1024 micro second. Nhưng đo bằng máy thì thấy khoảng 30 mili giây.
Dùng timer0 thì kết quả chính xác.
OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_8); //タイマ1の設定,8ビットモード,割込 使用

littlephoc
12-11-2007, 02:18 AM
Đã test và kết quả như sau:
Nếu tạo file isr.c riêng, đặt tất cả các khai báo interrupt vào đấy thì Timer1 chạy đúng.
Ngược lại, copy những dòng lệnh interrupt đã chạy đúng vào chỉ 1 file main.c thì
-Timer0 chạy đúng
-Timer1, cho dù set biến TMR1L hay WriteTimer1(i) thế nào đi nữa thì nó vẫn chạy như không hề được set TMR1L
Xin cho hỏi nguyên nhân và giải pháp ạ.

littlephoc
12-11-2007, 12:33 PM
giúp em với ạ.

namqn
12-11-2007, 05:23 PM
Tôi khởi tạo Timer 1 như thế này:
//Timer 1 initialisation
void Init_TMR1(void) {
T1CON = 0xB0; //Timer 1 is a 16-bit timer, 1:8 prescale
TMR1H = 0xFF; //Count number for 1 ms period @ 8 MHz clock
TMR1L = 0x06;
PIR1bits.TMR1IF = 0; //Clear TMR1 interrupt flag
IPR1bits.TMR1IP = 0;
PIE1bits.TMR1IE = 1; //Enable TMR1 interrupt
T1CONbits.TMR1ON = 1; //Turn Timer 1 on
}
Đoạn code xử lý ngắt như sau:
if (PIR1bits.TMR1IF == 1) {
PIE1bits.TMR1IE = 0;
TMR1H = 0xFF; //Count number for 1 ms period @ 8MHz clock
TMR1L = 0x06;
flag2 |= 1;
PIE1bits.TMR1IE = 1;
PIR1bits.TMR1IF = 0;
}
Tất cả code chỉ nằm trong 1 tập tin (có chứa main và các chương trình con, chương trình xử lý ngắt khác). Mọi sự diễn ra bình thường, cờ flag2 bị đổi trạng thái mỗi 1 ms, với tần số clock là 8 MHz (thử bằng phần cứng, đo thời gian bằng DSO).

Thân,

littlephoc
13-11-2007, 02:14 AM
em làm được rồi ạ. Cám ơn dòng code của anh.