Thursday, 10 April 2014

Interupsi Eksternal Pada Mikrokontroller

Haii para mikroholic!!!!
Salam kapasitorrr!! :D
Pada postingan kali ini kita akan membahas mengenai Interupsi Eksternal Pada Mikrokontroller. Sebelum kita masuk ke pokok bahasan, kita akan mengulang sedikit mengenai arti dari interupsi itu sendiri. Dalam pemrograman sebuah interupsi ialah beberapa listing coding atau lebih yang dijalankan memotong program utama, setelah listing coding itu selesai dieksekusi maka program utama akan dilanjutkan kembali. Sebagai contoh dalam sebuah rapat, ada salah satu peserta rapat melakukan interupsi dan memberikan sejumlah pendapat, setelah interupsi tersebut selesai maka rapat dilanjutkan lagi. Lebih kurangnya penjelasannya seperti itu hehehehe.


Lanjut kita ke programannya.
Dalam mikrokontroller, terdapat 3 buah interupsi eksternal yaitu INT0,INT1,INT2. Dimana input untuk INT0 terdapat pada PIND.2, INT1 pada PIND3 dan INT2 pada PINB.2 . Untuk mengaktifkan interupsi ini kita harus mengeset register GICR( General Interrupt Control Register) dan GIFR (General Interrupt Flag Register) pada bit ke 5 (INT2), bit ke 6(INT0) bit ke 7 (INT1).






Setelah itu kita juga harus mengatur bagaimana PIN interupsi ini bekerja falling edge (0 ke 1) atau rising edge (1 ke 0). Untuk mengatur hal tersebut kita harus mengaktifkannya di register MCUCR (untuk INT0 dan 1) MCUCSR (untuk INT2).



Berikut Penjelasan mengenai ISC00 dan ISC01 untuk INT0

Hal yang sama juga berlaku untuk INT1 yaitu pada bit ISC10 dan ISC11. Untuk INT2 hanya terdapat 1 bit yaitu ISC2 (jika 1 = rising edge, 0 = falling edge).

Setelah memahamin registernya baru kita ke Compiler codevisionnya. Memrogramnya tidak seribet memahamin registernya lohh, kok bisa??? karena codevison sudah menyiapkan fitur codewizard  dimana kita hanya menconteng yang diperlukan tanpa mengeset registernya satu persatu.

Langkah pertama
Buat rangkaiannya diproteus seperti dibawah ini



Selanjutnya langkah dipemrogramannya
1. Pertama-tama kita buka CodeVisionnya.
2. Klik New, kemudian muncul jendela pilih Project,OK. Kemudian muncul jendela dengan  pertanyaan apakah ingin menggunakan codewizard? pilih Yes.


3.  Kemudian Tampil jendela codewizard, kita pilih jenis mikrokontroler & frekuensi crystal yang kita gunakan. Pada bahasan kali ini saya menggunakan atmega8535 dan crystal 11.059200 MHZ.




4. Klik tab LCD, kemudian kita pilih di PIN mana kita menggunakan LCD tersebut.
`

5. Klik tab Externak IRQ, maka akan tampil seperti ini setelah diconteng dan dipilih modenya.


6. Klik File, kemudian klik Generate Save & Exit. (Gunakan nama file yang sama)

Maka akan timbul lembar kerja yang kita atur menggunakan codewizard tadi.

 Berikut listing codingnya 

  1. #include <mega8535.h>

  2. // Alphanumeric LCD Module functions
  3. #asm
  4.    .equ __lcd_port=0x15 ;PORTC
  5. #endasm
  6. #include <lcd.h>
  7. #include <stdio.h>
  8. #include <delay.h>

  9. int count0,count1,count2;
  10. char buff[20];

  11. // External Interrupt 0 service routine
  12. interrupt [EXT_INT0] void ext_int0_isr(void)
  13. {
  14. // Place your code here
  15. count0++;
  16. }

  17. // External Interrupt 1 service routine
  18. interrupt [EXT_INT1] void ext_int1_isr(void)
  19. {
  20. // Place your code here
  21. count1++;
  22. }

  23. // External Interrupt 2 service routine
  24. interrupt [EXT_INT2] void ext_int2_isr(void)
  25. {
  26. // Place your code here
  27. count2++;
  28. }

  29. // Declare your global variables here

  30. void main(void)
  31. {
  32. PORTA=0x00;
  33. DDRA=0x00;

  34. PORTB=0x00;
  35. DDRB=0x04;  // PIN INT2 dijadikan output 

  36. PORTC=0x00;
  37. DDRC=0x00;

  38. PORTD=0x00;
  39. DDRD=0x0C; // PIN INT0 dan INT1 dijadikan output

  40. TCCR0=0x00;
  41. TCNT0=0x00;
  42. OCR0=0x00;

  43. TCCR1A=0x00;
  44. TCCR1B=0x00;
  45. TCNT1H=0x00;
  46. TCNT1L=0x00;
  47. ICR1H=0x00;
  48. ICR1L=0x00;
  49. OCR1AH=0x00;
  50. OCR1AL=0x00;
  51. OCR1BH=0x00;
  52. OCR1BL=0x00;

  53. ASSR=0x00;
  54. TCCR2=0x00;
  55. TCNT2=0x00;
  56. OCR2=0x00;

  57. // External Interrupt(s) initialization
  58. // INT0: On
  59. // INT0 Mode: Falling Edge
  60. // INT1: On
  61. // INT1 Mode: Rising Edge
  62. // INT2: On
  63. // INT2 Mode: Rising Edge
  64. GICR|=0xE0;
  65. MCUCR=0x0E;
  66. MCUCSR=0x40;
  67. GIFR=0xE0;

  68. TIMSK=0x00;

  69. ACSR=0x80;
  70. SFIOR=0x00;

  71. // LCD module initialization
  72. lcd_init(16);

  73. // Global enable interrupts
  74. #asm("sei")

  75. while (1)
  76.       {
  77.       // Place your code here
  78.       lcd_gotoxy(0,0);
  79.       sprintf(buff,"con0=%d con1=%d",count0,count1);
  80.       lcd_puts(buff);                              
  81.       lcd_gotoxy(0,1);
  82.       sprintf(buff,"count2=%d",count2);
  83.       lcd_puts(buff);
  84.       delay_ms(100);
  85.       lcd_clear();
  86.       };
  87. }
Berikut Video simulasinya 



Sekian
Semoga bermanfaat..
Terima kasih..


1 comment:

  1. Saya mau tanya apa perbedaan eksternal interupsi dan pcin interusi?

    ReplyDelete