회원가입 ID/PW 찾기
AA


사용 장비 : avr28
공학하는 여자입니당.. C언어도 겨우겨우 했는뎅 avr은 너무 어렵네영
빨간색 부분만 해석좀요 부탁드려요 ㅠ 보기 쉽게 줄로 쳐놨어용 부탁점영
학생이라서 돈이 별루 없습니다.
원하시다면 소정의 돈은 드릴수 있어요 ㅠ

  키버튼과 LCD, 모터를 이용하였구요
 모니터에는 문자 출력되구..
키버튼을 누르면 모터큰거(이름이 서브말구.. 뭐였더라 ; 오늘배워서 잘..)왼쪽 오른쪽 돌기도하고 그러거든요 ㅠㅠ
몰라서 혼나기만 하구...

#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)


#define NoKey 0xff


unsigned char KeyValue = 0xff;



void us_delay(unsigned int us_time)
{
 unsigned int i;

 for(i=0; i<us_time; i++) // 4 cycle +
 {
 asm("PUSH R0");  // 2 cycle +
 asm("POP R0");   // 2 cycle +
 asm("PUSH R0");  // 2 cycle +
 asm("POP R0");   // 2 cycle + =12 cycle for 11.0592MHZ
 asm("PUSH R0");  // 2 cycle +
 asm("POP R0");   // 2 cycle = 16 cycle = 1us for 16MHz
 }
}


void ms_delay(unsigned int ms_time)
 {
 unsigned int i;
 
 for(i=0; i<ms_time;i++)
 us_delay(1000);
}
void E_Pulse(void)
{
 EN_1;

 us_delay(100);

 EN_0;
}


void LCD_init(void)
{
 ms_delay(40);

 PORTC = 0x38; // Function Set
 E_Pulse();
 us_delay(40);

 PORTC = 0x0c; // DisPlay ON/OFF Control
 us_delay(40);
 E_Pulse();
 
 PORTC = 0x01; // Display Clear
 ms_delay(2);
 E_Pulse();

 PORTC = 0x06; // Entry Mode Set
 E_Pulse();
}

void Write_Char(unsigned char buf)
{
 LCD_RS_1;
 LCD_RW_0;
 PORTC=buf;
 E_Pulse();
}

void LCD_Disp(char x,char y)
{
 LCD_RS_0;
 LCD_RW_0;

 if(y == 0)
  PORTC = x + 0x80;
 else if(y==1)
  PORTC = x + 0xc0;
 E_Pulse();
}

/*
void LCD_Write1(char x, char y,char *str1)
{
 LCD_Disp(x,y);
 //while(*str1)
 Write_Char(*str1);
}*/

void LCD_Write(char x, char y,char *str)
{
 LCD_Disp(x,y);
 while(*str)
 Write_Char(*str++);
}

void LCD_Write_char(char x, char y, unsigned char ch)
{
 LCD_Disp(x,y);
 Write_Char(ch);
}

void KeyOut(char ot)
 {
  PORTA=ot;
 }

char KeyIn(void)
 {
  unsigned char Nibble;

  Nibble=(PINA & 0xf0)>>4;
  Nibble=Nibble & 0x0f;

  return Nibble;
 }

void KeyScan(void)
 {
  unsigned char key=0, key_cnt;
  unsigned char OTkey=0xfe, KeyBuff;

  KeyBuff=NoKey;

  for (key_cnt=0;key_cnt<4;key_cnt++)
  {
   KeyOut(OTkey);
   key=KeyIn();
 
   if(key==0x0e)
    KeyBuff=0+key_cnt;
   else if(key==0x0d)
    KeyBuff=4+key_cnt;
   else if(key==0x0b)
    KeyBuff=8+key_cnt;
   else if(key==0x07)
    KeyBuff=12+key_cnt;
  OTkey=(OTkey<<1)+1;
  }

  if(KeyBuff != NoKey)
   KeyValue = KeyBuff;
 }


-----------------------------------------------------------------------------------------------------------------------------
// 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;
}
-----------------------------------------------------------------------------------------------------------------------------

