TUGAS MANDIRI 1
TUGAS MANDIRI 1
SISTEM MIKROKONTROLER 2
ROTARY ENCODER
Jawaban Pertanyaan:
a. Pada percobaan kali ini input yang digunakan yaitu Rotary Encoder, dimana
terdapatsensor optik A dan B yang mendeteksi adanya cahaya(infrared) dari Led
dan mengubahnya menjadi pulsa. Sinyal pulsa inilah yang nantinya digunakan
untuk inputan kepada mikrokontroller sebagai pendeteksi apakan rotary encoder
bergerak CW atau CCW.
1
Kementrian Pendidikan dan Kebudayaan
Direktorat PEndidikan Tinggi dan Profesi
Politeknik Negeri Malang
2
Kementrian Pendidikan dan Kebudayaan
Direktorat Pendidikan Tinggi Vokasi dan Profesi
Politeknik Negeri Malang
Flowchart Percobaan A
START ISR
NO
PB0, PB1, PB2 sbg. Output
KANAN ?
PD2, PD6, PD7 sbg. Input
R-pullup PD2, PD6, PD7 YES
PB0 OFF : CW
PB1 OFF : SW
PB2 OFF : CCW
NO
SW ON ?
YES
TOGGLE PB1
3
Kementrian Pendidikan dan Kebudayaan
Direktorat PEndidikan Tinggi dan Profesi
Politeknik Negeri Malang
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void){
DDRD &= ~(1<<PD2) & ~(1<<PD6) & ~(1<<PD7);
PORTD |= (1<<PD2) | (1<<PD6) | (1<<PD7);
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2);
PORTB &= ~(1<<PB0) & ~(1<<PB1) & ~(1<<PB2);
GICR |= (1<<INT0);
MCUCR |= (1<<ISC01) | (1<<ISC00);
sei();
while (1) {
if((PIND & 0x80)==0){
PORTB ^= (1<<PB1);
while((PIND & 0x80)==0){}
}
}
}
ISR(INT0_vect){
if(PIND & 0x40){
PORTB |= (1<<PB0); PORTB &= ~(1<<PB2);
}
else{
PORTB |= (1<<PB2); PORTB &= ~(1<<PB0);
}
}
4
Kementrian Pendidikan dan Kebudayaan
Direktorat Pendidikan Tinggi Vokasi dan Profesi
Politeknik Negeri Malang
Flowchart Percobaan B
START
NO
KANAN ?
YES
5
Kementrian Pendidikan dan Kebudayaan
Direktorat PEndidikan Tinggi dan Profesi
Politeknik Negeri Malang
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void){
DDRD &= ~(1<<PD2) & ~(1<<PD6) & ~(1<<PD7);
PORTD |= (1<<PD2) | (1<<PD6) | (1<<PD7);
DDRA = 0xFF;
PORTA |= (1<<PA7);
GICR |= (1<<INT0);
MCUCR |= (1<<ISC01) | (1<<ISC00);
sei();
while (1) {
if((PIND & 0x80)==0){
PORTB ^= (1<<PB1);
while((PIND & 0x80)==0){}
}
}
}
int led[8]={0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
int i=0;
ISR(INT0_vect){
if((PIND & 0x40)==0){
i++;
PORTA=led[i];
if(i>7){
PORTA=0x01;
i=7;
}
}
else{
i--;
PORTA=led[i];
if(i<0){
PORTA=0x80;
i=0;
}
}
}