B. Timer/Counter
Timer bekerja dengan memberikan prescaling (pembagi
frekuensi) pada clock microcontroller atau clock eksternal.
Digunakan prescaling untuk mendapatkan frekuensi yang
diinginkan. Register yang digunakan untuk operasi
Timer/Counter pada AVR adalah TCNT, TCCR, TIMSK,
TIFR, dan OC. TCNT adalah register pencacah dari 0
Jenis-jenis Interrupt pada ATmega128
hingga nilai maksimum yang dapat ditentukan, TCCR
berfungsi untuk pengaturan mode operasi timer/counter,
TIMSK berfungsi untuk memilih timer/counter berapa yang
aktif, TIFR berfungsi untuk mengetahui adanya interupsi
akibat operasi counter timer, dan register OC untuk
menyimpan nilai pembanding dengan nilai pada register
TCNT.
C. Timer 0 Register
16-bit register Timer 0 diakses sebagai rendah dan
tinggi-byte. Low-byte register disebut TL0 (Timer 0 byte
rendah) dan high-byte register disebut TH0 (Timer 0 byte
tinggi). register ini dapat diakses seperti daftar lain.
Misalnya, instruksi MOV TL0, # 4H bergerak nilai ke
rendah byte dari timer 0.
D. Timer 1 Register
16-bit register Timer 1 diakses sebagai rendah dan
tinggi-byte. Low-byte register disebut TL1 (Timer 1 byte
rendah) dan high-byte register disebut TH1 (Timer 1 byte
tinggi). register ini dapat diakses seperti daftar lain.
Misalnya, instruksi MOV TL1, # 4H bergerak nilai ke
rendah byte dari Timer 1.
II. HASIL DAN ANALISIS
Tugas II.A.2
#include<mega8535.h>
void main ()
{
DDRB = 0xFF;
while (1)
{
Berikut ini hasil yang diperoleh dari percobaan, yang dapat
TCNT1 = 18660;
dilihat pada gambar dibawah ini: TCCR1B = 0b101;
while ((TIFR & 0b00000100) == 0);
TCCR1B = 0;
TIFR = 0b00000100;
PORTB = ~PORTB;
}
}
Flowchart dari program adalah sebagai berikut. Sama dengan sebelum, kita menghitung nilai OCN terlebih
dahulu. Berikut hasil perhitungannya :
𝑛 𝑥 16.000.000
𝑂𝐶𝑁 =
1024
3 𝑥 16.000.000
𝑂𝐶𝑁 =
1024
𝑂𝐶𝑁 = 46875
#include <mega8535.h>
#include <alcd.h>
#include <stdio.h>
char str[10];
void main()
{
DDRB.0 = 0;
DDRA=0xFF; => Kode program yang mengatur PORTB.0 = 1;
port A sebagai output dimana bit 0 sampai bit 7 lcd_init(16);
pada port A akan berperan sebagai output. lcd_clear();
PORTA = 0xF0; => mengatur pin output lcd_putsf("Counter 0= ");
bernilai 0. TCCR0 = 0b110;
TCNT1=3035; =>digunakan untuk menyimpan while(1)
{
nilai timer yang diinginkan dan dibagi menjadi 2
sprintf(str,"%i",TCNT0);
register 8 bit, yaitu: TCNT1H dan TCNT1L. lcd_gotoxy(10,0);
TCCR1B=0B101; =>fungsi register ini digunakan lcd_puts(str);
untuk pengaturan mode operasi Timer/Counter. }
Nilai register diatur sebagai 0B101. }
TIFR=0B00000100; =>Untuk mengetahui adanya
interupsi akibat operasi Counter Timer .
Flowchart dari program adalah sebagai berikut. Tugas II.B.2
#include <mega8535.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
char str[10];
void main()
{
unsigned int i;
DDRB.0 = 0;
PORTB.0 = 1;
DDRA = 0xFF;
lcd_init(16);
lcd_clear();
lcd_putsf("Counter 0 = ");
TCCR0 = 0b110;
Berikut ini hasil yang diperoleh dari percobaan, yang dapat while(1)
dilihat pada gambar dibawah ini: {
sprintf(str,"%i",TCNT0);
lcd_gotoxy(10,0);
lcd_puts(str);
i = TCNT0;
PORTA = 0xFF;
delay_ms (i*1000);
PORTA = 0x00;
delay_ms (i*1000);
}
}
#include <mega8535.h>
#include <alcd.h>
void main()
{
DDRD.2 = 0;
Hasil pada kit praktikum sesuai dengan desain kode DDRD.3 = 0;
program pada CV AVR. Pertama niali TCCR sebagai clock PORTD.2 = 1;
PORTD.3 = 1;
external.
GICR = 0b11000000;
TCCR0= 0b00000110; MCUCR = 0b00000000;
#asm("sei")
Kondisi diatas menunjukkan falling edge clock Nilai lcd_init(16);
lcd_clear();
TCNT0 dan OCR0 nilainya diatur.
lcd_putsf("Ext Interrupt");
TCNT0= 123; while(1);
}
OCR0=125; interrupt[2]void interupsi_ext0(void)
{
Nilai TCNT dan OCR selalu dibandingkan. Nilai
lcd_gotoxy(0,1);
TCNT akan selalu bertambah (+1) setiap penekanan push lcd_putsf("INT Ext 0");
botton sebanyak 1 kali. Nilai TCNT tidak boleh melebihi }
nilai OCR. Apabila melebihi maka kembali ke kondisi interrupt[3]void interupsi_ext1(void)
clear bit. Clock external adlah penekanan push button. {
lcd_gotoxy(0,1);
lcd_putsf("INT Ext 1");
}
Flowchart dari program adalah sebagai berikut. Pada program kita menambahkan i = TCNT0; dan delay
untuk mengatur waktu. PORTA = 0xFF ; delay_ms (
i*1000) ; bahwa lampu akan hidup selama i kali keypad
ditekan dikalikan dengan 1000 karena delay dalam satuan
ms. PORTA = 0x00 ; delay_ms ( i*100) ; bahwa lampu akan
mati selama i kali sebanyak keypad ditekan dan dikalikan
1000 karena delay dalam satuan ms. Jadi jika counter =1
maka LED akan menyala dan mati selama 1 detik. Jika
counter = 8 maka LED akan menyala dan mati selama 8
detik, begitu seterusnya.
C. External Interrupt
Tugas II.C.1
#include <mega8535.h>
#include <alcd.h>
#include <delay.h>
8 void init_ext_int ()
time ISR(int0_vect)
s {
unsigned char i = 0x01, n;
for(n=0;n<8;n++)
{
PORTA=i;
delay_ms(3000);
i = (i<<1)| (i>>7);
}
Berikut ini hasil yang diperoleh dari percobaan, yang dapat }
int main ()
dilihat pada gambar dibawah ini:
{
init_Ext_Int();
sei ();
DDRA = 0xFF;
while (1)
{
PORTA = 0b00000000;
delay_ms (3000);
PORTA = 0b11111111;
delay_ms (3000);
}
return 0;
}
void init_Ext_Int(void)
{
MCUCR = 0x02;
MCUCSR = 0x00;
GICR = 0x40;
GIFR = 0x40;
}
Flowchart dari program adalah sebagai berikut. Dari percobaan yang telah dilakukan maka dapat
disimpulkan bahwa hasil yang didapat sesuai harapan.
DDRD2 dan DDRD3 = 0 sehingga PORTD2 dan PORTD3
menjadi input. Untuk mengaktifkan port maka nilai di set
menjadi 1.. Hal ini terjadi karena prioritas utama pada
ATMega untuk external interrupt lebih tinggi dibandingkan
dengan timer interrupt.
Tugas II.C.2
III. SIMPULAN
Datasheet pada ATMega 8535 memuat
registerTimer/Counter 8 bit, konfigurasi mode
operasi, pengaturan sumber clock, dan register
untuk keperluanexternal interrupt.
Dalam mengimplementasikan aplikasi Timer/Cou
nter dan Interrupt pada AVR dapat
dilakukandengan mengubah nilai pada register
TCNT dan OCR.
Dalam mengimplementasikan aplikasi External
Interrupt pada AVR dilakukan dengan mengatur konfigurasi
pada register MCUCR, GICR, danGIFR.
Patterson, David, dan John Hennessy.
ComputerOrganization and Design: The
REFERENSI Hardware/Software Interface .2012. Waltham:
Elsevier Inc.
Lampiran
{
1. Tugas II.A.1 TCNT1 = 49910;
#include<mega8535.h> TCCR1B = 0b101;
void main () while ((TIFR & 0b00000100) == 0);
{ TCCR1B = 0;
DDRB = 0xFF; TIFR = 0b00000100;
while (1) PORTB = ~PORTB;
} lcd_clear();
} lcd_putsf("Counter 0 = ");
TCCR0 = 0b110;
2. Tugas II.A.2 while(1)
#include<mega8535.h> {
void main () sprintf(str,"%i",TCNT0);
{ lcd_gotoxy(10,0);
DDRB = 0xFF; lcd_puts(str);
while (1) i = TCNT0;
{ PORTA = 0xFF;
TCNT1 = 18660; delay_ms (i*1000);
TCCR1B = 0b101; PORTA = 0x00;
while ((TIFR & 0b00000100) == 0); delay_ms (i*1000);
TCCR1B = 0;
TIFR = 0b00000100; }
PORTB = ~PORTB; }
}
} #include <mega8535.h>
#include <alcd.h>
3. Tugas II.B.1 void main()
{
#include <mega8535.h>
DDRD.2 = 0;
#include <alcd.h> DDRD.3 = 0;
#include <stdio.h> PORTD.2 = 1;
char str[10]; PORTD.3 = 1;
void main() GICR = 0b11000000;
{ MCUCR = 0b00000000;
DDRB.0 = 0; #asm("sei")
PORTB.0 = 1; lcd_init(16);
lcd_init(16); lcd_clear();
lcd_putsf("Ext Interrupt");
lcd_clear();
while(1);
lcd_putsf("Counter 0= "); }
TCCR0 = 0b110; interrupt[2]void interupsi_ext0(void)
while(1) {
{ lcd_gotoxy(0,1);
sprintf(str,"%i",TCNT0); lcd_putsf("INT Ext 0");
lcd_gotoxy(10,0); }
lcd_puts(str); interrupt[3]void interupsi_ext1(void)
} {
lcd_gotoxy(0,1);
} lcd_putsf("INT Ext 1");
}
5. Tugas II.C.1
#include <mega8535.h>
#include <alcd.h>
4. Tugas II.B.2 #include <delay.h>
#include <mega8535.h> void init_ext_int ()
#include <alcd.h> ISR(int0_vect)
#include <stdio.h> {
#include <delay.h> unsigned char i = 0x01, n;
char str[10]; for(n=0;n<8;n++)
void main() {
{ PORTA=i;
unsigned int i; delay_ms(3000);
DDRB.0 = 0; i = (i<<1)| (i>>7);
PORTB.0 = 1; }
DDRA = 0xFF; }
lcd_init(16); int main ()
{ while(1);
init_Ext_Int(); }
sei (); interrupt[2]void interupsi_ext0(void)
DDRA = 0xFF; {
while (1) lcd_gotoxy(0,1);
{ lcd_putsf(“INT Ext 0”);
PORTA = 0b00000000; }
delay_ms (3000); Interrupt[3]void interupsi_ext1(void)
PORTA = 0b11111111; {
delay_ms (3000); lcd_gotoxy(0,1);
} lcd_putsf(“INT Ext 1”);
return 0; }
}
void init_Ext_Int(void)
{
MCUCR = 0x02;
MCUCSR = 0x00;
GICR = 0x40;
GIFR = 0x40;
}
6. Tugas II.C.2
#include <mega8535.h>
#include <alcd.h>
void main()
{
DDRD.2 = 0;
DDRD.3 = 0;
PORTD.2 = 1;
PORTD.3 = 1;
GICR = 0b11000000;
MCUCR = 0b00000000;
#asm(“sei”)
lcd_init(16);
lcd_clear();
lcd_putsf(“Ext Interrupt”);