Home > Mikrokontroler > Contoh Program C CVAvr Mikrokontroler ATMEGA8535

Contoh Program C CVAvr Mikrokontroler ATMEGA8535

Belajar program C untuk mikrokontroler AVR ATmega8535, harus disertai dengan mencoba dan meng-aplikasikan, tidak hanya dengan teori saja, learning by doing.., berikut diberikan contoh program C diikuti oleh komentar-komentar yang menjelaskan.., learning by example…..

//komentar baris diawali dengan // atau diapit oleh /*…komentar….*/
/* Program ini adalah untuk mengendalikan conveyoring belt untuk penimbangan presisi benik sepatu..
dibuat pada tahun 2013 */
//==========headers
/* header adalah kumpulan library atau rutin-rutin yang sudah tersedia di program bawaan atau bisa cari di internet, jadi kita tidak perlu membuat sendiri, cukup panggil nama subrutinnya saja, misalnya ms_delay, penundaan, scan keypad, lcd dsb… */
#include <mega8535.h> //supaya compiler tahu nama-nama register-nya
#include <stdio.h>    //standart Input Output, misalnya akses ke serial port
#include <delay.h>    //rutin delay atau penundaan
#include <ctype.h>    //rutin tipe variabel
//==========global variables
/*Declare your global variables here – anda bisa mendefisikan variabel global disini, karena setiap variabel harus didefinisikan lebih dahulu untuk reservasi  di memory.Jika dalam asembler berhubungan langsung dengan nama register atau memory, jika dalam C, variabelnya berhubungan dengan memory, contoh yang sering digunakan adalah; unsigned char s2=0xFE , contoh variabel s2 untuk byte nilainya 0 sd 255, atau 0×00 sd 0xFF , 0x adalah prefix untuk hexadesimal, saat awal diisi 0xFE, contoh lain; unsigned int s3  integer tidak bertanda dari 0 sd 65535 atau 0×0000 sd 0xFFFF. bit ts=1; bit tb=0 , ini adalah variabel yang mengandle type boolean, 1 atau 0. type variabel lain bisa bilangan bertanda, floating number, double precission dll */
// contoh2;
// int a,b,c; /* -32768 to 32767 with no decimal point */
// char x,y,z; /* 0 to 255 with no decimal point */
// float num,toy,thing; /* 10E-38 to 10E+38 with decimal point*/
//===========input output
//=========== define – mendefinisikan atau assigment, ini untuk mempermudah penulisan program
//misalnya untuk menyalakan led, cukup tulis led_on, tetapi harus anda definisikan dulu
//karena mikrokontroler taunya hanya alamat angka atau port.
//outputs ============================= mendefiniskan I/O, supaya mudah diingat
#define led   PORTB.0 //port B.0 dipasang led, dinamai led saja biar gampang ingat
#define buzer PORTB.1 //port B.1 dipasang buzzer… dst
#define s1cc  PORTB.3
#define s2cc  PORTB.4
//
//inputs ==============================
#define start_btn PIND.5 //port D.5 dipasang switch untuk start
#define halt_btn PIND.4  //prot D.4 dipasang switch jika ditekan ’0′ sebagai sesor halt
//
//I/O extending define================= mendefinisikan lebih dalam lagi
#define led_off led=1   // untuk matikan led cukup tulis led_off
#define led_on led=0    // untuk nyalakan led cukup tulis led_on, ini active low
#define buzer_on buzer=0
#define buzer_off buzer=1
#define s1cc_on s1cc=0
#define s1cc_off s1cc=1
#define s2cc_on s2cc=0
#define s2cc_off s2cc=1
//
#define timer1_on TIMSK=0×04  //timer1_on perintah mengisi TIMSK dg 0×04 -> onkan timer
#define timer1_off TIMSK=0×00 //matikan timer
//
//constants======= mendefinisikan suatu nilai konstatnta yang akan dipakai di
//program, bukan berupa reservasi memory lho, seperti contoh dibawah, jadi kalau
//ketemu xtal, itu sama dengan 4000000
#define xtal 4000000
//
//nah ini contohnya konstanta, ofset_v itu sama dengan 500 dst
#define ofset_v 500 //nilai referensi
#define ofset_m 300 //nilai referensi
#define ofset_s 50 //nilai referensi
//
//fungsi adalah subrutin yang mempunyai nilai balik, sedangkan prosedur tidak
//fungsi dan subrutin, sering dipakai di program, jadi dibuatlah begitu, biar program lebih singkat
//berikut contoh fungsi bacatimb, membaca format text dari timbangan dan dikonversi menjadi nilai
//desimal
//function(s) ==========================
unsigned int bacatimb(void){
unsigned int s=0; unsigned char k=0;
// format data dari timbangan : 11 20 30 31 30 39 2e 30 32 67 20 20 13
// 0 1 0 9 . 0 2 g
//harus dikonversi menjadi 1090 sebagai integer (angka kedua dibelakang koma diabaikan)
//jika bukan numeris, dikembalikan dalam bentuk ‘e’, jika numeris akan dikonversi ke
//numeris 1090
s=0;
while (k!=0×11){k=getchar();} //wait for 11hexa chr
getchar(); getchar(); //space and zero, forget it
k=getchar(); if (isdigit(k)==0) return ‘e’;
s+=(k-0×30)*1000;
k=getchar(); if (isdigit(k)==0) return ‘e’;
s+=(k-0×30)*100;
k=getchar(); if (isdigit(k)==0) return ‘e’;
s+=(k-0×30)*10;
getchar(); //dot, forget it
k=getchar(); if (isdigit(k)==0) return ‘e’;
s+=(k-0×30);
return s; }
//
//procedure(s) ==========================
//kirim 3 digit ke timbangan, supaya timbangan displynya jadi nol
void tare(void) {
putchar(0×11); putchar(0×01);putchar(0×74); //tare (zeros)
}
// //kirim 3 digit ke timbangan, supaya timbangan mau mengirimkan datanya (trgger)
void request(void) {
putchar(0×11); putchar(0×01);putchar(0×73); //request to get data
}
//
void beep(void) //hidupkan buzzer 0.5 detik
{
buzer_on; delay_ms(500); buzer_off; delay_ms(500); //beeping buzer 1 second
}
//
//interupt vectors ======================== bila timer overflow, maka rutin ini yang dijalankan
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// preset again TIMER1
TCNT1=0×10000-(xtal/1024/2); //every 500ms
request(); //setiap 0.5 detik trigger timbangan, agar timbangan mau kirim data
}
//
//=================================== program utama
void main(void){
//Declare your local variables here, hanya berlaku di program utama
unsigned int st=0,sr=0,stv=0, stm=0, sts=0;
bit timb=1;
//
//Inisialisasi PORT
//ports FF output, 00 input
PORTA=0xFF; DDRA=0xFF; //ouput dan nilai awal ’1′
PORTB=0xFF; DDRB=0xFF;
PORTC=0×00; DDRC=0×00; //input dan three state jika DDRC=0xFF internal pull up
PORTD=0×00; DDRD=0×00;
TCCR0=0×00; TCNT0=0×00;
//
// Timer/Counter 0 initialization
TCCR0=0×00; TCNT0=0×00; OCR0=0×00;
//
// Timer/Counter 1 mode initialization
TCCR1A=0×00; TCCR1B=0×05; //setting supaya clock :1024
TCNT1=0×10000-(xtal/1024/2); //every 1/2 second interupt
ICR1H=0×00; ICR1L=0×00; OCR1AH=0×00; OCR1AL=0×00; OCR1BH=0×00; OCR1BL=0×00;
//
// External Interrupt(s) initialization
MCUCR=0×00; MCUCSR=0×00;
//
//serial port initialisasi
UCSRA=0×00; UCSRB=0×18; UCSRC=0×86; UBRRH=0×00;
UBRRL=0×19; //0×33 for 4800bps, 1 stop, parity none
//
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80; SFIOR=0×00;
//
// timer1_off;
// global enable interrupts
#asm(“sei”)
//
//=====================================
tare(); //nolkan timbangan, panggil rutin tare()
while (start_btn==1){led=~led; delay_ms(50);} //tunggu startbutton ditekan
timer1_on; sr=bacatimb();
while (sr==’e'){sr=bacatimb();}
stv=sr-ofset_v;stm=sr-ofset_m;sts=sr-ofset_s;
//
// loop==== program mikro tidak akan berhenti selalu akan looping disini
while (1) {
timer1_off; beep();
while (start_btn==1){led=~led; delay_ms(200);} //wait startbutton
//
timb=1; tare(); delay_ms(500);
timer1_on;
while (timb==1){ led=~led;
st=bacatimb();
while (st==’e'){st=bacatimb();} // s1 s2
while (halt_btn==0){
s1cc_off; s2cc_off; beep();}
//
if (st<stv) {s1cc_on ; s2cc_on;} // 1 1
else if (st<stm) {s1cc_off; s2cc_on;} // 0 1
else if (st<sts) {s1cc_on ; s2cc_off;} // 1 0 else if (st>=sts) {s1cc_off; s2cc_off; timb=0;} // 0 0
} //timb=1
//
} //loop===================== end loop
//
} //main====================================== end main

  1. December 28th, 2013 at 00:08 | #1

    boleh minta beberapa contoh program?


3 + = 10