Twitter

MIKROKONTROLER TIMER DAN COUNTER

Author Unknown - -
Home » MIKROKONTROLER TIMER DAN COUNTER





LAPORAN
PRAKTIKUM 6
TIMER DAN COUNTER
NAMA:       MUHAMMAD RIZKI
NIM   :        3211301031



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;

unsigned int overflowCount = 0;

void setup() { Serial.begin(9600); pinMode(13, OUTPUT); TCCR1A = 0;
TCCR1B = 0; TCNT1 = 34286;
TCCR1B |= (1 << CS12);    // 256 prescaler TIMSK1 |= (1 << TOIE1);
sei(); }

ISR(TIMER1_OVF_vect) { TCNT1 = 34286; if(dataLed == 0) {
dataLed = 1; }
else {

dataLed = 0; }
digitalWrite(13, dataLed); overflowCount++;
}

void loop() {

Serial.print("Overflow count = "); Serial.println(overflowCount,DEC); delay(100);
}
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.25uS 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 selama program sedang bejalan sehingga tidak bisa diselingi oleh program              lainnya , sedangkan
ð  Timer overflow adalah penghitung atau pencacah sehingga selama menghitung dapat disiapkan beberapa        program.


3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.1 !
           

boolean dataLed = 0;       //menganalisa Variable bertipe bolean(1/0)            

unsigned int overflowCount = 0;   //pengisolasian over flow count bernilai 0

void setup() //defult program    
{            
Serial.begin(9600);        //kecepetan transfer data serial
pinMode(13, OUTPUT);       //pin 131 sebagai output
TCCR1A = 0;              //timer register 1a=0
TCCR1B = 0;              //timer register 1b=0
TCNT1 = 34286;           //set timer 1 counter value ke 34286
TCCR1B |= (1 << CS12);    // 256 prescaler
TIMSK1 |= (1 << TOIE1);   //timer counter interrupt mask register
sei(); }                 //global interupt

ISR(TIMER1_OVF_vect) {     //interrupt service roitin (ISR) untuk timer 1
 TCNT1 = 34286;            //set timer 1 counter initial value to 34286
if(dataLed == 0) {         //kondisi jika data LED=0
dataLed = 1; }          //meksekusi data LED=1
else {                   //jika tidak

dataLed = 0; }         //eksekusi data LED=0
digitalWrite(13, dataLed); //baca pin 13 dari variable data led
overflowCount++;         //nilai overFlowCount di tambah 1
}

void loop() {       

Serial.print("Overflow count = "); //serial menampilkan tulisan overflow Count
Serial.println(overflowCount,DEC); //menampilkan nilai dari variable overflow count
delay(100);        //delay selama 100 mili second
}


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 !
ð  Hal ini dapat dilakukan pada praktikum secara langsung

2. Jika dilakukan perhitungan dengan konfigurasi register pada sintaks program

Percobaan 6.2, timer 1 akan overflow setiap berapa milliseconds ?
ð  Timer 1 akan overflow setiap 60000 ms

3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.2 !
           
#include<LiquidCrystal.h> //mengambil library dari LCD
LiquidCrystal lcd(2,3,4,5,6,7); //menginilisasi pin pada LCD
unsigned int jam, menit, detik; //menginilisasi variable jam,menit,detik
boolean led = 0;           //variable LED bertipe bolean (0 atau 1)

ISR(TIMER1_OVF_vect) {     //interrupt service routin untuk timer 1
TCNT1H=0xC2;               //time value 1 H hex=122(c2)
TCNT1L=0xF7;          //time value 1L hex=157
detik++;             //looping tiap detik +1
if(detik>=60) {            //jika kondisi nilai detik >= 60
detik = 0;             //nilai output =0 (low)
menit++;               //menitnya bertambah 1
if(menit>=60) {        //jika kondisi nilai menit >= 60
menit = 0;           //nilai output menitnya = 0
jam++;               //jam bertambah 1
if(jam>=24 {          //jika jam >=24
jam = 0;           //maka nilai outputnya menjadi = 0
}
}
}
}

void initTimer1() { //fungsi penginisialisasi timer 1
TCCR1A=0x00;         //nilai timer regirter 1A = 0
TCCR1B=0x05;         // nilai timer register 1B=hexadecimal 05
TCNT1H=0xC2;         //nilai couter/timer 1H penghitung sampai c2 (122)/presceler
TCNT1L=0xF7;         //nilai counter 1L akam menghitung sampai F7 (157) /presceler
ICR1H=0x00;          //timer input capture register
ICR1L=0x00;          //timer output capture register
OCR1AH=0x00;        
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01;         //timer interrupt mask register(TIMSK)
sei();
}

void setup() {             //fungsi penginisialisasa keluaran
lcd.begin(16,2);           //set crsor LCD di mulai pada baris & kolom 16,2
lcd.clear();         //menghapus data LCDsebelumnya
initTimer1();        //penginisialisasi timer 1
}


void loop() {              //fungsi mengeksekusi program
lcd.clear();               //menghapus data pada LCD sebelumnya 
lcd.setCursor(0,0);        //set cursor pada LCD pada baris dan kolom 0,0
lcd.print("Jam Digital");       //menampilkan tulisan “jam Digital” pada LCD
lcd.setCursor(0,1);             //set cursor pada LCD pada baris dan kolom 0,1
lcd.print(jam,DEC);             //menampilkan tulisan pada layar lcd “JAM” dalam bentuk   bilangan decimal
lcd.print(":");  // menampilakan tanda “:” pada layar LCD setelah
                             tampilan “JAM” 
lcd.print(menit,DEC); // menampilkan tulisan pada layar lcd “Menit” dalam
bentuk bilangan decimal
lcd.print(":"); // menampilakan tanda “:” pada layar LCD setelah
tampilan “Menit”
lcd.print(detik,DEC); // menampilkan tulisan pada layar lcd “Detik” dalam
bentuk bilangan decimal
delay(500);  // Waktu jeda pause tiap looping yaitu 500 mS
}







6.3 Counter Mode Falling Edge

Pada percobaan kali ini akan dibuat program yang berfungsi untuk menghitung

jumlah penekanan switch pada input counter. Konfigurasi counter menggunakan mode

falling edge.

Prosedur :

1. Buatlah rangkaian seperti pada Gambar 6.3.




Gambar 6.3 Rangkaian Percobaan 6.3




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

program ke sistem minimum Arduino.

void setup() { Serial.begin(9600); TCCR1A=0x00; TCCR1B=0x06; 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);
}