댓글 4
  • No Profile

    스펙시트를 참고하셔서 특정 레지스터가 어떤 기능을 하고 이런 값일때는 요런 설정이다 뭐 정도는 스스로 찾아보셔야 할거 같은데요;;;

  • No Profile
    저두 AVR 초보라서 확실한 것은 아닙니다만, 예전에 PIC로 Servo 모터 제어까지 해본 적이 있어서 그걸 바탕으로 말씀드리지요. 약 8년전에 배운 내용이어서 자신감이 많이 떨어지네요.

    위에 분 말씀데로 스펙시트를 참고하셔야 하지만 일단은 제가 아는 내용만 설명 드릴께요
    모터는 스테핑 모터를 사용하시는거 같습니다.

    그리고 아래 내용은 스테핑 모터를 사용하는데 필요한 입,출력 포트를 정의한 내용이고요

    #define MOTOR_CW  (PORTE &= 0xFB) --> 모터를 Clock wise 즉 시계 방향으로 회전 시킬때 사용하는 포트 정의
    #define MOTOR_CCW  (PORTE |= 0x04)
      --> 모터를 Count Clock wise 즉 반시계 방향으로 회전 시킬때 사용하는 포트 정의

    #define MOTOR_STOP  (PORTE &= 0xFD) --> 모터를 정지 시키기 위한 포트 정의
    #define MOTOR_ENABLE (PORTE |= 0x02) --> 모터 제어를 사용하기 위한 enable 포트 정의

    #define FREQ_CLK10  160000 // clock 10 16Mhz/100 --> 스테핑 모터는 펄스 즉 주파수로 작동을 합니다. 그거에 대한 정의입니다. 모터 스펙을 참고하시면 될거 같습니다.

    #define PRESCALE  64 --> 이것은 기억이 가물가물 하네요 죄송합니다. ^^;
    #define FREQ_REFER  1000 // 1Khz(1msec) --> 요것두 기억이 잘~~ ^^;

    저두 배워가는 입장이라서 고수분들 제가 알고 있는게 맞는가요?

  • No Profile
    #define a b 이렇게 하는건 a라고 쓰면 그 자리에 b 값이 들어갑니다 요런 뜻인걸로 알고 있어요O_O 그러니까 #define PRESCALE  64 이렇게 쓰면 PRESCALE이라고 쓴 자리마다 64가 들어가는 거죠~
  • No Profile

    #define는 정의 부분 입니다.

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
512 마이크로프로세서 HOT8051 기판없이 시뮬레이션 가능한 프로그램 있을까요?5 팁티바 1396 2010.04.10
511 마이크로프로세서 HOTir리모콘 컴파일러 질문드립니다. 야래 1145 2010.04.09
510 마이크로프로세서 HOTAVR 교재좀 부탁드려요8 빛의속도 1867 2010.04.09
509 펌웨어 & 코딩언어 HOTc언어 배우려는 초보입니다.9 빛의속도 1026 2010.04.09
508 마이크로프로세서 HOT센서를 제어할 수 있는 회로도를 어디서 구할 수 있나요?3 우기우기 1266 2010.04.07
507 마이크로프로세서 HOTir리모콘 컴파일러 질문드립니다. 야래 933 2010.04.07
506 마이크로프로세서 HOTATmega48을 이용해서 모터를 제어하는데..1 바람2 945 2010.04.07
505 마이크로프로세서 HOTspi 속도문의 눈티 1638 2010.04.07
504 마이크로프로세서 HOTATMEGA128을 이용한 BUCK-BOOST 컨버터 제어 질문입니다.(AD TO PWM DUTY) 전기사랑 2714 2010.04.07
마이크로프로세서 HOT모터제어 (고슈님들 도와주세요)4 꼬막소녀 1239 2010.04.06
502 마이크로프로세서 HOT두더지소스 만들기3 한자 1595 2010.04.06
501 마이크로프로세서 HOT통신케이블관련질문요..2 암소 720 2010.04.06
500 마이크로프로세서 HOTAtmega로 무선으로 데이터 송수신을 공부하고자하는데요.. 권용찬 1535 2010.04.04
499 마이크로프로세서 HOT8051 set 1bit제어 하려고 합니다.4 개똥껄레 1139 2010.04.04
498 마이크로프로세서 HOT초보입니다.1 키키오오 1292 2010.04.04
497 마이크로프로세서 HOT전원부회로3 키키오오 1463 2010.04.04
496 마이크로프로세서 HOTat89s51 메인보드(개발용)에 asm 다운로드후 동작이 안되요.2 gsi 1436 2010.04.03
495 마이크로프로세서 HOTAVR128 or ARM7,9으로 TFT- LCD제어할려고하는데 궁금한게 있습니다.2 marin_blues 1754 2010.04.03
494 마이크로프로세서 HOTavr보드 직접 만들어야 할까요?4 암소 1141 2010.04.01
493 마이크로프로세서 HOT8051 에 마이크로 C/os 포팅하려는데요1 나는타조 1214 2010.04.01
Prev 1 ... 28 29 30 31 32 33 34 35 36 37 ... 58 Next
  • 가장 행복한 삶을 살기 위해서 낮시간은 엄격하게 계획되어야 하고 밤시간은 한가하게 비워놓아야 한다.
    - 무니
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.