Interupsi ATMega dengan Codevision (3) Sensor Suhu


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.

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 mengatur kecepatan kipas angin, besok deh ya klo ngebahas yang pake motor, sekarang intinya kita buat otomatisasi dulu pake input sensor. Berikut listingnya

BACA JUGA:   Instalasi Sismin ATmega berbasis STK500v2

#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
http://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;

BACA JUGA:   USART CodevisionAVR [1]: kirim data USART

// 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);
}
};
}

 




DMCA.com Protection Status

membuat anti maling dengan codevision avr (1), membuat program fungsi sensor suhu codvision (1), program lm35 dengan cvavr (1)

Post You May Also Like

Tentang anotherorion

Priyo Harjiyono, blogger kelahiran Cilacap yang kini menjadi warga Ngayogyakarta Hadiningrat, baginya blog adalah dunia untuk menciptakan mimpi2nya. Saat ini masih disibukkan sebagai pembelajar dalam dunia pendidikan.
Tulisan ini dipublikasikan di sinau dan tag , , , , , . Tandai permalink.

Tinggalkan Balasan

Alamat surel Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *