I/O DASAR
Pre-processing
Main Program
Set DDRA to
0xFF (PORTA
as output) and
set PORTA to
0xFF (initially
turns every
LED ON)
Loop
Set PORTA to
0b00110011
(as seen on
Gambar 1.4) for
1B1 or
0b00111010
(as seen on
Gambar 1.5) for
1B2
Insert 500 ms
delays
Make variable i
(unsigned char)
Set DDRA to
then set it to 0xFF (PORTA
as output) and
0xFE set PORTA to i
(0xFE)
Set integer
counter variable
k
Set DDRA to
0xFF (PORTA Main Loop
as output) and
set PORTA to i
(0xFE) First loop
Loop
Re-set PORTA
to i
Second loop
Set i to
(i >> 1) | (i << 7)
Analisis:
Dari library yang digunakan, terlihat bahwa
program menggunakan/mengakses library delay.
Selain itu, program juga menggunakan nilai clock 1
MHz. Terlihat pula bahwa PORTA dijadikan sebagai
output yang terlihat pada pengassignan DDRA pada
0xFF. Kemudian pada body program, terdapat tiga
kali pengassignan nilai PORTA yang mana untuk
kedua pengassignan PORTA diikuti dengan
perintah,
delay_ms(500);
Kodingan ini berarti bahwa untuk pengassignan Perintah ini merupakan perilaku yang akan LED-
pertama PORTA, PORTA akan aktif semua (LED LED nanti tampilkan yang dideskripsikan sebagai
menyala semua) sebelum memasuki loop. Kemudian berikut.
pada pengassignan PORTA yang terdapat pada loop
Pertama, i diassign nilai 0xFE atau 0b11111110,
while(1) terdapat pengesetan nilai delay yang
kemudian i ini akan memasuki loop yang diakhir
sesuai dengan perintah yang dituliskan sebelumnya.
loop akan diupdate dengan nilai i yang baru yaitu,
Delay yang digunakan adalah 500 ms. Sehingga jika
hasilnya sesuai dengan kodingan, maka LED akan
berkedip dengan selang 500 ms yang mana LED ( )
akan berkedip-kedip bergantian dari LED0, LED1,
LED4, dan LED5 menyala dan yang lain mati ke ( )
LED2, LED3, LED6, dan LED7 menyala dan yang ( )( )
lain mati. Kemudian, untuk perintah while(1)
merupakan perintah untuk melakukan loop tak-
dengan simbol | (or) merepresentasikan
hingga kali tanpa syarat tertentu untuk keluar dari
penjumlahan dalam domain biner. Nilai i ini akan
loop tersebut.
selalu diupdate oleh loop yang jika diteruskan maka
Untuk percobaan selanjutnya (1B2), dengan nilai bit 0 dalam nilai i seolah-olah akan berjalan ke
penjelasan yang sama, diperoleh LED berkedip kiri kemudian ketika nilai bit 0 ini mencapai bit ke-7,
dengan selang 500 ms yang mana LED akan maka otomatis bit 0 ini akan memosisikan diri pada
berkedip-kedip bergantian dari LED1, LED3, LED4, bit ke-0 yang kemudian akan berjalan ke kiri lagi,
dan LED5 menyala dan yang lain mati ke LED0, demikian nilai i ini dalam loop sehingga, LED (yang
LED1, LED3, LED4, dan LED5 menyala dan yang mati) akan terlihat seolah-olah berjalan dari kiri ke
lain mati. Nilai LED yang berkedip tersebut kanan kemudian langsung ke paling kiri setelah LED
merepresentasikan nilai biner dari tiga digit terakhir yang mati ini mencapai paling kanan (terlihat seperti
NIM kami yaitu 05810 dan 05910. memutar).
Percobaan berikutnya (1B3) menggunakan clock 8 Percobaan terakhir dari bagian B ini (1B4) adalah
MHz. Nilai clock ini diperoleh dengan menggunakan memodifikasi percobaan sebelumnya (1B3) sehingga
sumber clock eksternal yaitu kristal. Pengaksesan LED yang mati tadi akan melakukan bouncing back
sumber clock eksternal ini dilakukan dengan setelah mencapai bagian paling ujung (paling kiri
mengetikkan perintah, atau paling kanan). Pada percobaan ini, dalam loop
avrdude –c ponyser –p atmega8535 –P com1 –U utama terdapat 2 loop lain yang mana untuk loop
hfuse:w:0xD9:m –U lfuse:w:0xEF:m pertama menangani kasus ketika LED mati berjalan
pada command prompt MS Windows sebelum dari paling kiri ke paling kanan dan loop kedua
melakukan kodingan dan pendownloadan kodingan menangani kasus ketika LED mati berjalan dari
ke sismin. paling kanan ke paling kiri. Kedua loop ini
menggunakan counter integer k. Dari kombinasi
Pada percobaan ini, juga digunakan fasilitas delay kedua loop ini dalam loop utama while(1)
yang terlihat dari library yang digunakan diperoleh perilaku LED mati berjalan yang dimulai
(#include <util/delay.h>). Terlihat dalam dari paling kiri (LED0) ke paling kanan (LED7)
body program bahwa sebelum program memasuki kemudian bouncing back ke kiri dari paling kanan
loop, maka dibuat variabel unsigned char i yang (LED7) ke paling kiri (LED0) kemudian bouncing
diassign nilai 0b11111110 atau 0xFE. Setelah itu, back lagi ke kanan dan begitu seterusnya. Berikut
PORTA diset sebagai output dengan mengassign penjelasan untuk loop kedua dalam loop utama,
nilai 0xFF ke dalam DDRA. Kemudian nilai i ini
diassign ke dalam PORTA yang artinya, LED akan
menyala semua kecuali LED0. Berikutnya, dalam ( )
body loop dengan loop tak-hingga, dilakukan
( )
pengassignan PORTA dengan i sekali lagi yang
bertujuan agar nilai PORTA selalu terisi dengan nilai ( )( )
i yang baru. Lalu, digunakan delay sebesar 120 ms
untuk setiap perubahan nyala LED. Terakhir, diset Nilai bit 1 merepresentasikan LED menyala,
nilai i dengan perintah, sementara bit 0 merepresentasikan LED mati.
i=(i<<1)|(i>>7); Sehingga seolah-olah LED mati terlihat berjalan.
C. PORTA sebagai Output dan PORTD sebagai
Input
Pre-processing
Main Program
Make variable i
(unsigned char)
as storage
variable
Set DDRA to
0xFF (PORTA
as output) and
set DDRD to
0x00 (PORTD
as input, PIND)
Analisis:
Activate pull-up
internal resistor Disini DDRA digunakan sebagai output yg mengassign
and set PORTA nilai 0xFF hal ini juga terlihat dari program yang
to 0xFF
digunakan sementara DDRD diset sebagai input dengan
mengassign nilai 0x00 sehingga PORTDn akan dijadikan
Main Loop sebagai pin input. Pada body program, digunakan variabel
i yang bertipe unsigned char sebagai pengeset supaya
output akan sesuai dengan input.
Read PIND
value then store Pada body loop dapat dilihat bahwa nilai i diassign dengan
it to i
nilai PIND atau dengan kata lain, i menyimpan nilai PIND
yang kemudian nilai PIND yang telah disimpan pada
LEDn will light up for every active (ON) SWITCHn variabel i, oleh variabel i nilai PIND ini diassign ke dalam
as seen on Gambar 1.8
PORTA sehingga nilai PORTA nantinya akan sesuai
dengan nilai PIND sehingga apa yang ditampilkan oleh
PORTA takes i
value to its
LED akan sama dengan apa yang dimasukkan oleh switch
value input yang mana jika LED pada switch input menyala
artinya switch berada pada kondisi ON.
Flowchart 1.5 Percobaan 1C1 Percobaan selanjutnya (1C2), adalah memodifikasi
percoban sebelumnya (1C1) sehingga output akan
menghasilkan output dari percobaan 1B2 jika input switch
berada dalam keadaan NIM 05310 atau 0b00101011,
menghasilkan output dari percobaan 1B4 jika input switch
berada dalam keadaan 04510 atau 0b00101101, dan
menghasilkan output 1A2 untuk keadaan input selain
keadaan di atas.
Dapat dilihat dari kodingan yang digunakan bahwa
dilakukan pengubahan pada body program terutama pada
body loop. Digunakan variabel a sebagai penympan nilai
dari PIND untuk kemudian dibandingkan dengan nilai
seperti yang diminta spesifikasi. Untuk memenuhi ketiga
spesifikasi yang diminta, maka digunakan pula perintah
kondisional if yang mana jika nilai variabel a (yang berisi
PIND) sama dengan 0b00101011 (05310) maka output
LED akan bertingkah seperti percobaan 1B2 (berkedip
dengan representasi tiga digit terakhir NIM anggota
kelompok), sementara jika nilai variabel a (yang berisi
PIND) sama dengan 0b00101101 (04510) maka LED akan
bertingkah seperti percobaan 1B4 (berjalan dengan mode
bouncing back di setiap ujung), dan jika nilai variabel a
tidak sama dengan kondisi tersebut di atas, maka LED
akan bertingkah seperti percobaan 1A2 (menyala dengan
representasi nomor kelompok). Nilai PIND (8 bit biner)
merupakan representasi dari input switch yang mana jika
switch tertentu aktif (ON, yang mana terlihat dari LED
pada switch menyala) maka bit yang mewakili switch
tersebut bernilai 1. Contohnya, jika SW0, SW1, SW3,
SW4, dan SW5 ON, maka nilai PIND adalah 0b00101101
yang artinya keadaan ini memasuki kondisi 2. Nilai PIND
ini kemudian akan disimpan dalam variabel a untuk
kemudian nilai variabel a ini akan dibandingkan dalam
body loop sehingga diperoleh kondisi 2 dalam spesifikasi.
Output yang diperoleh dari kondisi ini adalah sama dengan
output yang diperoleh pada percobaan 1B4 (LED mati
berjalan dari kiri ke kanan kemudian saat mencapai ujung
bouncing back dan berjalan ke arah sebaliknya).
IV. KESIMPULAN
Output pada ATMega 8535 dapat diset dengan
cara mengeset nilai register yang berkaitan
dengan output tersebut dengan nilai hex 0xFF.
Untuk mengeset fuse bit, digunakan perintah:
avrdude –c ponyser –p atmega8535 –P com1 –U
hfuse:w:0xD9:m –U lfuse:w:0xEF:m
pada command prompt yang terdapat pada MS
Windows.
Dapat dilihat, untuk menggunakan clock dari
sumber eksternal, nilai low-fuse bitnya saja yang
diganti, yaitu dari yang bernilai 0xE1 atau
0b11100001 yang berarti masih menggunakan
clock internal menjadi 0xEF atau 0x11101111
yang berarti sudah menggunakan clock eksternal.
Untuk mengeset PORTx sebagai input, maka
nilai DDRx harus diset dengan 0
REFERENSI
TUGAS I.A.2
#include <mega8535.h>
void main()
{
DDRA = 0xFF;// inisialisasi Port
asebagai output
PORTA = 0b00001001;// nilai output
}
TUGAS I.B.2
#include <mega8535.h>
#define F_CPU 1000000UL
#include <delay.h>
void main()
{
DDRA = 0xFF;
PORTA = 0xFF;
while (1)
{
PORTA = 0b00110011;
delay_ms(1000);
PORTA = 0b11001100;
delay_ms(1000); }
}
TUGAS I.B.1
#include <mega8535.h>
#define F_CPU 1000000UL
#include <delay.h>
void main()
TUGAS I.B.4
# include <mega8535.h>
# define F_CPU 8000000UL
# include <delay.h>
void main()
{
TUGAS I.B.3 unsigned char i = 0xFE;
# include <mega8535.h> DDRA = 0xFF;
# define F_CPU 8000000UL
# include <delay.h> while (1)
void main() {
{ while (i != 0b01111111)
unsigned char i = 0xFE; {
DDRA = 0xFF; PORTA = i;
delay_ms (120);
PORTA = i; i = (i<<1) | (i>>7); }
while (1) while (i != 0b11111110)
{ {
PORTA = i; PORTA = i;
delay_ms (120); delay_ms (120);
i = (i<<1) | (i>>7); } i = (i>>1) | (i<<7); }
while (i != 0b01111110) }
{ }
PORTA = i;
delay_ms (120);
i = (i>>1) | (i<<7); }
}
TUGAS I.C.2
# include <mega8535.h>
void main()
{
unsigned char i;
DDRA = 0xFF;
DDRD = 0x00;
TUGAS I.C.1 SFIOR = 0<<PUD;
# include <mega8535.h> PORTA = 0xFF;
void main() while (1)
{ {
unsigned char i; i = PIND;
DDRA = 0xFF; PORTA = i;}
DDRD = 0x00; }
SFIOR = 0<<PUD;
PORTA = 0xFF;
while (1)
{
i = PIND;
PORTA = i;}
}