Senin, 02 Desember 2013

TIMER DAN COUNTER





PRAKTIKUM 6

TIMER  DAN COUNTER


TUJUAN :
1.   Mampu membuat program yang mengunakan fitur timer sebagai pewaktu.
2.   Mampu membuat program yang menggunakan fitur timer sebagai penghitung.
3.   Mampu mempergunakan fitur timer pada mikrokontroler untuk membuat jam digital
sederhana.



PERALATAN :

                                    1.   Komputer                                     : 1 set
                                    2.   Arduino Uno                                 : 1 pcs
                                    3.   Kabel USB tipe B                         : 1 pcs
                                    4.   Project board                                : 1 pcs
                                    5.   Kabel jumper                                 : 1 set
                                    6.   LED                                             : 1 pcs
                                    7.   Resistor 330 Ohm                          : 1 pcs
                                    8.   Switch pushbutton                      : 1 pcs
                                    9.   LCD                                              : 1 pcs
                                  10. Potensiometer                                  : 1 pcs



PERCOBAAN :
6.1 Penggunaan Timer Overflow  Untuk LED Blinking
Pada percobaan kali ini akan dibuat program untuk membuat led berkedip per 500
milliseconds.  Pada  dasarnya  LED  akan  toggle  (berubah  kondisinya)  setiap  terjadi
interupsi   timer   overflow.   Nilai   register   timer   di-set   sedemikian   rupa  sehingga
menghasilkan waktu overflow per 500 milliseconds.
  
Prosedur :
1.   Buatlah rangkaian seperti pada Gambar 6.1.





Gambar 6.1 Rangkaian Percobaan 6.1


2.   Tuliskan  sintaks  program  berikut  ini,  kemudian  lakukan  kompilasi  dan  upload
program ke sistem minimum Arduino.
  

boolean  dataLed  =  0;                      // untuk menginilisasi variabel dataled bertipe boolean(1/0)
unsigned  int  overflowCount  =  0; // menginilasisasi overflowcount bernilai 0

void  setup() {                                  // settingan awal program
Serial.begin(9600);              // kecepatan transfer data serial
pinMode(13,  OUTPUT);                    // pin 13 pada arduino dijadikan pin output
TCCR1A  =  0;                            // timer register 1 a bernilai 0
TCCR1B  =  0;                            // timer register 1 b bernilai 0
TCNT1  =  34286;                // Set timer 1counter initial valu to 34286

TCCR1B  |=  (1  <<  CS12);

//  256  prescaler(sama seperti dibawah)

TIMSK1  |=  (1  <<  TOIE1);         // Timer/Counter Interrupt Mask Register
sei();
}

ISR(TIMER1_OVF_vect)  {           // interupt service routin untuk timer 1
TCNT1  =  34286;                          //  Set timer 1counter initial valu to 34286
if(dataLed  ==  0)  {               //  kondisi jika dataled = 0
dataLed  =  1;                         //  maka eksekusi dataled bernilai = 1
}
else  {                                       //  jika dataled bernilai 0
dataLed  =  0;                         //  masukan dataled bernilai 0
}
digitalWrite(13,  dataLed); //  baca digital pin 13 dari variabel dataled
overflowCount++;                       //  nilai overflowcount ditambah 1
}

void  loop() {
Serial.print("Overflow  count  =  ");        // serial menampilkan tulisan overflow count =
Serial.println(overflowCount,DEC); // menampilkan nilai dari variabel overflow count
delay(100);                                                // delay 100 milisecond
}



3.   Buka Serial Monitor pada Arduino IDE, pastikan baudrate pada Serial Monitor
adalah 9600. Kemudian amati teks yang ditampilkan pada Serial Monitor. Amati
juga kondisi nyala dan mati LED pada pin 12.
Tugas dan Pertanyaan :
1.   Jika dilakukan perhitungan konfigurasi register  pada sintaks program Percobaan
6.1, timer 1 akan overflow setiap berapa milliseconds ?
1/fCLK x (FFFFh+1)=0.125uS x 34286 = 0.004285
 TMAX = 1/fCLK x (FFFFh+1) x N=0.004285*256 = 19,72
