질문게시판 > 코드비전 소스입니다.

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

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

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

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

BASIC4MCU > 질문게시판

코드비전 소스입니다.

페이지 정보

작성자 atmega1 작성일19-11-06 22:33 조회6,332회 댓글2건

본문

#include <mega128.h>

#include <stdio.h>

#include <lcd.h>

#include <delay.h>

 

#define L_IN1 PORTB.0  // L_motor Dir Control

#define L_IN2 PORTB.1

#define R_IN1 PORTB.2  //R_Motor Dir Control

#define R_IN2 PORTB.3

 

#define L_EN PORTB.5  //L_motor control, OCR1A output pin

#define R_EN PORTB.6 // R_motor Control, OCR1B output pin

 

#asm

equ__lcd_port = 0x15;   //PORTC -LCD  

#endasm

 

volatile unsigned char mod[3][16] = {"Ready ","Memorizing"};

volatile unsigned char temp_L[16];

volatile unsigned char temp_R[16];

volatile unsigned int L_cnt, R_cnt;

 

volatile unsigned int L_cnt_s[100], L_Dir_s[100];

volatile unsigned int R_cnt_s[100], R_Dir_s[100];

volatile unsigned int L_run_cnt, R_run_cnt, L_top, R_top;

 

volatile bit L_Run,R_Run,L_comp, R_comp, test1, tes2, test3;

volatile int L_step, R_step,top, err_L, err_R;

volatile bit L_D, R_D, Memo_flag, md_sel,;

volatile bit L_chk_flag, R_chk_flag, L_t_chk,R_t_chk;

 

interrupt [EXT_INT0] void Memo(void)

{

if(L_Run !=1 || R_Run !=1)

md_sel = ~md_sel; //Memorizing mode on/off

 

L_chk_flag =1;

R_chk_flag =1;

 

if(L_t_chk ==1)

{

//L Motor

L_Dir_s[L_step] = L_D;   //방향저장

L_cnt_s[L_step] = L_cnt;

}

//R Motor

if(R_t_chk==1)

{

R_Dir_s[R_step] = ~R_D; // 방향저장

R_cnt_s[R_step] = R_cnt; //  펄스 수 저장

}

//초기화

if(L_t_chk==1 || R_t_chk==1)

{

L_t_chk =0;

R_t_chk= 0;

md_sel = 0;

L_cnt =0;

R_cnt =0;

L_run_cnt =0;

R_run_cnt =0;

L_chk_flag =0;

R_chk_flag =0;

//저장완료

Memo_flag =1;

}

}

interrupt [EXT_INT1] void Run_mode(void)

{

if(Memo_flag ==1)

{

L_Run =1;

R_Run = 1;

 

L_run_cnt =0;

R_run_cnt = 0;

}

}

//Left Motor

interrupt [EXT_INT4] void Left_motor_capture(void)

{

if(md_sel == 1) // save mode

{

L_cnt++;

if(L_chk_flag == 1) //DIR check

{

L_t_chk = 1;

if(PINE.5 ==0)

{

L_D =0; //im_Dir Reverse

}

else

{

L_D = 1; // im_dir Drive

}

L_chk_flag =0;

}

if(L_D ^PINE.5 ==1)

{

if(L_cnt >2)

{

L_Dir_s[L_step] = L_D;

L_cnt_s[L_step] = L_cnt;

 

L_step++;

 

L_chk_flag =1;

L_cnt = 0;

}

}

}

if(Memo_flag == 1)

{

    L_run_cnt++;

}

}

// Right Motor

interrupt[EXT_INT6] void Right_Motor_capture(void)

{

    if(md_sel == 1)

    {

     R_cnt++;        //회전 펄스 수++

 

    if(R_chk_flag == 1) {    // Direction check

    R_t_chk = 1;

 

    if(PINE.7 == 0) {

        R_D= 0;          // Im_Dir Reverse

    }

    else {

    R_D = 1;            // Im_dir Drive

}

    R_chk_flag = 0;        // chk Flag off, 더이상 방향 체크 없이 카운트만 체크 

}        

 

    if(R_D^PINE.7 ==1 )    // 방향 전화 xor 연산을 통해 감지

{

    if(R_cnt >2)        // 카운트가 2이상이어야지만 step 증가

    {

    R_Dir_s[R_step] = ~R_D;    //방향 저장

    R_cnt_s[R_step] = R_cnt;     //펄스 수 저장

 

    R_step++;        // Step ++

 

    R_chk_flag = 1;         //방향 chk flag On

    R_cnt = 0;        //R_cnt 초기화

    }

    }    

}

 

    if(Memo_flag == 1)    // 저장된값 출력시 if 문을 발생

{

    R_run_cnt++;

}

}

 

void main(void)

{

    DDRB = 0xff;

 

    EICRA = (1<<ISC31) | (0<<ISC30) | (1<<ISC21) | (0<<ISC20) | (1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);

    EICRB = (0<<ISC71) | (0<<ISC70) | (1<<ISC61) | (0<<ISC60) | (0<<ISC51) | (0<<ISC50) | (1<<ISC41) | (0<<ISC40);

    EIMSK = (0<<INT7) | (1<<INT6) | (0<<INT5) | (1<<INT4) | (0<<INT3) | (0<<INT2) | (1<<INT1) | (1<<INT0);

    

    TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (1<<WGM10);

    TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);

    

    OCR1A = 170;

    OCR1B = 170;

 

    lcd_init(16);

 

    #asm("sei")

 

    while (1)

