딜레이함수, 키제어, 모니터제어는 헤더파일을 생성했다고 가정하겠습니당! ㅠㅠ
빨간부분만 제발 알려주세염!! ㅠㅠ접때두 이문제로 올린적있는데
도와주신분들 정말 진심으로 감사드립니다.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define MOTOR_CW (PORTE &= 0xFB)
#define MOTOR_CCW (PORTE |= 0x04)
#define MOTOR_STOP (PORTE &= 0xFD)
#define MOTOR_ENABLE (PORTE |= 0x02)
#define FREQ_CLK10 160000 // clock 10 16Mhz/100
#define PRESCALE 64
#define FREQ_REFER 1000 // 1Khz(1msec)
#define LCD_RS_1 (PORTG |= 0x01)
#define LCD_RS_0 (PORTG &= 0xFE)
#define LCD_RW_1 (PORTG |= 0x02)
#define LCD_RW_0 (PORTG &= 0xFD)
#define EN_1 (PORTG |= 0x04)
#define EN_0 (PORTG &= 0xFB)
// motor control
void initStepMotor(void)
{
TCCR3A = 0xAA; // COM3A[1:0] = 10. 비교일치시 클리어
// TOP 셋
// WGM3[3:0] = 1010, Phase correct PWM mode
// TOP값은 ICR 레지스터가 결정
TCCR3B = 0x13;
ICR3 = 249; // 최고값 250(2msec)
OCR3A = 90; // 최저값 (duty rate 결정, 클수록 커짐)
// OC3A를 출력을 설정(PE3)
}
void CtrlStepMotor(unsigned int speed)
{
if(speed >= 150)
speed = 150;
ICR3 = (FREQ_CLK10 / (2*PRESCALE*2*speed))*60;
// 200Hz/100 // RPM 단위로 환산
}
void initPort()
{
DDRA = 0x0f; // keypad 제어
DDRC = 0xff; // LCD 데이터
DDRG = 0xff; // LCD 제어
DDRE = 0xff; // 모터펄스, 방향 인에이블
}
int main(void)
{
char strBuff[20]={0};
int speed = 0;
initPort();
LCD_init();
initStepMotor();
sprintf(strBuff,"Welcome");
LCD_Write(0,0,strBuff);
ms_delay(500);
sprintf(strBuff,"Step Motor");
LCD_Write(0,0,strBuff);
sprintf(strBuff," ");
LCD_Write(0,1,strBuff);
while(1)
{
KeyScan();
if(KeyValue == 0)
{
MOTOR_STOP;
}
else if(KeyValue == 1)
{
MOTOR_ENABLE;
}
else if(KeyValue == 2)
{
MOTOR_CCW;
}
else if(KeyValue == 3)
{
MOTOR_CW;
}
else if(KeyValue == 4)
{
speed =40;
CtrlStepMotor(speed);
}
else if(KeyValue == 5)
{
speed =60;
CtrlStepMotor(speed);
}
else if(KeyValue == 6)
{
speed =80;
CtrlStepMotor(speed);
}
else if(KeyValue == 7)
{
speed =100;
CtrlStepMotor(speed);
}
if(PORTE & 0x04)
sprintf(strBuff,"Dir = CCW:%3drpm", speed);
else
sprintf(strBuff,"DIr = CW : %3drpm", speed);
LCD_Write(0,1,strBuff);
}
return 0;
}
소스의 목적도 없이 올리시면 그 아무도 디버깅 할 수 없습니다.