2.   Jelaskan perbedaan penggunaan delay dan timer overflow !
Delay adalah waktu tunda selagi program berjalan dan tidak bisa diselingi oleh program lain sedangkan, timeroverflow adalah penghitung atau pencacah jadi selama menghitung kita dapat menyisipkan sebuah program   



6.2 Jam Digital Menggunakan Timer
Pada percobaan kali ini akan dibuat program sederhana yang berfungsi sebagai jam
digital  dengan  memanfaatkan  fitur  timer  mikrokontroler.  Timer  akan  dikonfigurasi
sehingga terjadi overflow setiap 1 detik. Tiap timer terjadi overflow, variabel detik,
menit dan jam akan di--update nilainya. Nilai variabel tersebut akan ditampilkan pada
LCD.
Prosedur :
1.   Buatlah rangkaian seperti Gambar 6.2.



Gambar 6.2 Rangkaian jam digital bebasis Arduino


2.   Tuliskan sintaks program berikut ini, lakukan kompilasi dan upload program.

#include<LiquidCrystal.h>
LiquidCrystal  lcd(2,3,4,5,6,7);
unsigned  int  jam,  menit, detik;
boolean led = 0;

ISR(TIMER1_OVF_vect)  {
TCNT1H=0xC2;
TCNT1L=0xF7;
detik++;
if(detik>=60)  {
detik  =  0;
menit++;
if(menit>=60)  {
menit  =  0;
jam++;
if(jam>=24)  {
jam  =  0;
}
}
}
}

void  initTimer1()  {
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xC2;
TCNT1L=0xF7;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01;
sei();
}

void  setup() {
lcd.begin(16,2);
lcd.clear();
initTimer1();
}

void  loop() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Jam  Digital");
lcd.setCursor(0,1);
lcd.print(jam,DEC);
lcd.print(":");
lcd.print(menit,DEC);
lcd.print(":");
lcd.print(detik,DEC);
delay(500);
}


Tugas dan Pertanyaan :
1.   Ubahlah sintaks program pada Percobaan 6.2 sehingga jam menampilkan waktu
saat ini !
2.   Jika  dilakukan  perhitungan  dengan  konfigurasi  register  pada  sintaks  program
Percobaan 6.2, timer 1 akan overflow setiap berapa milliseconds ?
3.   Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.2 !

#include<LiquidCrystal.h>                 // memanggil library lcd pada arduino
LiquidCrystal  lcd(2,3,4,5,6,7);            // menginilisasi pin pada lcd
unsigned  int  jam,  menit, detik;             // menginilisasi variabel jam,menit,detik
boolean led = 0;                                // variabel led bertipe bolean (0 atau 1)

ISR(TIMER1_OVF_vect)  {                           // Interupt service routin untuk timer 1
TCNT1H=0xC2;                                 // Memasukan nilai timer1 register H hex=122(c2)
TCNT1L=0xF7;                                 // Memasukan timer1/counter register L hex=157
detik++;                                     // tambahkan nilai di variabel detik
if(detik>=60)  {                               // kondisi jika detik lebih besar dari 60
detik  =  0;                                        // masukan nilai 0 ke variabel detik
menit++;                                   // tambahkan nilai variabel menit
if(menit>=60)  {                      // kondisi jika nilai menit lebih besar dari 60
menit  =  0;                                // variabel menit nilai nya 0
jam++;                                         // tambahkan nilai pada variabel jam
if(jam>=24)  {                // kondisi jika nilai variabel jam lebih besar dari 24
jam  =  0;                               // masukan nilai 0 pada variabel jam
}
}
}
}

void  initTimer1()  {                       // void untu timer
TCCR1A=0x00;                                 // nilai timer1 register 1 A = 0
TCCR1B=0x05;                                 // nilai timer1 register 1B = hexadesimal 05
TCNT1H=0xC2;                     // nilai counter/timer 1H penghitung sampai C2(122) /presceler
TCNT1L=0xF7;                     // nilai counter/timer 1L akan menghitung sampai F7(157)/presceler
ICR1H=0x00;                                        
ICR1L=0x00;      
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01;                                 // Timer/Counter Interrupt Mask Register
sei();                                             // global intrupsi
}

