dùng nhiều ngắt

nkvu

Trứng gà
cho e hỏi là làm sao để có thể vừa dùng đồng thời ngắt timer 0 và ngắt portB ak?
timer 0 là để e tao xung, còn portB là nút nhấn ak
e viết zầy thì k chạy đc

void interrupt isr()
{
if (T0IE&&T0IF)
{
...
}
if (RBIE&&RBIF)
{
...
}
}

nó chỉ chạy đc ngắt timer0 thôi còn nút nhấn thì k ngắt đc...
 

Manhdd

Cố Vấn CLB
Staff member
Bạn đưa đầy đủ code lên cho mọi người xem được không? Nhất là chỗ cấu hình ấy. Nhớ để code vào thẻ "code" nhé!
 

nkvu

Trứng gà
chỗ cấu hình nè a
Code:
#include <htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word
 
__CONFIG(BORV21); //2st config. Word
#define _XTAL_FREQ    4000000
ủa mà cấu hình có lien quan j đâu a!
nếu mà e để đoạn code ngắt portB lên trên ngắt timer0 thì nó chạy đc ngắt portB, timer0 thì k chạy đc
còn e để đoạn code timer0 ở trên thì ngc lại ak
 

bigboy061293

Thành Viên PIF
chỗ cấu hình nè a
Code:
#include <htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word
 
__CONFIG(BORV21); //2st config. Word
#define _XTAL_FREQ    4000000
ủa mà cấu hình có lien quan j đâu a!
nếu mà e để đoạn code ngắt portB lên trên ngắt timer0 thì nó chạy đc ngắt portB, timer0 thì k chạy đc
còn e để đoạn code timer0 ở trên thì ngc lại ak
hình như ý anh Mạnh là cấu hình cho timer chứ không phải tiền xử lý :)
 

nkvu

Trứng gà
ác...
Code:
void init_timer0()
{
    T0CS = 0;                // f timer0 = fosc / 4 = 1mhz
    PSA = 0;                // use prescaler
 
    PS2 = PS1 = PS0 =  0;    // prescaler = 1:2
 
    T0IE = 1;                // enable timer0 interrupt           
    T0IF = 0;                // clear timer0 interrupt flag
 
    TMR0 = -5;                // start value
}
void init_port()
{
    ANSEL = ANSELH = 0;
    TRISB = 0Xff;
    TRISA = TRISC = TRISE = 0;
    TRISD = 0xff;
    RC4 = RC3 = RC0 = RE0 = 0;
    PORTB = 0xff;
 
    IOCB = 0xff;
    RBIE=1;
    RBIF=0;
    GIE=1;// enable global interrup
}
 

Manhdd

Cố Vấn CLB
Staff member
Vậy là bạn có thể chạy cả 2 ngắt nhưng isr chỉ phục vụ 1 trong 2 thôi. Việc này cũng lạ nhỉ. Trong isr, 2 ngắt có tác động lẫn nhau không? Bạn có thể cho mọi người xem cả cái isr không?
Trước mình viết cái isr thế này thì vẫn ok:
Code:
void interrupt isr(void) // interrupt service routines
{
    char uart_buff, i;
    if (TMR1IF && TMR1IE)
    {
        TMR1ON = 0; 
        TMR1IF = 0;
        TMR1H =0;
        TMR1L =0;

        GIE = 0;
        clock_read();
        time_send();    
        GIE = 1;
        
        if (ADON)
        {
            unsigned long adcres;
            GODONE = 1;
            while (!ADIF);
            ADIF = 0;
            adcres = (ADRESH<<8) + ADRESL; // convert adc result
            adcres = (adcres*5*100/1023);
            uart_putc( 'V');
            uart_putc( 'O');
            uart_putc( 'L');
            uart_putc( 'T');
            uart_putc( ':');
            uart_putc( ' ');
            uart_putc( 48+adcres/100);
            uart_putc( '.');
            uart_putc( 48+(adcres/10)%10);
            uart_putc( 48+adcres%10);
            uart_putc(0x0D);
        }
        TMR1ON = 1;
    }
    if(RCIE &&RCIF)
    {
        //RXIF is cleared by hardware
        uart_buff = RCREG; //get the character
        //echo the character
        while(!TXIF);
        TXREG = uart_buff;
        if (!COM_R)
        {
            if (uart_buff == Start_Byte)
            {
                COM_R = 1;
                COM_i = 0;
            }
        }
        else
        {
            if (uart_buff == Stop_Byte)
            {
                COM_R = 0;
                COM_P = 1;
            }
            else
            {
                COM [COM_i] = uart_buff;
                COM_i ++;
            }
        }
    }
        
}
 

nkvu

Trứng gà
đây là isr của e ak
Code:
void interrupt isr()
{
    if (T0IE&&T0IF)
    {
        RE0  ^= 1;
        i++;
        T0IF = 0;// clear timer0 interrupt flag
        if ( (i>=(200-x2)) && (i<200) ) RC0 = 1;
        else RC0 = 0;
        if (i==200) i=0;
        TMR0 = -5;   
    }
    if (RBIF&&RBIE)
    {
        if(RB4==0)
        {
            RA2 = RA3 = 1;
        }
        if(RB5==0)
        {
            RA2 = 0; RA3 = 1;
        }
        if (RB6==0)
        {
            RA2 = 1; RA3 = 0;   
        }
        if (RB7==0)
        {
            RA2 = 0; RA3 = 0;   
        }
        RBIF=0;
    }
}
chả hỉu sao nó chỉ zô ngắt đc 1 cái thôi ak..hjc
 
Top