Akhirnya, dengan dua contoh sebelumnya, yaitu menggunakan 1 buah interrupt dan 2 buah interrupt sekarang saatnya kita mencoba membuat yang lebih menantang lagi. Jika anda ingin menggunakan 3 buah interrupt atau variasi2 lain dari tiap mode interrupt pada AVR ATMega monggo dilanjut dulu codingnya.
Latihan Menggunakan Interupsi ATMega untuk Sensor Suhu
Salah satu kegunaan mikrokontroler dalam dunia nyata adalah sebagai otomatisasi, menggantikan peran manusia, misalnya dipake buat bikin alarm anti maling atau jemuran otomatis, ya semua yang serba otomatis, kita cuma diem ngeliatin doang, klopun butuh peran manusia ya dikit2 aja deh.
Nah sekarang kan enggak enak klo interupsinya kok pake tombol, berarti harus manusia lagi dong yang ngejalanin? Gantian kali ini kita make sensor suhu, apalagi klo bukan mau make LM35 😀 hahaha yang paling gampang sih yo, klo mau pake termokopel juga nggak papa, beli di toko teknik paling 25ribuan, klo pengen termokopel gratisan ya asal ngembat tali jemuran tetangga sama nggunting kabel tembaga PLN trus dililit beres deh jadi, soal konsistensi output lha kuwi sik susah dicekel nek gawean dewe.
Oke, prinsip kerja dari program kali ini adalah membuat semacam alarm ketika sensor menunjukkan suhu di atas 40 derajat celcius. Ketika output mencapai 40 derajat, maka mikrokontrol mengaktifkan PORTC.0 yang terhubung dengan basis transistor untuk mensaklar PORTD.2 sebagai input interrupt.
Setelah PORTD.2 aktif maka program akan menjalankan rutin interrupt, sebenernya nih program cuma modif dikit dari yang kemaren cuma dicampur sama ADC, jadi mangap klo outputnya masih sama make LED doang program utama lednya naik, klo sub rutinnya lednya turun, monggo klo mau dibikin kedip blink blink yang cepet, suka suka teman2 pokoke. Atau klo mau lebih sip dipake buat pengendali kipas angin yang mengatur kecepatan kipas angin, besok deh ya klo ngebahas yang pake motor, sekarang intinya kita buat otomatisasi dulu pake input sensor. Berikut listingnya
#include <mega16.h>
#include <delay.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
unsigned char rr=0;
unsigned char data=1;
while(rr<32)
{
PORTB=data;
delay_ms(30);
data=data<<1;
++rr;
if(data==0)
{data=1;}
}
PORTC.0=0;
}
/*
program ini dibuat priyo harjiyono
https://anotherorion.com
selamat berkreasi
*/
#define ADC_VREF_TYPE 0x00
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
int temp;
float vin;
unsigned char naik=128;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 500,125 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA3;
SFIOR&=0x1F;
// Global enable interrupts
#asm(“sei”)
while (1)
{
// Place your code here
temp = read_adc(0);
vin=(float)temp*500/1024;
PORTB=naik;
delay_ms(30);
naik=naik>>1;
if(naik==0)
{naik=128;}
if(vin>40)
{
PORTC.0=1;
delay_ms(10);
}
};
}