PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   timer của PIC18 (http://www.picvietnam.com/forum/showthread.php?t=1550)

littlephoc 27-09-2007 03:13 PM

timer của PIC18
 
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

Trích:

Nguyên văn bởi littlephoc (Post 11635)
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:
Code:

//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:
Code:

        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.


Múi giờ GMT. Hiện tại là 11:40 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam