PIC Lesson: Interrupt

February 4th, 2010  Posted at   Lesson PIC
arrow   |   12 Commentsarrow

Interrupt adalah salah satu fungsi istimewa di dalam PIC. Interrupt digunakan untuk menempatkan program yang penting atas sebab berlakunya sesuatu punca. PIC16 mempunyai 15 punca interrupt. Pemilihan interrupt ditentukan oleh beberapa address iaitu INTCON, PIE1 dan PIE2.

Punca-punca yang boleh berlaku interrupt adalah

  1. TMR0 overflow interrupt. TMR0 overflow dari FFh ke 00h.
  2. TMR1 overflow interrupt. TMR1 overflow dari FFFFh ke 0000h.
  3. TMR2 match interrupt. TMR2 match dengan nilai PR2.
  4. Port RB0 external interrupt.
  5. RB Port change interrupt. Perubahan pada port RB7:RB4
  6. A/D Converter interrupt. A/D conversion selesai.
  7. USART receive interrupt. USART selesai menerima data.
  8. USART transmit interrupt. USART selesai menghantar data.
  9. SSP interrupt.
  10. CCP1 interrupt. Berfungsi pada keadaan capture dan compare.
  11. CCP2 interrupt. Berfungsi pada keadaan capture dan compare.
  12. Comparator interrupt. Perubahan pada comparator input.
  13. EEPROM write interrupt. EEPROM selesai menyimpan data.
  14. PSP read/write interrupt. PSP bersedia untuk menulis dan membaca data.
  15. A bus collision has occurred in the SSP when configured for I2C Master mode.

Program interrupt digunakan untuk program kritikal atau penting yang memerlukan perhatian lebih. Contohnya program bagi memberi isyarat pada setiap beza waktu yang tetap tanpa mengganggu program-program lain. Bagi tujuan ini, timer interrupt digunakan.

Bagi menggunakan interrupt, bit-bit berkaitan perlu di enable kan. Contoh, untuk menggunakan Timer0 interrupt, bit TMR0IF disetkan, menggunakan Timer1 interrupt, bit TMR1IF disetkan dan menggunakan Timer2 interrupt, bit TMR2IF disetkan.

Berikut adalah videonya.

PIC Source Code

12 Responses to “PIC Lesson: Interrupt”

  1. rizuan says:

    salam..
    abg shahrul blh bg idea x mcm mn nk bt intrrupt antara GSM dan GPS
    sy nk hntrkn data dari GPS menerusi GSM modem k fon sy

  2. taufiq says:

    salam…sy ade gune ccp1 interrupt utk capture pulse serendah 20 – 160hz…then sy kira freq pulse tersebut n display ke lcd…skrg ni calculation sy buat dlm interrpt..skrg program sy x bleh display ke lcd kerana berlaku stack overflow…sy ade bace measuremnt bleh buat kat backgrd(main) la…tp mcm mane nak trigger dr interrupt tu ke main untuk measurement..ccp1 interrpt flag hanya set bila ia detect rising edge of pulse…jd sy nak mntak cadangan n solution dr pengalaman saudara mengenai masalah ni…

  3. LKS says:

    can interrupt run with delay command ? will delay command causing the problem ?

    my coding

    #include
    #include “SLCD.h”

    char di[10];
    int INT[3],a;
    void pic_init(void);
    void timer_init(void);
    void convert(int no, char base);
    void display(char number);

    static void interrupt isr(void)
    {
    if(TMR0IF==1)
    {
    TMR0IF=0;
    if(INT[0]=0;i–) display(di[i]);
    }
    }

    void pic_init()
    {
    TRISB=0x00;
    PORTB=0x00;
    TRISC=0x00;
    PORTC=0x00;
    T0CON=0b11000100;
    T1CON=0b00000000;
    T2CON=0b00000000;
    INTCON=0b11100000; //Enable Global, Periperal, TMR0 Interrupt
    PIE1=0b00000011; //Enable TMR1, TMR2 Interrupt
    PIE2=0b00000000;
    }

    void timer_init(void)
    {

    PR2=200;
    TMR0=0;
    TMR1H=0;
    TMR1L=0;
    TMR2=0;

    INTCON=0b11100000; //Enable Global, Periperal, TMR0 Interrupt
    PIE1=0b00000011; //Enable TMR1, TMR2 Interrupt
    PIE2=0b00000000;
    }

    void convert(int no, char base)
    {char i;
    for(i=0;i<=9;i++) di[i]=0;
    i=0;
    do{
    di[i]=no%base;
    no=no/base;
    i=i+1;}
    while(no!=0);
    }

    void display(char number)
    {switch(number){
    case 0:{slcd_putstr("0");break;}
    case 1:{slcd_putstr("1");break;}
    case 2:{slcd_putstr("2");break;}
    case 3:{slcd_putstr("3");break;}
    case 4:{slcd_putstr("4");break;}
    case 5:{slcd_putstr("5");break;}
    case 6:{slcd_putstr("6");break;}
    case 7:{slcd_putstr("7");break;}
    case 8:{slcd_putstr("8");break;}
    case 9:{slcd_putstr("9");break;}
    case 10:{slcd_putstr("A");break;}
    case 11:{slcd_putstr("B");break;}
    case 12:{slcd_putstr("C");break;}
    case 13:{slcd_putstr("D");break;}
    case 14:{slcd_putstr("E");break;}
    case 15:{slcd_putstr("F");break;}
    default:{slcd_putstr("?");break;}
    }}

  4. LKS says:

    I cannot run 3 timers simultaneously, only 1 at a time..otherwise the serial SPI LCD will hang.. Using 18F4550 on 20MHz

    • Shahrul says:

      LKS, make sure interrupt program as short as possible. It will problem when interrupt program is long and it maybe occur another interrupt in the interrupt.

  5. fatimah says:

    salam, nak tanya, ada tak contoh 2 programming untuk projeck mcm ni….

    read sensor and transmit through RF module

  6. nuwa says:

    sila jgn pening alkisah..gi telah panadol jer jika pening2..hehe.

  7. alkisah says:

    huhuhu..pening gua psl teknologi nih..gua buta it, tp xper gua x buta hati..hehe

Leave a Reply

What is 13 + 9 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)