Popular Posts

Other Menu

TIMER DAN COUNTER








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 kondisi nya) 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 ko mpilasi 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() {                          // Default program yang kita buat
Serial.begin(9600);                      // Kecepatan transfer data serial
pinMode(13,  OUTPUT);                    // Pin 13 pada arduino jadi 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. Kemu dian amati teks yang ditampilkan pada Serial Monitor. Amati juga kondisi nyala dan mati LED pada pin 12.

Tugas dan Pertanyaa n :

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 jeda waktu yang mana selama waktu jeda tersebut semua program berhenti/ tidak berjalan.
timeroverflow adalah penghitung atau pencacah jadi selama menghitung program masih dapat di eksekusi.



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 overfl ow, variabel detik, menit dan jam akan di -update nilainya. Nilai variabel tersebut akan ditampilkan pada LCD.

Prosedur :

1.  Buatlah rangkaian s eperti Gambar 6.2.






G ambar 6.2 Rangkaian jam digital bebasis Arduino


2.  Tuliskan sintaks program berikut ini, lakukan kompilasi dan upl oad program.


include<LiquidCrystal.h>                               // memanggil library dari lcd
LiquidCrystal  lcd(2,3,4,5,6,7);                      // menginilisasi pin pada lcd
unsigned  int  jam,  menit, detik;                    // menginilissasi 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 kita
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 bari
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
}



Tugas dan Pertanyaan :

1.      Ubahlah sintaks program pada Percobaan 6.2 sehingga jam menampilkan waktu saat ini !

2.      Jika dilakukan per hitungan dengan konfigurasi register pada sintaks program Percobaan 6.2, timer 1 akan overflow setiap berapa milliseconds ?


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()
{ Serial.begin(9600);             // Kecepatan transfer data serial
TCCR1A=0x00;                      // nilai timer1 register 1 A = 0
TCCR1B=0x06;                      // nilai timer1 register 1B = hexadesimal 06
TCNT1H=0xC2;               // Memasukan nilai timer1 register H hex=122(c2)
TCNT1L=0xF7;               // Memasukan timer1/counter register L hex=157
ICR1H=0x00;                // inisialisasi panjang pulsa di rgiste H
ICR1L=0x00;                // inisialisasi panjang pulsa di rgiste L
OCR1AH=0x00;               // Output compare register
OCR1AL=0x00;               // Output compare register
OCR1BH=0x00;               // Output compare register
OCR1BL=0x00;               // Output compare register
}

void loop() {

Serial.print("Nilai TCNT1 = ");               // menampilkan "Nilai TCNT1 = "
Serial.println(TCNT1,DEC);             // menampilkan nilai TCNT 1
delay(100);                            // jeda 100 milisecond
}



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 !
Nilai counter berubah saat switch di tekan. Karna saat switch di tekan pin 5 akan terhubung ke ground yang artinya pin 5 bernilai nol ( falling).

2.      Berapakah nilai maksimal counter jika input counter menggunakan pin T1 (Timer

1) ? Jelaskan kenapa !

  1. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.3 !
void setup()
{ Serial.begin(9600);             // Kecepatan transfer data serial
TCCR1A=0x00;                      // nilai timer1 register 1 A = 0
TCCR1B=0x06;               // nilai timer1 register 1B = hexadesimal 06 (falling)
TCNT1H=0xC2;               // Memasukan nilai timer1 register H hex=122(c2)
TCNT1L=0xF7;               // Memasukan timer1/counter register L hex=157
ICR1H=0x00;                // inisialisasi panjang pulsa di rgiste H
ICR1L=0x00;                // inisialisasi panjang pulsa di rgiste L
OCR1AH=0x00;               // Output compare register
OCR1AL=0x00;               // Output compare register
OCR1BH=0x00;               // Output compare register
OCR1BL=0x00;               // Output compare register
}

void loop() {

Serial.print("Nilai TCNT1 = ");               // menampilkan "Nilai TCNT1 = "
Serial.println(TCNT1,DEC);             // menampilkan nilai TCNT 1
delay(100);                            // jeda 100 milisecond
}



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() { Serial.begin(9600);
 TCCR1A=0x00;
 TCCR1B=0x07;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
\
}

void loop() {

Serial.print("Nilai TCNT1 = "); Serial.println(TCNT1,DEC); delay(100);
}



2.      Buka Serial Monitor pada Arduino IDE, kemudian tekan switch 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 !
Nilai counter berubah saat switch dilepas. Karna saat switch di lepas pin 5 yang terhubung ke ground yang artinya pin 5 bernilai nol berubah menjadi bernilai 1 (rising).

2.      Jelaskan perbedaan penggunaan counter mode falling edge dan mode rising edge !
Perbedaannya adalah Saat switch di tekan terjadi perubahan nilai input yang tadinya bernilai 1 berubah menjadi bernilai 0 (falling), dan Saat switch dilepas terjadi perubahan input dari 0 ke 1 (RISING).

3.      Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.4 !
void setup()
{ Serial.begin(9600);             // Kecepatan transfer data serial
TCCR1A=0x00;                      // nilai timer1 register 1 A = 0
TCCR1B=0x07;               // nilai timer1 register 1B = hexadesimal 07 (falling)
TCNT1H=0x00;               // Memasukan nilai timer1 register H hex=0
TCNT1L=0x00;               // Memasukan timer1/counter register L hex=0
ICR1H=0x00;                // inisialisasi panjang pulsa di rgiste H
ICR1L=0x00;                // inisialisasi panjang pulsa di rgiste L
OCR1AH=0x00;               // Output compare register
OCR1AL=0x00;               // Output compare register
OCR1BH=0x00;               // Output compare register
OCR1BL=0x00;               // Output compare register
}

void loop() {

Serial.print("Nilai TCNT1 = ");               // menampilkan "Nilai TCNT1 = "
Serial.println(TCNT1,DEC);             // menampilkan nilai TCNT 1
delay(100);                            // jeda 100 milisecond
}























< >