Hansen (13214077)
Deddy Welsan (13214148)
Dosen: Farkhad Ihsan Hariadi
EL3014 Sistem Mikroprosesor
Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
1. PENDAHULUAN
Tujuan dari tugas ini secara umum adalah
sebagai berikut.
a. Mahasiswa dapat memberikan input
output pada ATMega
Gambar 2.2 Konfigurasi Pin Port [1]
b. Mahasiswa dapat menggunakan fitur
timer/counter
c. Mahasiswa dapat menggunakan fitur
internal dan eksternal interrupt
Gambar 2.3 PUD pada SFIOR [1]
2. STUDI PUSTAKA
2.2REKOMENDASI UNTUK INISIALISASI PADA
2.1SKEMATIK I/O PIN INPUT
Jika beberapa pin tidak digunakan, sangat
dianjurkan untuk memastikan bahwa pin
tersebut mempunyai tingkat (nilai tegangan)
yang pasti. Bahkan walaupun sebagian besar
masukan digital dimatikan dalam deep sleep
modes, floating input harus dihindari untuk
mengurangi konsumsi arus di semua mode
lain dimana masukan digital diaktifkan
(Reset, Active mode dan Idle mode). [1]
Metode yang paling sederhana untuk
memastikan tingkat tegangan pada pin yang
tidak digunakan adalah dengan mengaktifkan
Gambar 2.1 Skematik I/O [1]
internal pull-up. Dalam kasus ini, pull-up akan
Semua register dan referensi bit pada bagian dinonaktifkan selama reset. Jika konsumsi
ini ditulis dalam bentuk umum. Huruf x daya yang rendah selama reset menjadi hal
merepresentasikan huruf penomoran untuk yang penting, maka dianjurkan untuk
port, dan huruf n merepresentasikan nomor menggunakan pull-up atau pull-down
bit. Ketika menggunakan register atau eksternal. Menghubungkan pin yang tidak
mendefinisikan bit dalam program, bentuk digunakan secara langsung ke Vcc atau GND
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 1
tidak disarankan, karena dapat menyebabkan Gambar 2.7 Compare Output Mode, Non-
arus berlebih jika secara tidak disengaja pin PWM Mode [1]
diatur sebagai keluaran. [1] CS02:0: Clock Select
Ketiga bit Clock Select menentukan sumber
yang digunakan oleh Timer/Counter. [1]
2.3KONFIGURASI TIMER/COUNTER DAN Gambar 2.8 Deskripsi Bit Clock Select [1]
INTERRUPT
Bit ini mengatur urutan perhitungan counter, Interupsi eksternal dapat dipicu oleh pin
sumber nilai maksimum (TOP), dan tipe INT0, INT1, dan INT2 baik dalam kondisi
waveform generation yang digunakan. falling atau rissing edge, serta low level
Gambar 2.2 menunjukan mode operasi yang (khusus INT2 tidak dapat dipicu oleh low
tersedia. [1] level). Pengaturan kondisi interupsi eksternal
ditentukan oleh spesifikasi pada MCUCR
(Multipoint Control Unit Control Register) dan
MCUCSR (Multipoint Control Unit Control and
Status Register).
Interpusi 2 akan aktif oleh pin INT2 pada Metode-metode untuk melakukan percobaan
GICR dan kontrol interupsinya akan kali ini adalah sebagai berikut.
ditentukan oleh nilai bit pada ISC2 di
MCUCSR. Jika nilai bit ISC2 bernilai nol, maka Jam Digital
interupsi 2 akan aktif saat pint INT2 berada di
falling edge. Sebaliknya jika bit ISC2 bernilai 1. Buat rangkaian jam digital sesuai dengan skematik pada gambar 4.1.
satu, maka interupsi 2 akan aktif saat INT2
berada di rising edge. [1]
2. Buat kode program dengan menggunakan bahasa C pada perangkat lunak Arduino
Gambar 2.17 GICR [1] 3. Hubungkan board Arduino Uno dengan PC menggunakan kabel usb a to b
4.3FLOWCHART
void init_int(void);
void Delay(int t);
void bcd(byte bil);
void init_ext_int(void);
boolean debounceButton(boolean state, int pin);
void setting(int var);
TIFR1 = (1<<TOV1);
TCNT1H = 0xC2;
TCNT1L = 0xF6;
}
if(select >= 4)
{
select = 0;
}
}
else if(debounceButton(buttonState1, 17) == LOW && buttonState1 ==
HIGH)
{
buttonState1 = LOW;
}
if(select == 3)
{
setting(m0);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
m0++;
buttonState2 = HIGH;
if(m1 >= 6)
{
m1 = 0;
}
}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}
else if(select == 1)
{
setting(j0);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
j0++;
buttonState2 = HIGH;
if(j1 < 2)
{
if(j0 >= 10)
{
j0 = 0;
}
}
else if(j1 = 2)
{
if(j0 >= 4)
{
j0 = 0;
}
}
}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}
else if(select == 0)
{
setting(j1);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
j1++;
buttonState2 = HIGH;
if(j1 >= 3)
{
j1 = 0;
}
}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}
statusSetting = digitalRead(16);
}
TIMSK1 = (1 << TOIE1);
}
//reset stopwatch
else if(mode == 1)
{
counterStopwatch = 0;
s3 = 0;
s2 = 0;
s1 = 0;
}
}
void setup() {
// put your setup code here, to run once:
// decoder
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
// 7 segment
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
// buzzer
pinMode(6, OUTPUT);
//button
pinMode(2, INPUT); // INT0
pinMode(3, INPUT); // INT1
pinMode(16, INPUT); // finish setting jam
pinMode(17, INPUT); // geser kursor
pinMode(18, INPUT); // tambah
// Input pull-up
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(16, HIGH);
digitalWrite(17, HIGH);
digitalWrite(18, HIGH);
init_int();
init_ext_int();
}
void loop() {
// put your main code here, to run repeatedly:
sei();
statusSetting = digitalRead(16);
if((mode == 0))
{
pJamMenit();
if(j1 == 0 && j0 == 6 && m1 ==0 && m0 == 0)
{
digitalWrite(6, HIGH);
}
else
{
digitalWrite(6, LOW);
}
}
else if((mode == 1))
{
pStopwatch();
}
void pJamMenit(void)
{
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
bcd(m0);
Delay(5);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
bcd(m1);
Delay(5);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
bcd(j0);
Delay(5);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
bcd(j1);
Delay(5);
}
void pStopwatch(void)
{
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
bcd(s0);
Delay(5);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
bcd(s1);
Delay(5);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
bcd(s2);
Delay(5);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
bcd(s3);
Delay(5);
}
void fStopwatch(void)
{
counterStopwatch++;
s0 = counterStopwatch % 10;
s1 = counterStopwatch / 10;
if (s1 >= 6)
{
s1 = 0;
}
if (counterStopwatch >= 60)
{
counterStopwatch = 0;
s2++;
if (s2 >= 10)
{
s2 = 0;
s3++;
if (s3 >= 6)
{
s3 = 0;
}
}
}
}
void fJamMenitDetik(void)
{
if (buzz == 1)
{
digitalWrite(6, LOW);
buzz = 0;
}
counterJam++;
d0 = counterJam % 10;
d1 = counterJam / 10;
if (d1 == 6)
{
d1 = 0;
}
if (counterJam >= 60)
{
counterJam = 0;
m0++;
if (m0 >= 10)
{
m0 = 0;
m1++;
if (m1 >= 6)
{
m1 = 0;
j0++;
if(j1 < 2)
{
if( j0 >= 10)
{
j0 = 0;
j1++;
}
}
else
{
if( j0 >= 4)
{
j0 = 0;
j1 = 0;
digitalWrite(6,HIGH);
buzz = 1;
}
}
}
}
}
}
A
= (D3 || !D2 || D1 || D0) && (D3 || D2 || D1 || !D0);
B
= (D3 || !D2 || D1 || !D0) && (D3 || !D2 || !D1 || D0);
C
= D3 || D2 || !D1 || D0;
D
= (D3 || !D2 || D1 || D0) && (D3 || D2 || D1 || !D0) && (D3 || !D2 || !
D1 || !D0);
E = (!D2 && !D1 && !D0) || (D1 && !D0);
F = (D3 || D2 || !D0) && (D3 || D2 || !D1) && (D3 || !D1 || !D0);
G = (D3 || D2 || D1) && (D3 || !D2 || !D1 || !D0);
digitalWrite(7, A);
digitalWrite(8, B);
digitalWrite(9, C);
digitalWrite(10, D);
digitalWrite(11, E);
digitalWrite(12, F);
digitalWrite(13, G);
}
void init_int(void)
{
TIMSK1 = 0b000000;
TIMSK1 = _BV(TOIE1); //mengaktifkan Overflow Interrupt
TCCR1A = 0;
TCCR1B = 0b00001101; //prescalar 1024
TCNT1 = 49910;
sei();
TCCR2A = 0x02;
TCCR2B = 0x07;
TIMSK2 |= (0<<TOIE2);
}
void Delay(int t)
{
TIMSK2 |= (1<<TOIE2);
TCNT2 = 0;
//meng-nol-kan flag
TIFR2 |= _BV(OCF2A);
void init_ext_int(void)
{
EICRA = 0x0A;
EIMSK = 0x03;
EIFR = 0x03;
}