Did you know that you can navigate the posts by swiping left and right?
어제 스위치를 이용해 비밀번호를 입력하여 lcd에 나타내도록 하는 코드를 만들었고 이제 입력이 완료되면 모터가 90도를 돌아 잠겼던 걸 풀도록 조절하는 코드를 만들어보았다. check문에서 correct가 나오고 다음으로 motor-on문으로가 motor가 도는 코드를 만들었는데 인터럽트 함수를 이용해서 모터의 각도를 조절하였다. 각도 조절하는 코드는 전에 배운 타이머, 서보모터 부문의 코드에서 얻어와 조금 변형하여 만들었다. 그 후에 motor-off문으로 가서 모터가 자동으로 꺼지게끔 하였고 따로 스위치 4번버튼을 납땜하여 reset()함수를 만들어서 다시 원래의 각도로 돌아와 잠금 해제를 하도록 하였다. 코드를 적어보면.
#include <mega128.h>
#include <delay.h>
#include <alcd.h>
#define Switch_1 (!PINE.4)
#define Switch_2 (!PINE.5)
#define Switch_3 (!PINE.6)
#define Switch_4 (!PINE.7)
#define Motor_off TCCR0 = 0x00;
unsigned char number = 1;
unsigned char x = 0;
unsigned char y = 1;
unsigned char record = 0b00000000;
unsigned char record2 = 0b00001111;
unsigned int tim0_cnt, mot_pos, change;
unsigned int rc_time[2] = {54, 155};
void reset(void)
{
tim0_cnt = 0;
mot_pos = 0;
change = 0;
TIMSK = 0x01;
TCCR0 = 0x02;
TCNT0 = 238;
SREG = 0x80;
tim0_cnt = 0;
PORTC = 0xFF;
while(1)
{
if(tim0_cnt >= 2000)
{
tim0_cnt = 0;
PORTC = 0xFF;
change++;
if(change == 100)
{
change = 0;
Motor_off;
}
}
if(tim0_cnt >= rc_time[1]) PORTC = 0x0;
}
}
void motor_off(void)
{
Motor_off;
TIMSK = 0x00;
PORTC = 0x00;
mot_pos++;
while(1)
{
if(Switch_4)
{
reset();
}
}
}
void motor_on(void)
{
tim0_cnt = 0;
change = 0;
TIMSK = 0x01;
TCCR0 = 0x02;
TCNT0 = 238;
SREG = 0x80;
tim0_cnt = 0;
PORTC = 0xFF;
while(1)
{
if(tim0_cnt >= 2000)
{
tim0_cnt = 0;
PORTC = 0xFF; // 모터 HIGH 출력
change++;
if(change == 100)
{
mot_pos = (mot_pos + 1) % 2;
change = 0;
motor_off();
}
}
if(tim0_cnt >= rc_time[0])
{
PORTC = 0x0; // 모터 LOW 출력
}
}
}
interrupt [TIM0_OVF] void tim_int0(void)
{
tim0_cnt++;
TCNT0 = 238;
}
void check(void)
{
if(record == record2)
{
lcd_clear();
lcd_gotoxy(0,1);
lcd_putsf("correct");
motor_on();
delay_ms(100);
}
}
void main(void)
{
DDRC = 0xFF;
DDRD = 0xFF;
DDRE = 0x00;
PORTE = 0x00;
PORTD = 0x00;
lcd_init(8);
while(1)
{
if(Switch_1)
{
number++;
if(number >= 9)
{
number = 1;
}
delay_ms(100);
}
else if(Switch_2)
{
number--;
if(number <= 0)
{
number = 8;
}
delay_ms(100);
}
switch(number)
{
case 1:
lcd_gotoxy(0,0);
lcd_putsf("1");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("1");
x++;
record ^= 0x01;
check();
delay_ms(100);
}
break;
case 2:
lcd_gotoxy(0,0);
lcd_putsf("2");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("2");
x++;
record ^= 0x02;
check();
delay_ms(100);
}
break;
case 3:
lcd_gotoxy(0,0);
lcd_putsf("3");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("3");
x++;
record ^= 0x04;
check();
delay_ms(100);
}
break;
case 4:
lcd_gotoxy(0,0);
lcd_putsf("4");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("4");
x++;
record ^= 0x08;
check();
delay_ms(100);
}
break;
case 5:
lcd_gotoxy(0,0);
lcd_putsf("5");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("5");
x++;
record ^= 0x10;
check();
delay_ms(100);
}
break;
case 6:
lcd_gotoxy(0,0);
lcd_putsf("6");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("6");
x++;
record ^= 0x20;
check();
delay_ms(100);
}
break;
case 7:
lcd_gotoxy(0,0);
lcd_putsf("7");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("7");
x++;
record ^= 0x40;
check();
delay_ms(100);
}
break;
case 8:
lcd_gotoxy(0,0);
lcd_putsf("8");
delay_ms(100);
if(Switch_3)
{
lcd_gotoxy(x,y);
lcd_putsf("8");
x++;
record ^= 0x80;
check();
delay_ms(100);
}
break;
}
}
}
아직 모터 회전에대한 개념이 부족해 일반모드를 쓰고 있는데 이후에는 fast pwm모드를 사용해보고 싶다. 더 많이 공부해야겠다.