detik untuk
baud rate 9600 dan
detik
untuk baud rate 2400. Kecepatan transmisi USART
yang digunakan (yang direpresentasikan pada bit
U2X) hanya mempengaruhi nilai UBRR yang
harus diset pada register UBRRH dan UBRRL. Jika
U2X bernilai 1 yang artinya double USART
transmission speed aktif, maka nilai UBRR yang
harus diassign menjadi lebih besar dibandingkan
dengan saat nilai U2X bernilai 0 (normal USART
transmission speed).
Pada program untuk percobaan 3, terlihat peng-
assign-an beberapa register,
Gambar 3.4 Register UCSRA
Gambar 3.5 Register UCSRB
Gambar 3.6 Register UCSRC
Gambar 3.7 Register UBRR
Terlihat peng-assign-an nilai,
Tabel 3.2 Peng-assign-an Register Percobaan 3.A.1
Register Nilai
UCSRA 0x00
UCSRB 0x10
UCSRC 0x86
UBRR
UBRRH -
UBRRL 0d51
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 6
Terlihat bahwa nilai register UCSRA diisi dengan
nilai 0x00 yang artinya, bit UDRE diset dengan
nilai 0 atau direset yang otomatis akan menge-set
lagi ke nilai 1 (nilai default) setelah direset. Jika bit
UDRE diset dengan nilai 1 maka register UDR
(transmit buffer) siap menerima data baru.
Kemudian, pada bit U2X diset denga nilai 0, yang
artinya jika program menggunakan mode
asinkron maka digunakan mode normal USART
transmission speed, sementara jika program
menggunakan mode sinkron, nilai bit ini harus
diset pada nilai 0.
Pada register UCSRB diset dengan nilai 0x10, yang
artinya nilai bit RXEN diset 1 sehingga USART
Receiver diaktifkan. Selain itu, nilai bit UCSZ2
diset dengan nilai 0 yang artinya ukuran data
karakter yang digunakan berkisar antara 5 sampai
8 bit.
Pada register UCSRC diset dengan nilai 0x86,
yang artinya nilai bit URSEL diset dengan nilai 1
atau dengan kata lain register UCSRC digunakan
sebagai register UCSRC (bukan UBRRH, karena
regsiter UCSRC dan UBRRH menggunakan satu
I/O yang sama) sehingga terlihat bahwa program
tidak melakukan peng-assign-an nilai pada
register UBRRH. Kemudian, nilai bit UMSEL diset
pada nilai 0 yang artinya program menggunakan
mode asinkron. Pengesetan nilai 0 pada bit
UMSEL dan nilai 0 pada bit U2X mengindikasikan
bahwa program menggunakan normal USART
transmission speed asynchronous mode. Terlihat
pula bahwa bit UPM1:0 keduanya diset dengan
nilai 0 yang artinya mode Parity dinonaktifkan.
Setelah itu, pada bit UCSZ1:0, keduanya diset
dengan nilai 1 yang jika dikombinasikan dengan
nilai bit UCSZ2 berarti bahwa data yang akan
diterima berukuran 8 bit. Bit USBS diset dengan
nilai 0 berarti bahwa stop bit yang digunakan
adalah 1 bit, sementara bit UCPOL diset dengan
nilai 0 dikarenakan program menggunakan mode
asinkron.
Baudrate yang digunakan direpresentasikan oleh
nilai yang diassign pada register UBRRH dan
UBRRL. Register UBRRH dinonaktifkan karena
register tersebut oleh program digunakan sebagai
register UCSRC (dengan melakukan peng-assign-
an nilai bit URSEL dengan nilai 1) sehingga baud
rate program ditentukan hanya oleh register
UBRRL. Terlihat bahwa nilai register UBRRL diset
dengan nilai 51, yang artinya baud rate yang
digunakan,
( )
Pada body main, terlihat bahwa digunakan
infinite loop (while(1)) yang artinya program
selalu siap menerima input untuk kemudian
diproses sehingga keluar output. Terlihat dalam
body while(1) terdapat perintah
loop_until_bit_is_set (UCSRA, 7) yang
artinya program akan menunggu sampai bit RXC
pada UCSRA bernilai 1 atau dengan kata lain
program akan memberitahukan bahwa register
UDR berisi data yang siap untuk dibaca.
Kemudian setelah itu, nilai PORTA akan di-assign
dengan nilai register UDR sehingga nyala LED
akan merepresentasikan isi dari regsiter UDR
pada saat itu. Karena input berupa ketikan pada
keyboard, maka data yang ditampilkan
merupakan representasi nilai ASCII dari karakter
pada keyboard.
Untuk Percobaan 3.A.2, dikarenakan hanya nilai
baud rate dan mode asinkron yang digunakan
adalah 2400 dan double USART transmission
speed asynchronous mode maka dilakukan
pengesetan register,
Tabel 3.3 Peng-assign-an Register Percobaan 3.A.2
Register Nilai
UCSRA 0x02
UCSRB 0x10
UCSRC 0x86
UBRR
UBRRH 0x01
UBRRL 0xA0
Terlihat bahwa register UCSRA diset dengan nilai
0x02 yang artinya bit U2X diset pada nilai 1
(double USART transmission speed enabled).
Kemudian, nilai UBRR diset,
()
Dikarenakan register UBRRL hanya dapat
menampung 8 LSB dari UBRR, maka digunakan
register UBRRH dengan terlebih dahulu mengeset
nilai bit URSEL dengan nilai 0, kemudian
mengeset nilai bit 0 pada register UBRRH dengan
nilai 1, sehingga keseluruhan nilai register UBRR
adalah 0x1A0.
4.2 Pengiriman Data dari PC
Tabel 3.4 Hasil Percobaan 3.B
Percobaan 3.B.1
Setiap tombol reset ditekan, muncul tulisan pada
layar Hyperterminal,
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 7
Praktikum Sistem Mikroprosesor
Percobaan 3.B.2
Setiap 6 detik, pada layar Hyperterminal muncul
nama,
M. Rifqi S.
Aji Suryo W.
M. Rifqi S.
Aji Suryo W.
M. Rifqi S.
Aji Suryo W.
6
s
6
s
6
s
.
.
.
START
UCSRA = 0x00
UCSRB = 0x08
UCSRC = 0x86
UBRRL = 0d51
kal[] = Praktikum Sistem Mikroprosesor
i = 0
is i EOL? END
wait until 5
th
bit of
UCSRA (UDRE bit) = 1
UDR = kal[i]
NO
YES
Gambar 3.8 Flowchart Percobaan 3.B.1
START
UCSRA = 0x00
UCSRB = 0x08
UCSRC = 0x86
UBRRL = 0d51
kal1[] = M. Rifqi S.
kal2[] = Aji Suryo W.
i = 0
is i EOL?
wait until 5
th
bit of
UCSRA (UDRE bit) = 1
UDR = kal1[i]
NO
Delay()
i = 0
YES
is i EOL?
wait until 5
th
bit of
UCSRA (UDRE bit) = 1
NO
UDR = kal2[i]
Delay()
i = 0
YES
Gambar 3.9 Flowchart Percobaan 3.B.2
Analisis:
Tabel 3.5 Peng-assign-an Register Percobaan 3.B.1 dan 3.B.2
Register Nilai
UCSRA 0x00
UCSRB 0x08
UCSRC 0x86
UBRR
UBRRH -
UBRRL 0d51
Terlihat bahwa register UCSRA di-assign dengan
nilai 0x00, penjelasan untuk hal tersebut sudah
ada pada analisis Percobaan 3.A.
Pada register UCSRB, di-assign dengan nilai 0x08.
Hal ini berarti bit TXEN diset dengan nilai 1, yang
berarti program mengaktifkan USART
Transmitter.
Pada register UCSRC diset nilai 0x86. Penjelasan
untuk nilai ini terdapat pada analisis Percobaan
3.A.
Karena pada percobaan ini nilai UBRR diset
dengan 0d51, maka baud rate yang digunakan
adalah,
( )
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 8
Kemudian, terlihat bahwa pada body main, tidak
terdapat infinite loop (while(1)) sehingga
program berjalan hanya satu kali untuk setiap run.
Oleh karena itu, diperlukan penekanan tombol
reset pada sismin agar program bisa berjalan
berulang kali. Terlihat pula bahwa terdapat peng-
assign-an sebuah string Praktikum
Mikroprosesor dalam suatu array of char
bernama kal. Selain itu, loop yang digunakan
pada program ini hanya satu yang cara kerjanya
adalah menuliskan char yang berada dalam array
of char kal ke Hyperterminal sampai kal berisi
end of line. Hal ini terlihat dari isi loop yaitu
ketika bit ke-5 dari UCSRA yaitu bit UDRE
bernilai 1 (register UDR siap untuk menerima data
baru), maka register UDR akan diisi nilai
representasi ASCII dari karakter yang terdapat
dalam array of char dari kal. Kemudian nilai
UDR tersebut akan dikirim ke Hyperterminal
untuk ditampilkan.
Untuk Percobaan 3.B.2, peng-assign-an nilai
register yang digunakan sama, hanya saja untuk
string yang digunakan ditambah satu sehingga
terdapat dua string yang akan ditampilkan pada
Hyperterminal, masing-masing adalah kal1 yaitu
M. Rifqi S. dan kal2 yaitu Aji Suryo W..
Pada percobaan ini, digunakan prosedur Delay()
seperti pada Percobaan 2. Selain itu, program
pada percobaan ini, digunakan infinite loop
while(1) sehingga program akan terus menerus
menuliskan array of char dari kal1 dan kal2
berselang-seling tiap 6 detik (waktu Delay())
sampai tak hingga kali.
4.3 Penerimaan dan Pengiriman Data dari dan ke
PC
Tabel 3.6 Hasil Percobaan 3.C.1
Karakter
yang
diketik
LED
Layar
Hyperterminal
a
a
q
q
c
c
Tabel 3.7 Hasil Percobaan 3.C.2
Karakter yang
diketik
LED
Layar
Hyperterminal
Normal Error Normal Error
a
a q
q
- q -
START
wait until 5
th
bit of
UCSRA (UDRE bit) =
1
UCSRA = 0x00
UCSRB = 0x98
UCSRC = 0x86
UBRRL = 0d51
is 3
rd
bit of UCSRA
(DOR bit) = 1?
YES
ISR
kar = UDR
PORTA = kar
wait until 5
th
bit of
UCSRA (UDRE bit) =
1
UDR = kar
RETI
NO
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 9
Gambar 3.10 Flowchart Percobaan 3.C.1
START
wait until 5
th
bit of
UCSRA (UDRE bit) =
1
UCSRA = 0x00
UCSRB = 0x98
UCSRC = 0x86
UBRRL = 0d06
is 3
rd
bit of UCSRA
(DOR bit) = 1?
YES
ISR
kar = UDR
PORTA = kar
wait until 5
th
bit of
UCSRA (UDRE bit) =
1
UDR = kar
RETI
NO
Gambar 3.11 Flowchart Percobaan 3.C.2
Analisis:
Tabel 3.8 Peng-assign-an Register Percobaan 3.C.1
Register Nilai
UCSRA 0x00
UCSRB 0x98
UCSRC 0x86
UBRR
UBRRH -
UBRRL 0d51
Terlihat untuk register UCSRA, UCSRC, dan
UBBRL nilaiyang di-assign sama dengan
Percobaan 3.A.1 sehingga penjelasannya sama.
Untuk register UCSRB di-assign dengan nilai 0x98,
artinya bit RXCIE diset dengan nilai 1. Pengesetan
bit ini dengan nilai 1 mengakibatkan
diaktifkannya RX Complete Interrupt, atau
interupsi yang disebabkan oleh adanya nilai yang
belum dibaca pada UDR sehingga Interrupt
Service Routine akan dijalankan. Kemudian dari
nilai yang diset pada register UCSRB ini, dapat
diketahui bahwa bit RXEN dan TXEN diset
dengan nilai 1, yang artinya USART Receiver dan
USART Transmitter diaktifkan.
Pada program, terlihat bahwa selain terdapat
main, terdapat juga ISR. Pada main, digunakan
infinite loop (while(1)) yang artinya program
akan terus menerus berjalan. Terlihat pula bahwa
pada body while(1) terdapat perintah
if_bit_is_set (UCSRA, 3) dan pada body
perintah tersebut, terdapat perintah
loop_until_bit_is_set (UCSRA, 5).
Perintah-perintah tersebut akan membuat tingkah
laku program seperti ini,
Pada prosedur ISR, terlihat bahwa program
menggunakan storage variable kar yang bertipe
unsigned char. Variabel ini akan menampung nilai
register UDR pada saat itu yang kemudian akan
di-assign-kan pada register PORTA sehingga LED
akan menyala sesuai dengan isi register UDR
(representasi ASCII dari input keyboard yang
ditekan). Setelah itu, program akan menunggu
hingga UDR kosong (siap menerima data baru)
yang kemudian diisi dengan nilai kar untuk
ditampilkan pada Hyperterminal.
Untuk Percobaan 3.C.2, terdapat error pada layar
Hyperterminal jika karakter tertentu ditekan pada
keyboard. Setelah diselidiki, ditemukan kaitan
antara keyboard yang ditekan dengan error yang
dikeluarkan. Hubungan error tersebut adalah
pada bit ke-4 dari representasi ASCII keyboard
yang ditekan (nyala LED bit ke-4). Jika bit ke-4
pada representasi ASCII dari keyboard yang
ditekan bernilai 0, maka error yang terjadi adalah
representasi karakter dari ASCII yang sebelumnya
dengan nilai bit ke-4-nya bernilai 1. Namun, jika
bit ke-4 dari representasi ASCII keyboard yang
ditekan sudah bernilai 1, maka tidak ada error
Ketika bit ke-3 UCSRA atau bit DOR bernilai 1,
maka Data Overrun terjadi. Data Overrun adalah
keadaan di mana register UDR penuh (berisi 2
data/karakter). Saat program mendeteksi
adanya DOR tersebut, maka program akan
menunggu hingga bit ke-5 UCSRA atau bit UDRE
bernilai 1. Saat bit UDRE bernilai 1 register UDR
akan dikosongkan sehingga siap untuk
menerima data baru.
Selama proses tersebut berjalan, jika user
mengirimkan input dari keyboard, maka bit RXC
akan mengeset dirinya dengan nilai 1 sehingga
interupsi terjadi. Kemudian, dikarenakan terjadi
interupsi, maka prosedur ISR dijalankan.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 1
0
yang muncul pada layar Hyperterminal. Sebagai
contoh, jika karakter a ditekan pada keyboard,
maka pada layar Hyperterminal dapat muncul
karakter q selain karakter a. Hal ini disebabkan
representasi ASCII karakter a adalah 0b01100001
sementara representasi ASCII dari karakter q
adalah 0b01110001. Sementara itu, jika karakter q
(0b01110001) ditekan pada keyboard, maka layar
Hyperterminal hanya akan menampilkan karakter
q. Error ini dikarenakan oleh nilai baud rate dan
frekuensi osilasi yang digunakan, yang dapat
dilihat dari,
( )
Dapat dilihat bahwa nilai baud rate yang
digunakan dengan baud rate yang sesungguhnya
memiliki error 7%,
(
)
Error ini merupakan nilai yang cukup besar jika
dilihat dari tabel berikut yang mana menyatakan
bahwa untuk data 8 bit (dengan parity bit menjadi
9 bit), maka toleransi error maksimal adalah
5%.
Tabel 3.9 Toleransi Error untuk Sistem Asinkron Mode Normal
4.3 Evaluasi Modul 1 Modul 3
Program yang dibuat baru bisa mencapai mode
Counter.
START
KEY1 and
KEY2 is set
IDLE
is Interrupted?
KEY1
YES
is KEY1 correct?
COUNTER
YES
is COUNTER = 5?
KEY2
YES
is KEY2 correct?
LED ON (1 s) then
OFF (1 s), twice
YES
NO
NO
LED ON (500 ms)
then OFF
LED[COUNTER] ON NO
NO
Gambar 3.12 Flowchart Percobaan 3.D
Analisis:
Terlihat bahwa terdapat dua buah keyword, yaitu
KEYWORD1 yang bernilai 0b00000011 dan
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 11
KEYWORD2 yang berupa karakter a. Kemudian
terlihat bahwa terdapat 4 mode yang masing-
masing diwakili oleh prosedur tertentu: Idle, Key1,
Counter, dan Key2. Program yang dibuat baru
mencapai mode Counter yang mana mode ini pun
belum sepenuhnya benar. Saat program mulai
memasuki infinite loop, maka mode Idle yang
aktif. Ketika program diberi Interrupt, maka ISR
dijalankan. Pada ISR dilakukan pengecekan, jika
mode berada dalam keadaan Idle, maka mode
akan memasuki mode Key1 yang mana akan
memberikan waktu 5 detik yang
direpresentasikan oleh nyala LED untuk
memasukkan keyword pertama. Sementara, jika
mode berada dalam kondisi selain Idle, maka ISR
tidak akan melakukan apa-apa (program akan
keluar dari ISR). Kemudian, jika input switch
benar untuk merepresentasikan keyword pertama,
maka program akan memasuki mode Counter.
Sementara jika keyword pertama yang
dimasukkan salah, maka program akan memasuki
mode Idle kembali.
5. KESIMPULAN
Dari percobaan dapat disimpulkan bahwa:
a. Untuk mengetahui apa saja yang terdapat
dan disediakan oleh ATMega 8535,
digunakan datasheet dari ATMega 8535,
termasuk di dalamnya tentang PORT, PIN,
clock, interrupt, timer/counter, komunikasi
serial USART, dan register-register yang
digunakan untuk mengeset hal-hal tersebut.
b. Untuk membuat aplikasi komunikasi USART,
digunakan register: UDR; UCSRA; UCSRB;
UCSRC; UBRRH; UBRRL.
6. DAFTAR PUSTAKA
[1] Hutabarat, Mervin T., Waskita Adijarto, dan
Harry Septanto, Praktikum Sistem Mikroprosesor,
Sekolah Teknik Elektro dan Informatika
Institut Teknologi Bandung, Bandung, 2013
[2] ATMega8535 Datasheet from www.atmel.com
[3] http://id.wikipedia.org/wiki/ATMega8535
[4] www.duniaelektronika.net
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 12
7. LAMPIRAN
//=========================================================================================================
//Tugas 3A1
//=========================================================================================================
#include <avr/io.h>
int main (void)
{
// tentukan nilai baudrate yang sesuai dengan inisialisasi ini
UCSRA = 0x00;
UCSRB = 0x10; // RXEN set.
UCSRC = 0x86; // uCSRC = 0b 1000 0110, URSEL, UCSZ1, UCSZ0 set.
UBRRL = 51; // f = 8MHz, baud=9600bps, U2X=0
while (1)
{
loop_until_bit_is_set(UCSRA, 7);
PORTA = UDR;
UCSRA |= _BV(7);
}
return 0;
}
//=========================================================================================================
//=========================================================================================================
//Tugas 3A2
//=========================================================================================================
#include <avr/io.h>
int main (void)
{
// tentukan nilai baudrate yang sesuai dengan inisialisasi ini
UCSRA = 0x02;
UCSRB = 0x10; // RXEN set.
UCSRC = 0x86; // UCSRC = 0b 1000 0110, URSEL, UCSZ1, UCSZ0 set.
UBRRL = 0xA0;
UBRRH = 0x01; // f = 8MHz, baud=2400bps, U2X=1
while (1)
{
loop_until_bit_is_set(UCSRA, 7);
PORTA = UDR;
UCSRA |= _BV(7);
}
return 0;
}
//=========================================================================================================
//=========================================================================================================
//Tugas 3B1
//=========================================================================================================
#include<avr/io.h>
int main (void)
{
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRL=51;
char kal[]=" Praktikum Sistem Mikroprosesor ";
unsigned char i=0;
for (i=0;kal[i]!='\0';++i)
{
loop_until_bit_is_set(UCSRA,5);
UDR=kal[i];
}
return 0;
}
//=========================================================================================================
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 13
//=========================================================================================================
//Tugas 3B2
//=========================================================================================================
#include<avr/io.h>
void init_tim(void);
void Delay(void);
int main (void)
{
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRL=51;
init_tim();
char kal1[]=" M. Rifqi S. ";
char kal2[]=" Aji Suryo W. ";
unsigned char i=0;
while(1)
{
for (i=0;kal1[i]!='\0';++i)
{
loop_until_bit_is_set(UCSRA,5);
UDR=kal1[i];
}
Delay();
for (i=0;kal2[i]!='\0';++i)
{
loop_until_bit_is_set(UCSRA,5);
UDR=kal2[i];
}
Delay();
}
return 0;
}
void init_tim(void)
{
//mode operasi CTC, sumber clock prescaller 1024
TCCR1A=0;
TCCR1B=0b00001101;
//overflow interrupt disable
TIMSK|=(0<<TOIE1);
}
void Delay(void)
{
//overflow interrupt enable
TIMSK|=_BV(TOIE1); //(1<<TOIE1);
//penentuan nilai awal timer
TCNT1H=0;
TCNT1L=0;
//penentuan nilai compare untuk delay 6 = 23 mod 9 + 1 detik
OCR1AH=0xB7; //0xB71B = 6 * 8 000 000 / 1024 in HEX
OCR1AL=0x1B;
//menunggu hingga compare match, nilai TCNT1=OCR1A
loop_until_bit_is_set(TIFR,OCF1A);
//meng-nol-kan flag
TIFR|=_BV(OCF1A);
//overflow interrupt disable
TIMSK|=_BV(TOIE1);
}
//=========================================================================================================
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 14
//=========================================================================================================
//Tugas 3C1
//=========================================================================================================
#include<avr/io.h>
#include<avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>
ISR(USART_RX_vect)
{
unsigned char kar;
kar = UDR;
PORTA = kar;
loop_until_bit_is_set(UCSRA,5);
UDR = kar;
}
int main (void)
{
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0;
UBRRL=51;
sei();
while(1)
{
if bit_is_set(UCSRA,3)
{
loop_until_bit_is_set(UCSRA,5);
}
}
return 0;
}
//=========================================================================================================
//=========================================================================================================
//Tugas 3C2
//=========================================================================================================
#include<avr/io.h>
#include<avr/interrupt.h>
#define F_CPU 1000000UL
#include <util/delay.h>
ISR(USART_RX_vect)
{
unsigned char kar;
kar = UDR;
PORTA = kar;
loop_until_bit_is_set(UCSRA,5);
UDR = kar;
}
int main (void)
{
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0;
UBRRL=6;
sei();
while(1)
{
if bit_is_set(UCSRA,3)
{
loop_until_bit_is_set(UCSRA,5);
}
}
return 0;
}
//=========================================================================================================
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 15
//=========================================================================================================
//Tugas 3D
//=========================================================================================================
#include<avr/io.h>
#define F_CPU 8000000UL // 8MHz
#include <util/delay.h>
#include <avr/interrupt.h>
#define KEYWORD1 0b00000011
#define KEYWORD2 'a'
void init_tim(void);
void init_ext_int(void);
void Idle(void);
void Key1(void);
void Counter(void);
void Key2(void);
int Mode;
ISR(INT0_vect)
{
if (Mode == 1)
{
Mode = 2;
}
}
int main (void)
{
init_tim();
init_ext_int();
sei();
DDRA=0xFF;
Mode = 1; // 1 Idle, 2 Key1, 3 Counter, 4 Key2
while(1)
{
if (Mode == 1)
{
Idle();
}
else if (Mode == 2)
{
Key1();
}
else if (Mode == 3)
{
Counter();
}
//else if (Mode == 4)
//{
// Key2();
//}
}
return 0;
}
void init_ext_int(void)
{
MCUCR=0x02;
MCUCSR=0x00;
GICR=0x40;
GIFR=0x40;
}
void init_tim(void)
{
TCCR0=0b00000110; // mode operasi dan sumber clock
TIMSK=(0<<OCIE0); //overflow interrupt disable
}
//Continue below
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 16
// Mode Idle, led berjalan kiri-kanan
void Idle(void)
{
int n;
int x;
int i;
i = 0xFE;
for(n=0;n<7;n++)
{
PORTA=i;
_delay_ms(120);
i = (i<<1) | (i>>7);
}
for(n=0;n<7;n++)
{
PORTA=i;
_delay_ms(120);
i = (i>>1) | (i<<7);
}
}
// Mode Key1, 5 detik dan mengecek switch
void Key1(void)
{
int n;
int x;
int i;
_delay_ms(1000);
i = 0x01;
for(n=0;n<5;n++)
{
PORTA=i;
_delay_ms(1000);
i = (i<<1);
}
if (PINB == KEYWORD1)
{
PORTA=0xFF;
_delay_ms(500);
PORTA=0x00;
Mode = 3;
}
else
Mode = 1;
}
// Mode Counter, Counter dengan input external
void Counter(void)
{
int n;
int x;
int i;
TCNT0=123; //penentuan nilai awal timer
OCR0=127; //penentuan nilai compare
while (bit_is_clear(TIFR,OCF0));
//menanti compare match
{
x=TCNT0;
PORTA=(1 << x);
}
TIFR|=_BV(OCF0); //mengnolkan flag
Mode = 4;
PORTA=0x00;
_delay_ms(2000);
}
// Continue below
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 17
// Mode Key2, 5 detik dan mengecek hyperterminal
void Key2(void)
{
int n;
int x;
int i;
_delay_ms(1000);
i = 0x01;
for(n=0;n<5;n++)
{
PORTA=i;
_delay_ms(1000);
i = (i<<1)
}
if (UDR) // cek hyperterminal
{
for(n=0;n<2;n++)
{
PORTA=0xFF;
_delay_ms(1000);
PORTA=0x00;
_delay_ms(1000);
Mode = 1;
}
}
else
Mode = 1;
}
//=========================================================================================================
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 18
//=========================================================================================================
//Tugas 2D1
//=========================================================================================================
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
void Init_Ext_Int(void);
ISR(INT0_vect)
{
unsigned char i=0x01,n;
for(n=0;n<8;++n)
{
PORTA = i;
_delay_ms(250);
i=(i<<1)|(i>>7);
}
}
int main(void)
{
Init_Ext_Int();
sei();
DDRA=0xFF;
while (1)
{
PORTA = 0b10101010;
_delay_ms(500);
PORTA = 0b01010101;
_delay_ms(500);
}
return 0;
}
void Init_Ext_Int(void)
{
MCUCR=0x02;
MCUCSR=0x00;
GICR=0x40;
GIFR=0x40;
}
//=========================================================================================================