{

    /// LCD 상태 표시

    lcd_gotoxy(0,0);

    sprintf(temp_L,"mode:%s",mode[md_sel]);

    lcd_puts(temp_L);

 

    lcd_gotoxy(0,1);

    sprintf(temp_R,"L :%3d  R :%3d", L_step, R_step);

    lcd_puts(temp_R);

// 저장 정보가 있을 때

 

    if(Memo_flag == 1&& (L_Run == 1||R_Run ==1))

{

    // L Motor

    if(L_Run == 1)

    {

    if(L_cnt_s[L_top] !=0)

    {

    if(L_Dir_s[L_top] == 0)

    {

    TCCR1A |= (1<<COM1A1) | (1<<COM1A0);

    L_IN1 = 1;

    L_IN2 = 0;    // reverse

    }

    else

    {

    TCCR1A |= (1<<COM1A1) | (0<<COM1A0);

    L_IN1 = 0;

    L_IN2 = 1;      //drive

    }

 

    err_L = L_cnt_s[L_top] - L_run_cnt;

 

    if(err_L == 0)

{

    TCCR1A |= (0<<COM1A1) | (0<<COM1A0) | (0<<COM1C0) | (0<<WGM11) | (1<<WGM10);

    L_EN = 0;

    L_IN1 = 1;

    L_IN2 = 1;

    delay_us(30);

    L_run_cnt = 0;

    L_top++;

    }

 }

if(L_step < L_top)

{

    TCCR1A |=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (1<<WGM10);

    L_IN1=1;

    L_IN2=1;

    L_EN =0;

 

    L_run_cnt = 0;

    L_top = 0;

    L_Run = 0;

    L_comp = 1;

}

if(L_comp == 1)

    L_EN = 0;

}

                /************************ R MOTOR ************************/

if(R_Run == 1)

{

    if(R_cnt_s[R_top] !=0)

    {

        /******************** R 방향 파악 ********************/

 

        if(R_Dir_s[R_top] ==0) /*******Reverse*******/

        {

 

            TCCR1A |= (1<<COM1B1) | (0<<COM1B0);

            R_IN1 = 0;

            R_IN2 = 1;

        }

        else        /*******Drive*******/

        {

 

            TCCR1A |= (1<<COM1B1) | (1<<COM1B0);

            R_IN1 = 1;

            R_IN2 = 0;

        }

        /************************************************/

        err_R = R_cnt_s[R_top] - R_run_cnt;

 

        if(err_R == 0)

        {

            TCCR1A |= (0<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (1<<WGM10);

            R_EN = 0;

            R_IN1 = 1;

            R_IN2 = 1;

            delay_us(30);

            R_run_cnt = 0;

            R_top++;

            test1 = 1;

        }

    }

 

if(R_step < R_top)

{

    TCCR1A |= (0<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (1<<WGM10);

    test1 = 1;

    R_IN1 = 1;

    R_IN2 = 1;

    R_EN = 0;

 

    R_run_cnt = 0;

    R_step = 0;

    err_R = 0;

    R_Run = 0;

    R_comp = 1;

}

if(R_comp == 1)

    R_EN = 0;

}

 

if(L_comp == 1 && R_comp == 1)

{

 

    Memo_flag = 0;

 

    OCR1A = 0;

    OCR1B = 0;

 

TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (0<<WGM10);

TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);

L_EN = 0;

R_EN = 0;

}

}

}

}

소스  자체는 괜찮은거 같은데 틀린곳이 있는지 확인해주시길바랍니다.
프로젝트 컴파일에는 에러가 안뜨는데 build the project를 누르면 에러가 3개가 뜹니다. 사진 처럼 어떻게 되는건지 알려주세요

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

댓글 : 2

조회수 : 6,332

master님의 댓글

master 작성일

unsigned char mod[3][16]={ "Ready ","Memorizing"};
sprintf(temp_L,"mode:%s",mode[md_sel]);

배열명을 mode[3][16]로 변경하든지
sprintf(temp_L,"mode:%s",mod[md_sel]); //<-- mod[]로 변경하세요

master님의 댓글

master 작성일

#include <lcd.h>
#asm
equ__lcd_port=0x15; //PORTC-LCD
#endasm

위 LCD 라이브러리 선언은 구버전의 코드비젼용입니다.
신버전에서는
#include <alcd.h>
헤더파일 하나만 선언하면 되고
LCD 포트 설정은 .. 사진을 답변글에 첨부해드리죠

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 아두이노 센서 쉴드 v5.0 과 음성인식 모듈(V2)통… 첨부파일AutoSun 새글 22-07-05
질문 초음파 센서를 사용한 dc모터 제어에 관해 질문 있습니… 첨부파일뉴비에오 새글 22-07-04
답변 답변 : 초음파 센서를 사용한 dc모터 제어에 관해 질… 댓글[2] master 새글 22-07-05
질문 아두이노 Sensor Shield 5.0 시리얼 통신 … 댓글[2] AutoSun 새글 22-07-04
질문 Atmega 코드 좀 봐주세요. 댓글[1] 첨부파일chelsea 새글 22-07-04
질문 아두이노 while문 탈출 질문 yhj2644  22-07-01
답변 답변 : 아두이노 while문 탈출 질문 댓글[8] master  22-07-01
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의… 댓글[3] cansad  22-06-30
질문 ESP32-C3 리튬폴리머 ADC 전압 체크 관련 문의 댓글[3] cansad  22-06-30
질문 빵판없이 디스플레이 넣을 수 있을까요? 댓글[2] 첨부파일오소로롯  22-06-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum  22-06-26
질문 음전압 ADC 댓글[2] 412904  22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
질문 ATMEGA128 UART,FND 연동 질문 JMOD  22-06-19
답변 답변 : ATMEGA128 UART,FND 연동 질문 댓글[1] master  22-06-20
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전