PIC Lesson: Interrupt


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

Sertai Telegram Group bagi dapatkan source code


12 responses to “PIC Lesson: Interrupt”

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

    read sensor and transmit through RF module

    • 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.

  2. 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;}
    }}

  3. 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…

  4. 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

Leave a Reply to alkisah Cancel reply

Your email address will not be published. Required fields are marked *