BASIC4MCU | 질문게시판 | ATmega128 타이머, 알람, LCD, 모터제어 코딩에 대한 질문이 있습니다.
페이지 정보
작성자 리치 작성일2021-06-03 14:47 조회5,076회 댓글1건본문
//;**** 먹이 제어 시계 *****
#include <avr/io.h>
#include <avr/interrupt.h>
#include "OK128.h"
unsigned char FL,FL2;
volatile unsigned char second, minute, hour=12;
volatile unsigned char ampm = 'P';
volatile unsigned char minuteA, hourA=00;
volatile unsigned char ampmA = 'A';
void LCD_2digit(unsigned char number) //2자리 디스플레이
{ LCD_data4(number/10 +'0'); //10
LCD_data4(number%10 +'0'); //1
}
//------- 알람 시 셋팅 -------------------------------------
void AACONT(void)
{ hourA++; // increment hour
if(hourA == 13) // if hour = 13, hour = 1
{hourA = 1; }
if(hourA == 12) // if hour = 12, adjust AM/PM
{if(ampmA == 'A') {ampmA='P';}
else ampmA ='A';
}
}
//-------- 알람 분 셋팅 -------------------------------------
void AMCONT(void)
{ minuteA++; // increment minute
if(minuteA == 60) // if minute = 60, minute = 0
{ minuteA = 0;
} }
void DISP_AL1(void)
{ LCD_command4(0xC7); // display AM/PM
LCD_data4(ampmA);
LCD_command4(0xCA); // display hour
LCD_2digit(hourA);
LCD_command4(0xCD); // display minute
LCD_2digit(minuteA);
}
//====== 알람1 시간 셋팅용 함수 ====================
void AL1_SET(void)
{ if((PIND & 0B01000000)==0)
{ AACONT(); DISP_AL1();}
if((PIND & 0B00010000) ==0)
{ AMCONT(); DISP_AL1();}
}
//------- 시 셋팅 ----------------------------------------
void ACONT(void)
{ hour++; // increment hour
if(hour == 13) // if hour = 13, hour = 1
{hour = 1; }
if(hour == 12) // if hour = 12, adjust AM/PM
{if(ampm == 'A') {ampm = 'P';}
else ampm = 'A';
}
}
//-------- 분 셋팅 ----------------------------------------
void MCONT(void)
{ minute++; // increment minute
if(minute ==60) // if minute = 60, minute = 0
{ minute = 0;
}
}
void DISP(void) //디스플레이
{ LCD_command4(0x81); // display AM/PM
LCD_data4(ampm);
LCD_command4(0x84); //display hour
LCD_2digit(hour);
LCD_command4(0x87); //display minute
LCD_2digit(minute);
LCD_command4(0x8A); // display second
LCD_2digit(second);
}
//====== 시간 셋팅용 함수 ===================================
void A_SET(void)
{ if(!(PIND & 0B00100000)) //분 조정 버튼
{ MCONT();
DISP(); }
if(!(PIND & 0B00000100)) //시 조정 버튼
{ ACONT();
DISP(); }
}
//*******************************************************************
ISR(TIMER1_COMPA_vect) //타이머 인터럽트 함수
{ second++; // increment second
if(second == 60) // if second = 60, second = 0
{ second = 0;
minute++; // increment minute
if(minute == 60) // if minute = 60, minute = 0
{ minute = 0;
hour++; // increment hour
if(hour == 13) // if hour = 13, hour = 1
hour = 1;
if(hour == 12) // if hour = 12, adjust AM/PM
{ if(ampm == 'A') ampm='P';
else ampm='A';
}
}
}
DISP();
}
void OPEN(void) //문 여닫기 함수
{PORTD |=0B00000010; //모터 열기 회전.
Delay_ms(150); //150미리초 동안
PORTD &=0B11111101; //모터 정지
Delay_ms(1000); //1초간 열림.
PORTD |=0B00001000; //모터 닫기 회전.
Delay_ms(160); //160미리초 간
PORTD &=0B11110111; //모터 정지
Delay_ms(3000);
}
//***** 메 인 함 수 *************************************
int main(void)
{
DDRB = 0B11111111; // PORTB = output
PORTB =0B00000000;
DDRD = 0B00001010;
PORTD =0B11110101;
LCD_initialize4(); //LCD초기화
LCD_string4(0x80," PM 12:00:00 ");
LCD_string4(0xC0,"ALARM AM 00:00 ");
//;------ Initialize Timer/Counter1 CTC Mode (1초 생성용) -------
TCCR1A = 0x00; // CTC mode(4), don't output OC1A
TCCR1B = 0x0C; // 16MHz/256/(1+62499) = 1Hz
TCCR1C = 0x00;
OCR1A = 31249;
TCNT1 = 0x0000; // clear Timer/Counter1
//----------- 타이머 1 int 셋팅 --------------------------------
TIMSK = 0x10; // enable OC1A interrupt
ETIMSK = 0x00;
TIFR = 0x3C; // clear all interrupt flags
ETIFR = 0x01;
sei(); //인터럽트 시작.
while(1)
{
A_SET(); //현재 시간 조정
AL1_SET(); //알람1 시간 조정
if((minute==minuteA)&&(hour==hourA)&&(ampm==ampmA)) //알람상황이면...
{if(!(FL))
{OPEN(); //모터 작동.
FL=1;
}
}
else FL=0; //알람 아니면
if((PIND & 0B00000001)) //밤이 되면
{if(!(FL2))
{OPEN(); //모터 작동,
FL2=1; //알람 플래그 셋
}
}
if(!(PIND & 0B00000001)) //아침이 되면
{if((FL2))
{OPEN(); //모터작동.
FL2=0; //알람 플래그 셋
}
}
if(!(PIND & 0B10000000)) //임의 스위치 누르면
{OPEN();} //모터 작동.
Delay_ms(200);
}
}
LCD에 시간과 알람을 표시하고 알람으로 맞춰준 시간이 되면 모터가 작동하고cds센서가 빛을 감지하거나 감지하지 못하는 상황이 되었을 때에도 모터가 작동하는 회로를 구성하고 싶어서해당 소스를 만들었습니다,하지만 제대로 동작을 하지 않는 상황이라 소스의 잘못된 부분이 있는지 여쭤보고 싶습니다.감사합니다.
댓글 1
조회수 5,076master님의 댓글
master 작성일제공된 예제를 구동해서 각각의 센서 및 회로가 정상동작하는지 체크부터 하세요