BASIC4MCU | 질문게시판 | 마스터님 재질문입니다.
페이지 정보
작성자 Busan 작성일2019-12-27 23:11 조회7,426회 댓글3건첨부파일
본문
취합하였으나 4V일때만 모터가 반응하여 질문드립니다 ㅠㅠ
공부하는 예제에 print 구문을 잘 쓰지 않아서 우선 공부 후 master님대로 코딩을 해보려고 합니다.
#include <mega128.h>
#include <delay.h>#define LINE2 0xC0 // 2nd Line Move
#define HOME 0x02 // Cursor Home
#define ALLCLR 0x01
#define RSHIFT 0x1C // Display Right Shift
#define LSHIFT 0x18 // Display Left Shift
#define DISPON 0x0c // Display On
#define DISPOFF 0x08 // Display Offvoid LCD_init(void);
void LCD_String(char flash *str);
void Busy(void);
void Command(unsigned char);
void Data(unsigned char);
void degree_display(void);
int rot_base=375, rot_min=275, rot_max=475;
int rot_delta1=1, rot_delta2=2, rot_delta4=4, rot_delta=0;
int rot_value=0, rot_dir=2;
int adc_value=0;
float Vref=5.0, Vwarn = 4.0, f_val=0;
int temp10=0;
int cnt_bell = 0;void main(void)
{
DDRA=0xff;
DDRB=0xff;
ADMUX=0x00;
ADCSRA=0b10000111;
ETIMSK=0b00000100;
TCCR3A=0x00;
TCCR3B=0b00000100;
TCNT3H=0xE7;
TCNT3L=0x96;
TCCR1A=0b10000010;
TCCR1B=0b00011011;
ICR1H=0x09;
ICR1L=0xc3;SREG=0b10000000;
rot_value=rot_base;
OCR1A=rot_value;LCD_init();
degree_display();
while(1)
{
ADCSRA=0b11000111;
while((ADCSRA&0x10)==0);
adc_value=(int)ADCL+((int)ADCH<<8);
f_val=(float)adc_value*Vref/1024;
temp10=(int)(f_val*10+0.5);
if(temp10>0&&temp10<=15)
{
rot_dir=1;
rot_delta=rot_delta4;
}
else if(temp10>15&&temp10<=30)
{
rot_dir=0;
rot_delta=rot_delta1;
}
else if(temp10>30&&temp10<=40)
{
rot_dir=0;
rot_delta=rot_delta2;
}
else if(temp10>40)
{
rot_dir=0;
rot_delta=rot_delta4;
PORTA = 0xff;
}
else
{
rot_dir=2;
OCR1A=rot_value;
}
}
}interrupt [TIM3_OVF] void timer_int3(void)
{
TCNT3H=0xE7;
TCNT3L=0x96;
if(rot_dir==0)
{
if(rot_value<=rot_max)
{
rot_value+=rot_delta;
}
else
{
rot_value=rot_max;
}
OCR1A=rot_value;
}
else if(rot_dir==1)
{
if(rot_value>=rot_min)
{
rot_value-=rot_delta;
}
else
{
rot_value=rot_min;
}
OCR1A=rot_value;
}
degree_display();
if(f_val >= Vwarn)
{
TCCR1A = 0x40;
TCCR1B = 0x0a;
if(cnt_bell == 0)
{
PORTA = 0x00;
OCR1A = 2082;
Command(ALLCLR);
LCD_String("FIRE!!");
cnt_bell = 1;
}
else{
PORTA = 0xff;
OCR1A = 2777;
Command(ALLCLR);
cnt_bell = 0;
}
}
else{
TCCR1A = 0x00;
TCCR1B = 0x0a;
PORTA = 0xff;
degree_display();
}
}void degree_display(void)
{
float degree_value=0;
int temp0=0, temp1=0, temp2=0, temp=0;
int v1=0, v2=0;
Command(LINE2);
LCD_String(" De :");
if(rot_value>=rot_base)
{
degree_value=(float)(rot_value-rot_base)*80/100;
LCD_String("+");
}
else
{
degree_value=(float)(rot_base-rot_value)*80/100;
LCD_String("-");
}
temp=(int)(degree_value*10);
temp2=temp/100;
temp=temp%100;
temp1=temp/10;
temp0=temp%10;
Data(0x30+temp2);
Data(0x30+temp1);
LCD_String(".");
Data(0x30+temp0);
Command(LINE2);
LCD_String("V:");
v1=temp10/10;
v2=temp10%10;
Data(0x30+v1);
LCD_String(".");
Data(0x30+v2);
LCD_String("V");
}
// LCD 초기화 함수
void LCD_init(void)
{
DDRC = 0xFF; // 포트 C 출력 설정
PORTC &= 0xFB; //E = 0;
// 충분한 지연시간을 통한 안정화 과정
delay_ms(15);
Command(0x20); // D5=1
delay_ms(5);
Command(0x20); // D5=1
delay_us(100);
Command(0x20); // D5=1// 초기화 과정
Command(0x28); // function set
Command(0x06); // entry mode set
Command(0x01); // all clear
Command(0x0c); // display on
}
// 인스트럭션 쓰기 함수
void Command(unsigned char byte)
{
Busy();// 인스트럭션 상위 바이트
PORTC = (byte & 0xF0); // 데이터
PORTC &= 0xFE; // RS = 0;
PORTC &= 0xFD; // RW = 0;
delay_us(1);
PORTC |= 0x04; // E = 1;
delay_us(1);
PORTC &= 0xFB; // E = 0;// 인스트럭션 하위 바이트
PORTC = ((byte<<4) & 0xF0); // 데이터
PORTC &= 0xFE; // RS = 0;
PORTC &= 0xFD; // RW = 0;
delay_us(1);
PORTC |= 0x04; // E = 1;
delay_us(1);
PORTC &= 0xFB; // E = 0;
}// 문자열 출력 함수
void LCD_String(char flash *str)
{
char flash *pStr=0;pStr = str;
while(*pStr) Data(*pStr++);
}// char flash : pointer declaration for program memory
// char eeprom : pointer declaration for EEPROM//데이터 쓰기 함수
void Data(unsigned char byte)
{
Busy();
// 데이터 상위 바이트
PORTC = (byte & 0xF0); // 데이터
PORTC |= 0x01; //RS = 1;
PORTC &= 0xFD; //W = 0;
delay_us(1);
PORTC |= 0x04; //E = 1;
delay_us(1);
PORTC &= 0xFB; //E = 0;// 데이터 하위 바이트
PORTC = ((byte<<4) & 0xF0); // 데이터
PORTC |= 0x01; //RS = 1;
PORTC &= 0xFD; //RW = 0;
delay_us(1);
PORTC |= 0x04; //E = 1;
delay_us(1);
PORTC &= 0xFB; //E = 0;
}// Busy Flag Check -> 일반적인 BF를 체크하는 것이 아니라
// 일정한 시간 지연을 이용한다.
void Busy(void)
{
delay_ms(2);
}
댓글 3
조회수 7,426master님의 댓글
master 작성일
else{
rot_dir=2;
OCR1A=rot_value;
}
이 조건은 절대로 만들어지지 않습니다.
위의 if문 조건들을 잘 따져보세요
master님의 댓글
master 작성일
먼저번에도 디버깅은 타인이 해드리기 어려우니 직접 하시라고 적어드렸죠?
보드가 없으면 원인을 찾기 어렵습니다.
ADMUX=0x40; // ADMUX=0x00; 대신 사용해보세요
Busan님의 댓글
Busan 작성일네 감사합니다. 디버깅 중입니다.