void  setup() {                                         // void untuk default dari program
lcd.begin(16,2);                              // menjelaskan lcd 16x2 baris x kolom
lcd.clear();                                 // menghapus tampilan lcd sebelum nya
initTimer1();                                // masukan program dalam void initTimer1




void  loop() {                            // void untuk eksekusi ( berulang)
lcd.clear();                          // menghapus tampilan lcd sebelumnya
lcd.setCursor(0,0);           // peletakan cursor pertama dalam menampilkan output lcd
lcd.print("Jam  Digital");         // lcd menampilkan tulisam jam digital
lcd.setCursor(0,1);                    // posisi kursor berada di kolom dan baris
lcd.print(jam,DEC);                    // menampilkan nilai dari variabel jam,dalam desimal
lcd.print(":");                        // menampilkan tanda :
lcd.print(menit,DEC);         // menampilkan nilai dari variabel menit,dalam desimal
lcd.print(":");                        // setelah program diatas akan di print tanda :
lcd.print(detik,DEC);         // menampilkan nilai dari variabel detik, dalam desimal
delay(500);                                  // waktu tunda sebanyak 500 milisecond
}


6.3  Counter Mode Falling Edge

Pada percobaan kali ini akan dibuat program yang berfungsi untuk menghitung jumlah penekanan swit ch pada input counter. Konfigurasi counter menggunakan mode falling edge.

Prosedur :

1.  Buatlah rangkaian s eperti pada Gambar 6.3.



Gambar 6.3 Rangkaian Percobaan 6.3




2.  Tuliskan  sintaks  program  berikut  ini,  kemudian  lakukan  ko mpilasi  dan  upload

program ke sistem minimum Arduino.

void setup()                      // untuk settingan awal program
{
Serial.begin(9600);             // kecepatan tarnsfer data
TCCR1A=0x00;                    // nilai timer1 register 1 A = 0
TCCR1B=0x06;                    // nilai timer1 register 1 B = 6
TCNT1H=0x00;                   
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}

void loop() {                                          // untuk pengulangan program yang ada di void

Serial.print("Nilai TCNT1 = ");    // serial print menampilkan Nilai TCNT1
Serial.println(TCNT1,DEC);          // TCNT1 bernilai decimal
delay(100);                            // interval waktu untuk program
}



3.      Buka Serial Monit or pada Arduino IDE, kemudian tekan swi tch pushbutton dan amati nilai TCNT1 yang ditampilkan pada Serial Monitor.

Tugas dan Pertanyaa n :

1.      Kapankah nilai counter (TCNT1) akan berubah ? Saat switch ditekan atau dilepas ? Jelaskan !
Pada saat ditekan, karena pada program ini yang digunakan adalah mode falling edge

2.      Berapakah nilai ma ksimal counter jika input counter menggun akan pin T1 (Timer

1) ? Jelaskan kenapa !



6.4  Counter Mode Rising Edge

Pada percobaan ka li ini akan dibuat program yang fungsi nya sama dengan Percobaan 6.3. Namun pada percobaan kali ini konfigurasi counter menggunakan mode rising edge.

Prosedur :

1.      Gantilah sintaks pr ogram pada Percobaan 6.5 dengan sintaks p rogram berikut ini, kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino.



void setup()                          // untuk settingan awal program
{
Serial.begin(9600);          // kecepatan tarnsfer data
TCCR1A=0x00;                 // nilai timer1 register 1 A = 0
TCCR1B=0x07;                 // nilai timer1 register 1 B = 6
TCNT1H=0x00;         
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}

void loop() {                                            // untuk pengulangan program yang ada di void

Serial.print("Nilai TCNT1 = ");     // serial print menampilkan Nilai TCNT1
Serial.println(TCNT1,DEC);   // TCNT1 bernilai decimal
delay(100);                  // interval waktu untuk program
}




2.      Buka Serial Monit or pada Arduino IDE, kemudian tekan swi tch pushbutton dan amati nilai TCNT1 yang ditampilkan pada Serial Monitor.

Tugas dan Pertanyaa n :

1.      Kapankah nilai counter akan berubah ? Saat switch ditekan atau dilepas ? Jelaskan !
Pada saat dilepas , karena pada program kali ini yang di pakai adalah mode rising edge

2.      Jelaskan perbedaan penggunaan counter mode falling edge dan mode rising edge !
Mode falling edge adalah perubahan terjadi saat posisi switch berubah dari kondisi 1 ke 0, sedangkan rising adalah sebaliknya.