3. Buka Serial Monitor pada Arduino IDE, kemudian tekan switch pushbutton dan

amati nilai TCNT1 yang ditampilkan pada Serial Monitor.

Tugas dan Pertanyaan :

1. Kapankah nilai counter (TCNT1) akan berubah ? Saat switch ditekan atau dilepas ?

Jelaskan !                     
ð  Nilai counter TCNT1 akan berubah pada saat kondisi push button dilepas kemudian ditekan. Hal ini              terjadi karena pada program ini yang digunakan adalah mode falling edge.

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

1)      ? Jelaskan kenapa !
(65535)
Karena Nilai counter ada pada Register TCNT1

3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.3 !
   
void setup() {     //fungsi ini untuk mengatur kondisa dalam posisi awal
                   //fungsi ini hanya jalan sekali
//fungsi setup () akan di panggil saat sintaks program akan di        //jalankan
Serial.begin(9600);      //kecepata transfer data
TCCR1A=0x00;       //register control timer 1 A
TCCR1B=0x06;       //timer control register 1 B byte = 00000110
TCNT1H=0x00;       //timer control register 1H, nilai byte 00
TCNT1L=0x00;       //timer control register 1L, nlai byte 00
ICR1H=0x00;        //input register capture1 dengan nilai = 16 byte
ICR1L=0x00;        //input register capture1 dengan nilai = 16 byte
OCR1AH=0x00;             // output capture register1 A High
OCR1AL=0x00;       //output capture register1 A Low
OCR1BH=0x00;       //output capture register1 B High
OCR1BL=0x00;       //output capture register1 B High
}

void loop() {              //fungsi untuk mengeksekusi program
                                               
Serial.print("Nilai TCNT1 = "); //Menampilakn tulisan di layar LCD “NilaiTCNT1=”
Serial.println(TCNT1,DEC);  //transfer data serial TCNT1 dalam bentuk bilangan                   decimal
delay(100);        //menunda selama 1 mS
}

6.4 Counter Mode Rising Edge

Pada percobaan kali ini akan dibuat program yang fungsinya sama dengan

Percobaan 6.3. Namun pada percobaan kali ini konfigurasi counter menggunakan mode

rising edge.

Prosedur :

1. Gantilah sintaks program pada Percobaan 6.5 dengan sintaks program 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 Pertanyaan :

  1. Kapankah nilai counter akan berubah ? Saat switch ditekan atau dilepas ? Jelaskan !
ð  Nilai counter TCNT1 akan berubah pada saat kondisi switch ditekan kemudian dilepas. Hal ini terjadi            karena pada program ini yang digunakan adalah mode rising edge.

2. Jelaskan perbedaan penggunaan counter mode falling edge dan mode rising edge !
ð  Mode falling edge adalah perubahan yang terjadi saat data atau nilainya berubah dari kondisi high ke low        ,sedangkan
ð  Mode rising edge adalah perubahan yang terjadi saat data atau nilainya berubah dari kondisi low ke high

3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.4 !
void setup() {
Serial.begin(9600); //kecepatan mentransfer data / baudrate
TCCR1A=0x00;       //register control timer 1 A
TCCR1B=0x07;       //timer control register 1 B byte = 0000 0110
TCNT1H=0x00;       //timer counter register 1 , nilai byte 00
TCNT1L=0x00;       //timer counter register 1 , nilai byte 00
ICR1H=0x00;        //input register capture1 dengan nilai = 16 byte
ICR1L=0x00;        //input register capture1 dengan nilai = 16 byte
OCR1AH=0x00;       // output capture register1 A High
OCR1AL=0x00;       //output capture register1 A Low
OCR1BH=0x00;       //output capture register1 B High
OCR1BL=0x00;       //output captire register1 B Low
}

void loop() {        //fungsi untuk mengeksekusi program

Serial.print("Nilai TCNT1 = "); //Menampilakn tulisan di layar LCD “Nilai TCNT1=”
Serial.println(TCNT1,DEC); //transfer data serial TCNT1 dalam bentuk  bilangan decimal
delay(100); //menunda selama 1 mS
}


Kesimpulan:
Pada praktikum kali ini kita dapat mengetahui bagaimana cara membuat program jam digital menggunakan arduino dantampilannya memeakai LCD, dan pada pembuatan program kita harus mengetahui maksud-maksud dan fungsi  dari  sintaks program tersebut

.