Selasa, 08 Mei 2012

JAM DIGITAL MENGGUNAKAN CTC DAN TIME DELAY ATMega16 DENGAN CodevisionAVR


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?
.......tik…..tok……tik…..tok…..tik…….tok……tik……..tok……..tik…….tok.....tik.....tok…
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