Hỏi về hoạt động timer0 của PIC

thieuhuutrung

Trứng gà
cho em hỏi là, vòng đếm của timer0 sẽ đc pic thực hiện khi nào. chẳng hạn em có đoạn code sau
Code:
#include <htc.h>
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF); //1st config. Word
__CONFIG(BOR4V_BOR21V);
 
#define _XTAL_FREQ    4000000
unsigned int n=0;
unsigned int m=0;
void port_init()
{
    ANSEL=0;
    ANSELH=0;        //Tat ca các port là digital
    TRISA4=1;        // RA4=TOCKI => input
    TRISB=0x00;    //8 pins PortB là output
    PORTB=0xFF;        //Xuat muc “1”   
}
 
void timer0_init()
{
    T0CS=0;            //1: su dung chuc nang counter
                    //0: su dung chuc nang timer
    T0SE=0;            //1: high->low
                    //0: low->high
    PSA=0;            //1: chon ko chia tang
                    //0: chon chia tang( khi timer)
    PS0=1;
    PS1=1;
    PS2=1; //1:256
    T0IE=1;            //1: cho phep ngat
                    //0: ko cho phep
    GIE = 1;
    T0IF=0;
    TMR0=0x00;        //set gia tri ban dau cua bo dem.
}
 
void interrupt isr()
{
    if(T0IE&&T0IF)
    {
        if (n==15)
            n=0;//n dem 1s
        if (m==7)
            m=0;//m dem 500ms
        n++;
        m++;
        T0IF=0;
        TMR0=0x00;
    }
}
 
void mod1()
{
    unsigned char chayled1[9]={0xff,0b11111110,0b11111100,0b11111000,0b11110000,0b11100000,0b11000000,0b10000000,0x00};
    unsigned char shift,shiftbis;
    int i,j;
    for(i=0;i<9;i++)
    {
        PORTB=chayled1[i];
        shift=0b10000000;
        if (RA4==0)
                break;
        for(j=i;j<8;j++)
        {
            if ((RA4==0)||(m!=7))
                break;
            shiftbis = shift^0b11111111;
            PORTB=chayled1[i]&shiftbis;
            shift=shift>>1;
           
        };
    };
}
 
 
void main(void)
{
    port_init();
    timer0_init();
    __delay_ms(10);
    while(1)
    {
        mod1();
    };
}
Ý tưởng của em là, cho 1 biến đếm m vào, khi mà m khác 7 thì thoát ra main, chạy timer và khi có ngắt thì m tăng lên 1 đơn vị, cho đến khi m=7(tương đương với delay 500ms) thì mới thực hiện những câu lệnh trong mod1(). mà sao khi nạp vô pic thì led luôn sáng @@(led nối anot chung như trong hướng dẫn) và có nháy nhưng rất nhanh. vì vậy, em thắc mắc là không biết timer0 nó đếm khi nào. khi mình đang chạy 1 cái khác thì timer 0 có đếm ko? cảm ơn mọi người đã đọc.
 

cxduc92

Thành Viên PIF
Anh cũng chưa phát hiện ra nó sai chỗ nào đâu. Nhưng vì anh đã từng làm với PIC nên có một số cách debug "sơ khai" em có thể tham khảo.
Hàm port_init(), interrupt isr() với timer0_init() em đã viết đúng rồi. Bây giờ em thử viết cái code đơn giản là nháy led toàn bộ port B với thời gian 1s và 0.5 s xem nó đã nháy được chưa. Bằng cách bỏ cái mod1 trong while(1) đi và thêm cái PORTB= ^ 0xff sau câu đk if trong interrupt isr(), cho nháy 1s thì vào if n, nháy 0.5s thì vào if m
Sau đó nếu nó nháy đúng rồi thì em thử xem cái RA4 của em có disable được không bằng cái lệnh: if (RA4==0) GIE=0; vào while(1)
Nếu đã chạy được rồi thì lên đây chém tiếp:1cool_byebye:.Tại cái hàm mod1 của em viết khó đỡ quá, lười đọc, em viết chỗ thuật toán thì nên comment vào chứ không comment không debug nổi khi xem code trên giấy đâu em:5cool_sweat:
 

cxduc92

Thành Viên PIF
à quên nãy giờ lo chém gió quên không trả lời câu hỏi.Timer sẽ đếm khi mà cờ T0IF =0 nhé em,trong cái interrupt isr em có lệnh T0IF để clear cờ báo đấy.Giá trị timer tràn là 65000 nhá :1cool_byebye:
 

thieuhuutrung

Trứng gà
dạ, cảm ơn anh. vậy nếu e chỉ cần để cho T0IF=0 thì timer0 chạy, bất chấp là PIC đang chạy cái khác phải ko a?
 
Top