Monday, November 4, 2013

TIMER DAN COUNTER

PERCOBAAN :

6.1 Penggunaan Timer Ov erflow 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.


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.


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 !
Timer/Counter adalah hal yang hampir sama, Timer berarti Penghitung interval atau selang waktu sedangkan Counter adalah penghitung cacahan. Dalam penggunaannya dalam mikrokontroler perbedaan antara timer dan counter adalah pada penggunaan sumber clock nya. Timer/Counter berfungsi sebagai Timer jika sumber clock nya menggunakan internal clock  yaitu Kristal lalu akan berfungsi sebagai Counter jika sumber clock nya menggunakan external clock. Sedangkan delay yaitu fungsi yang digunakan untuk mengatur kecepatan pada program, fungsi ini biasanya digunakan programmer untuk mengatur kecepatan akurasi, namun fungsi ini tidak dapat dijalankan langsung pada codeblocks seperti layaknya pada Turbo C.


3.      Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.1 !
boolean dataLed = 0; // inisialisasi untuk menggunakan al jabar boolean

unsigned int overflowCount = 0; // menginilasisasi overflowcount bernilai 0
void setup() {// setting program pada awal

Serial.begin(9600);//kecepatan transfer data serial
pinMode(13, OUTPUT); //pin 13 sebagai output
TCCR1A = 0; // timer register 1 port A bernilai 0

TCCR1B = 0; // teimer register 1 prt B bernilai 0

TCNT1 = 34286; // Set timer 1counter initial valu to 34286
TCCR1B |= (1 << CS12);          // 256 prescaler
TIMSK1 |= (1 << TOIE1); // Timer/Counter Interrupt Mask Register 

sei();
}

ISR(TIMER1_OVF_vect) //interrupt untuk timer 1
{TCNT1 = 34286;
if(dataLed == 0) // jika led bernilai 0
{
dataLed = 1; //led bernilai 1
}
else {

dataLed = 0; led bernilai 0

}

digitalWrite(13, dataLed); //pin 13 sebagai dataled
 overflowCount++;

}

void loop() { // mengulang program yang dieksekusi

Serial.print("Overflow count = "); //mengirimkan data serial berupa “overflow count = “
Serial.println(overflowCount,DEC); /mengirimkan data overflowCount, DEC
delay(100); menunda selama 1 mS
}

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.


2.  Tuliskan sintaks program berikut ini, lakukan kompilasi dan upl oad 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() //memanggil fungsi timer
{ 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);
}


Pertanyaan

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

ISR(TIMER1_OVF_vect) //register untuk timer 1
{ TCNT1H=0xC2; //program memanggil timer/counter 1
TCNT1L=0xF7;  //program memanggil timer/counter 1
detik++;
if(detik>=60) {

detik = 0; menit++;if(menit>=60) {

menit = 0; jam++; if(jam>=24) {
jam = 0;

}

}
}
2         
}

void initTimer1() //memanggil fungsi timer1
{ 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 (kolom dan baris)
lcd.clear(); // menghapus tampilan lcd
initTimer1();//memanggil funsi timer 1
}

void loop()
{ lcd.clear(); //menghapus tampilan lcd
lcd.setCursor(0,0);//pada baris 1

lcd.print("Jam Digital"); //lcd menampilkan “Jam Digital” 
lcd.setCursor(0,1); //pada baris 2
lcd.print(jam,DEC); //lcd menampilkan “jam”
lcd.print(":"); //lcd menampilkan “ : “
lcd.print(menit,DEC); //lcd menampilkan “menit”
lcd.print(":"); //lcd menampilkan “ : “
lcd.print(detik,DEC); //lcd menampilkan “detik”
delay(500); ditunda selama 5mS
}

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.


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.


Pertanyaan :

1.     Kapankah nilai counter (TCNT1) akan berubah ? Saat switch ditekan atau dilepas ? Jelaskan ! nilai counter berubah pada saat ditekan push button . mencacah nilainya dari HIGH menuju LOW

3.                 2.  Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.3 !
void setup()
{ Serial.begin(9600); //kecepatan mentransfer data
TCCR1A=0x00; //register control timer 1 A
TCCR1B=0x06; //timer control register 1 B 0000 0110
TCNT1H=0x00; //timer counter register 1 dengan byte 00
TCNT1L=0x00; //timer counter register 1 dengan byte 00
ICR1H=0x00;  //input register capture1 16 byte
ICR1L=0x00; //input register capture1 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() { //program mengulang eksekusi program

Serial.print("Nilai TCNT1 = "); //menanfer data serial “Nilai TCNT1=”
Serial.println(TCNT1,DEC); //transfer data serial TCNT!
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. 

Pertanyaan

1.      Kapankah nilai counter akan berubah ? Saat switch ditekan atau dilepas ? Jelaskan !
nilai counter berubah pada saat ditekan push button . pada saat nilai nya LOW menuju HIGH

2.      Jelaskan perbedaan penggunaan counter mode falling edge dan mode rising edge !
Counter falling edge mencacah nilainya dari HIGH menuju LOW sementara rising edge mencacah dari HIGH menuju LOW

3.      Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.4 !
void setup()
{ Serial.begin(9600); //kecepatan mentransfer data
TCCR1A=0x00; //register control timer 1 A
TCCR1B=0x07; //timer control register 1 B 0000 0111
TCNT1H=0x00; //timer counter register 1 dengan byte 00
TCNT1L=0x00; //timer counter register 1 dengan byte 00
ICR1H=0x00;  //input register capture1 16 byte
ICR1L=0x00; //input register capture1 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() { //program mengulang eksekusi program

Serial.print("Nilai TCNT1 = "); //menanfer data serial “Nilai TCNT1=”
Serial.println(TCNT1,DEC); //transfer data serial TCNT!
delay(100);//menunda selama 1 mS
}



Terima Kasih


No comments:

Post a Comment