Advertise here

Sabtu, 16 Maret 2019


Introduction
Ada kalanya interupsi dibutuhkan pada pengerjaan program agar memprioritaskan urutan proses yang masuk dalam vektor interupsi.  

Proses interupsi sangat beragam ada yang diproses dengan mengirimkan sinyal interupsi untuk menjalankan timer melalui Pin Int Ext yang digunakan, kemudian interupsi berjalan hingga selesai, ini disebut interupsi eksternal. Ada proses interupsi yang dijalankan secara internal dengan mengatur timer hingga overflow ini disebut dengan interupsi internal. Pada MCU STM32F103, memiliki 4 timer counter untuk interupsi, dan masing masing counter memiliki 4 channel. Kali ini saya akan menggunakan proses interupsi timer secara internal, artinya tidak dibutuhkan sinyal dari luar ketika proses interupsi di mulai.

Proses interupsi ini diaplikasikan untuk menyalakan dioda cahaya (LED) blink pada PC13 tanpa melalui fungsi loop. Dengan menerapkan proses interupsi timer kita dapat membagi bagi pekerjaan CPU secara multitasking misalnya interupsi timer digunakan untuk menampilkan seven segment yang memiliki tundaan waktu 3ms, dan fungsi loop mengerjakan pembacaan suhu lalu mengirimkan data ke internet dan menampilkan data ke seven segment. 

Serangkaian proses memiliki durasi waktu yang berbeda-beda, jika CPU mengerjakan proses yang memiliki waktu tunda 100ms, maka CPU akan menunggu waktu tunda selama 100ms itu secara sia-sia tanpa mengerjakan proses yang lain, bagaimana jika ada waktu proses yang dibutuhkan dengan cepat sedangkan cpu sedang menunggu proses menghabiskan waktu 100ms tadi? maka jawabnya adalah dengan menggunakan proses interupsi.

Bill Of Material
  • Board STM32F103C Blue Pill
  • 1x Dioda Cahaya LED 3,5mm
  • Bread Board 400 dot point
  • 1x Resistor 220 Ohm
  • Dan beberapa kabel Jumper Female to Male, dan Male to Male


Wiring Connection



Program
// Timer Interruption
// Blink without loop function
// Note this software only liblary core STM32Duino regerclarkmelbourne
// Referency from docs.leaflabs.com

// in microseconds; should give 0.5Hz toggles
#define LED_RATE 500000
// We'll use timer 2
HardwareTimer timer( 2 );
void setup() {
// Set up the LED to blink
pinMode(PC13, OUTPUT);
// Pause the timer while we're configuring it
timer.pause();
// Set up period in microseconds
timer.setPeriod(LED_RATE);
// Set up an interrupt on channel 1
timer.setChannel1Mode(TIMER_OUTPUT_COMPARE);
// Interrupt 1 count after each update
timer.setCompare(TIMER_CH1, 1);
timer.attachCompare1Interrupt(handler_led);
// Refresh the timer's count, prescale, and overflow
timer.refresh();
// Start the timer counting
timer.resume();
}
void loop() {
// Nothing! It's all in the handler_led() interrupt:
}
void handler_led( void ) {
toggleLED();
}

void toggleLED(){
  if (digitalRead(PC13)==LOW){
  digitalWrite(PC13,HIGH);
  }
  else if (digitalRead(PC13)==HIGH){
  digitalWrite(PC13,LOW);
  }
}

Test & Result
Setelah program di upload dan dijalankan maka LED akan berkedip setiap 0,5 detik nyala dan mati secara terus menerus. Ini menandakan kalau proses interupsi berhasil dijalankan.

Comments 0

Advetise banner