질문게시판 > 마스터님 재질문입니다.

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

마스터님 재질문입니다.

페이지 정보

작성자 Busan 작성일19-12-27 23:11 조회191회 댓글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 Off

void 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);

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 3

조회수 : 191

master님의 댓글

master 작성일

else{ 
            rot_dir=2;
            OCR1A=rot_value;
        }
이 조건은 절대로 만들어지지 않습니다.
위의 if문 조건들을 잘 따져보세요

master님의 댓글

master 작성일

먼저번에도 디버깅은 타인이 해드리기 어려우니 직접 하시라고 적어드렸죠?
보드가 없으면 원인을 찾기 어렵습니다.
ADMUX=0x40; // ADMUX=0x00; 대신 사용해보세요

Busan님의 댓글

Busan 작성일

네 감사합니다. 디버깅 중입니다.

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[10] master  17-10-29
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [… 댓글[1] 첨부파일master  18-01-23
질문 두더지 정리본입니다. 아두이노배우기 새글 20-02-28
답변 답변 : 두더지 정리본입니다. master 새글 20-02-28
답변 답변 : 답변 : 두더지 정리본(늦은시간에 죄송합니다.… 아두이노배우기 새글 01:52
답변 답변 : 답변 : 답변 : 두더지 정리본(늦은시간에 죄… master 새글 08:19
답변 답변 : 답변 : 답변 : 답변 : 두더지 정리본(늦은… 댓글[3] 아두이노배우기 새글 16:09
질문 아두이노 두더지 잡기 아두이노배우기  20-02-27
답변 답변 : 아두이노 두더지 잡기 댓글[1] master 새글 20-02-27
질문 아두이노+스텝모터+L298N 질문드립니다. 첨부파일빈군  20-02-27
답변 답변 : 아두이노+스텝모터+L298N 질문드립니다. 댓글[3] master  20-02-27
질문 STM32 MCU DFSDM기능 문의 댓글[1] 첨부파일Hongchoon  20-02-26
질문 DC모터 제어중 부저 추가 댓글[2] 아두이노배우기  20-02-25
질문 적외선 DC모터 제어 아두이노배우기  20-02-25
답변 답변 : 적외선 DC모터 제어 댓글[1] master  20-02-25
질문 아두이노 IDE (ino파일) 로 업로드 하면 작동되는… 댓글[1] 첨부파일이츠라  20-02-25
질문 atmega128 while 속 if문 실행 문제 이동욱  20-02-24
답변 답변 : atmega128 while 속 if문 실행 … master  20-02-24
질문 Limit Sensor 를 이용한 LED의 자동 작동에… 첨부파일아두이프로  20-02-24
답변 답변 : Limit Sensor 를 이용한 LED의 자… 댓글[1] master  20-02-24
질문 HC-11을 이용하여 1:N 통신중입니다. 댓글[4] 아두이노배우기  20-02-23
질문 스텝모터 정지 댓글[2] 아두이노배우기  20-02-23
답변 답변 : 스텝모터 정지 댓글[2] master  20-02-23
질문 정말 감사합니다. 박취  20-02-19
질문 ov9655카메라와 stm32f4 보드를 이용한 영상처… 댓글[7] flap  20-02-19
질문 GLCD 텍스트 출력 댓글[2] 전자학습자  20-02-17
질문 아두이노 HC-11 통신관련입니다. 아두이노배우기  20-02-15
답변 답변 : 아두이노 HC-11 통신관련입니다. master  20-02-16
답변 답변 : 답변 : 아두이노 HC-11 통신관련입니다. 아두이노배우기  20-02-16
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전