Halo Sob…… kayaknya ini akan menjadi postingan saya berikutnya….
Hehe smoga bermanfaat untuk semua……. Selamat belajar!!!!!
Sebelumnya
kita harus tahu dulu mode apa aja sih… yg ada di fungsi Timer mikrokontroler
ATMega16??????? Ya benar…. salah satunya
adalah mode CTC seperti yang akan kita
bahas dan kita coba dalam postingan kali ini. Maaf ya Sob… untuk mode yang lain
tolong dipelajari sendiri dulu….. di datasheet
ATMega16 ada semua kog…… hehehe…
soalnya saya jga msih belajar Sob….,
Apa sih mode CTC
itu?
hnah mode CTC (Clear Timer On Compare Match) itu
adalah suatu mode yang jika nilai timer yang ada pada TCNTn sudah sama dengan
nilai yang ada pada register OCRn, nilai TCNTn tersebut akan di nol kan lagi.
Untuk itu sebelumnya OCR di set dulu, karena timer 0 dan 2 maksimumnya 255,
maka range OCR 0 – 255.
Program jam digital ini bertujuan untuk mengetahui
error dan membandingkan performa antara CTC dengan time delay. Langkah utama
yang perlu dilakukan yaitu merancang desain sistem dengan menggunakan proteus.
Proteus digunakan untuk mendesain jalannya pada rangakaian elektronika sebelum
diimplementasikan. Semua uji coba termasuk kesalahan dan perbaikan dilakukan
pada proteus. Sampai disini masih kuat ya
Sob????? hehehe
OK kita lanjutkan…..pada
percobaan menggunakan mode CTC, nilai timer pada TCNTn akan dinolkan lagi jika TCNTn
sudah sama dengan nilai yang ada pada register OCRn, sebelumnya OCR diset dulu,
karena timer 0 dan 2 maksimumnya 255, maka range OCR 0 – 255. Timer yang
digunakan yaitu timer 2 dengan menggunakan Compare Match Interrupt, kristal
11.059200 Mhz, prescaller Osc/8: 11.059200 Mhz/8 = 1382.400 kHz, register
OCR=0x96.
Periodenya
sekitar 108ms jadi agar setara 1 detik harus
dikalikan 9216.
Serius amat Sob yang baca……..hehe pusing yo????? Untuk
lebih pahamnya sebaiknya Sob baca dulu datasheet mikrokontroler ATMega16………
Percobaan
kedua dengan menggunakan time delay, yaitu dengan kenaikan fungsi delay Diasumsikan nilai nilai delay untuk 1 detiknya adalah
1000 ms. Sehingga dalam pemrogramannya detak dari detik akan bertambah dengan
jeda setiap 1000ms. Begitulah Sob…..sehingga diperoleh hasil pengamatan terhadap perbandingan antara
jam digital dengan fungsi timer mode CTC dan fungsi detik selama 1 jam diperoleh
data sebagai berikut:
No.
|
Selang Waktu
|
Jam Timer
|
Jam Delay
|
Selisih
|
1.
|
15 menit
|
00:15:00
|
00:14:37
|
23 detik
|
2.
|
30 menit
|
00:30:00
|
00:29:21
|
39 detik
|
3.
|
45 menit
|
00:45:00
|
00:43:49
|
1 menit 11 detik
|
4.
|
60 menit
|
01:00:00
|
00:58:25
|
1 menit 35 detik
|
Dari hasil tersebut dapat diketahui bahwa selisih yang didapatkan dalam rentang waktu 15 menit selalu berubah atau tidak konstan. Semakin lama waktu yang ditempuh, selisih antara jam CTC dengan jam delay cenderung semakin besar. Untuk jam digital fungsi timer cenderung lebih akurat dibandingkan dengan fungsi delay ketika disesuaikan dengan waktu pada handphone . Sehingga dapat disimpulkan bahwa 1000 ms dalam fungsi delay belum tentu sama dengan 1 sekon dalam waktu perhitungan CTC. Untuk mendapatkkan waktu yang tepat dalam time CTC terdapat kekurangan sebagai berikut:
9216 x 108 = 995328 us
Jadi supaya mendapatkan tepat 1 s (1000000us) harus
ditambahkan 4672 us. Dalam 1 jam diperlukan 755984.88030 perulangan nilai
4672us. Berikut Sob… rangkaian simulasi
program tersebur dengan menggunakan Proteus:
Inilah
program lengkap dari perhitungan, teori dan keruwetan diatas………hehehe
Monggo……………..
LISTING PROGRAM
Chip type
: ATmega16
Program type
: Application
AVR Core Clock frequency: 11.059200 MHz
Memory model
: Small
External RAM size
: 0
Data Stack size
: 256
*****************************************************/
#include <mega16.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ
__lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
// variabel global & Setting Clock
unsigned int kali=0,detik=50,menit=9,jam=17;
unsigned int detik1=50,menit1=9,jam1=17;
char cdetik[16],cmenit[16],cjam[16];
char cdetik1[16],cmenit1[16],cjam1[16];
void ganti_sekon(void) //fungsi ganti
detik CTC
{
lcd_gotoxy(14,0);
lcd_puts(cdetik);
lcd_gotoxy(12,0);
lcd_putsf(":0");
}
void ganti_minutes(void) //fungsi ganti
minutes CTC
{
lcd_gotoxy(11,0);
lcd_puts(cmenit);
lcd_gotoxy(9,0);
lcd_putsf(":0");
}
//fungsi ganti jam CTC
void ganti_hour(void)
{
lcd_gotoxy(8,0);
lcd_puts(cjam);
lcd_gotoxy(7,0);
lcd_putsf("0");
}
void tampil_ctc(void) //fungsi
tampil CTC
{
itoa(detik,cdetik);
itoa(menit,cmenit);
itoa(jam,cjam);
ganti_sekon();
if(detik>=10){lcd_gotoxy(13,0);lcd_puts(cdetik);lcd_gotoxy(15,0);lcd_putsf("
");}
ganti_minutes();
if(menit>=10){lcd_gotoxy(10,0);lcd_puts(cmenit);lcd_gotoxy(12,0);lcd_putsf(":");}
ganti_hour();
if(jam>=10){lcd_gotoxy(7,0);lcd_puts(cjam);lcd_gotoxy(9,0);lcd_putsf(":");}
lcd_gotoxy(0,0);
lcd_putsf("Timer=");
}
void ganti_sekon1() //fungsi
ganti detik delay
{
lcd_gotoxy(14,1);
lcd_puts(cdetik1);
lcd_gotoxy(12,1);
lcd_putsf(":0");
}
void ganti_minutes1() //fungsi ganti
minutes delay
{
lcd_gotoxy(11,1);
lcd_puts(cmenit1);
lcd_gotoxy(9,1);
lcd_putsf(":0");
}
void ganti_hour1() //fungsi
ganti jam delay
{
lcd_gotoxy(8,1);
lcd_puts(cjam1);
lcd_gotoxy(7,1);
lcd_putsf("0");
}
void tampil_delay(void) //fungsi tampil
delay
{
itoa(detik1,cdetik1);
itoa(menit1,cmenit1);
itoa(jam1,cjam1);
ganti_sekon1();
if(detik1>=10){lcd_gotoxy(13,1);lcd_puts(cdetik1);lcd_gotoxy(15,1);lcd_putsf("
");}
ganti_minutes1();
if(menit1>=10){lcd_gotoxy(10,1);lcd_puts(cmenit1);lcd_gotoxy(12,1);lcd_putsf(":");}
ganti_hour1();
if(jam1>=10){lcd_gotoxy(7,1);lcd_puts(cjam1);lcd_gotoxy(9,1);lcd_putsf(":");}
lcd_gotoxy(0,1);
lcd_putsf("Delay=");
}
void timer(void) //fungsi
detak CTC
{
if(++detik==60)
{
detik=0;
if(++menit==60)
{
menit=0;
if(++jam==24)
{
jam=0;
}
}
}
}
void delay(void) //fungsi
detak delay
{
if(++detik1==60)
{
detik1=0;
if(++menit1==60)
{
menit1=0;
if(++jam1==24)
{
jam1=0;
}
}
}
}
// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void) //Main CTC
{
// Place your code here
TCNT2=0;
if(++kali==9216)
{
tampil_delay();
tampil_ctc();
timer();
kali=0;
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1382.400 kHz
// Mode: CTC
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x2A;
TCNT2=0x00;
OCR2=0x96;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
//Main Delay
{
// Place
your code here
delay_ms(1000);
delay();
}
}
Tidak ada komentar:
Posting Komentar