뉴티씨



  • HOME
  • 고객지원
  • 질문답변

 

 
시리얼통신 모터제어 질문입니다.
 글쓴이 : 조민준
작성일 : 18-03-23 10:24
조회 : 19,866  

com4(시리얼포트)를 통해서 1~5숫자가 0.3초간격으로 막 전송 되는데 이걸 수신해서 모터제어를 하려는 목적

 

코드는 이상없다고하는데 작동이안되서 이게 avr고장이문제인지 코드가문제인지를 모르겠습니다. 확인한번 부탁드리겠습니다. avr이문제라면 as요청계획입니다.



---

(예)

1

1

1

3

3

3

4

5

5

---

 

#define F_CPU 16000000UL

#include <avr/io.h>

#include <util/delay.h>

 

//모터작동정의들

#define MOTOR_PORT        PORTC

#define PWM1_ON            (MOTOR_PORT|=0x01)

#define PWM1_OFF        (MOTOR_PORT&=0xFE)

#define DIR1_ON            (MOTOR_PORT|=0x02)

#define DIR1_OFF        (MOTOR_PORT&=0xFD)

#define ENABLE1_OFF        (MOTOR_PORT|=0x04)

#define ENABLE1_ON        (MOTOR_PORT&=0xFB)

#define BREAK1_ON        (MOTOR_PORT|=0x08)

#define BREAK1_OFF        (MOTOR_PORT&=0xF7)

#define PWM2_ON            (MOTOR_PORT|=0x10)

#define PWM2_OFF        (MOTOR_PORT&=~0x10)

#define DIR2_ON            (MOTOR_PORT|=0x20)

#define DIR2_OFF        (MOTOR_PORT&=~0x20)

#define ENABLE2_OFF        (MOTOR_PORT|=0x40)

#define ENABLE2_ON        (MOTOR_PORT&=~0x40)

#define BREAK2_ON        (MOTOR_PORT|=0x80)

#define BREAK2_OFF        (MOTOR_PORT&=~0x80)

 

void port_init(void) //모터출력

{

PORTA = 0x00;

DDRA  = 0x00;

PORTB = 0x00;

DDRB  = 0x00;

PORTC = 0x00; //m103 output only

DDRC  = 0xff;

PORTD = 0x00;

DDRD  = 0x00;

PORTE = 0x00;

DDRE  = 0x00;

PORTF = 0x00;

DDRF  = 0x00;

PORTG = 0x00;

DDRG  = 0xff;

}

 

unsigned char RX1_char_scan(void)        // 수신버퍼의 데이터 전달함수

{

    if((UCSR1A & 0x80) == 0x00)            // RXC1 = clear : 수신버퍼에 데이터가 없으면

        return 0x00;                        // null 반환

       

        else                                // RXC1 = set : 수신버퍼에 데이터가 있으면

        return UDR1;                        // 수신 데이터 반환

}

 

void TX1_char(unsigned char data)        // 데이터 송신함수

{

    while((UCSR1A & 0x20) == 0x00);      // UDRE1 = set되어 송신데이터 받을 준비가 되면

    UDR1 = data;                          // 데이터를 UDR1으로.

}

 

void TX1_string(char *string)              // 문자열 전달함수

{                                          // *string 포인터가 문자열파라매터의 첫 글자 주소를 가르킨다.

    while(*string !='\0')                    // 문자열의 끝(null)이 올때까지 이하내용을 수행

    {

        TX1_char(*string);               

        string++;                          // 주소값을 증가시켜 다음문자열 가르킴

    }

}

 

void delay(int delaytime){          //함수선언

int i,j;

for(i=0;i<1000;i++){

for(j=0;j<delaytime;j++){

}

}

}

 

int main(void)

{

    ENABLE1_ON;

    PWM1_ON;

    BREAK1_OFF;

    ENABLE2_ON;

    PWM2_ON;

    BREAK2_OFF;

   

    unsigned char RXD;   

   

    // --------------- UART 1 관련 레지스터 설정 --------------------

    UBRR1H = 0; 

    UBRR1L = 51;          // BUADRATE 결정 51 : 19200 BUAD  송수신 속도 결정

    UCSR1A = 0x00;       

    UCSR1B = 0x18;        // RxDn, TxDn pin ENABLE

UCSR1C = 0x06;        // Parity check disable, 1 stop, 8 data

    RXD = UDR1;          // dummy data read

   

   

    DDRC = 0xFF;

    TX1_string("UART1 OK!!");          // 통신확인 문자 출력

    TX1_char(0x0D);                    // 아스키 문자 CR(CARRIGE RETURN : 커서를 처음으로) 전송

    TX1_char(0x0A);                    // 아스키 문자 LF(LINE FEED : 그다음줄로..) 전송

    while(1)

    {

        RXD = RX1_char_scan();

   

        switch(RXD)                    // 수신받은 값대로 모터 제어

        {

            case '5':

            DIR1_ON;       

            DIR2_ON;   

            PORTG = 0x01;   

            delay(500);//시계

       

            case '4':

            DIR1_ON;       

            DIR2_ON;   

            PORTG = 0x01;   

            delay(250);//시계

           

            case '3':

              ENABLE1_OFF; // 정지

           

            case '2':

            DIR1_ON;       

            DIR2_ON;   

            PORTG = 0x02;   

            delay(250);//반시계

 

            case '1':

            DIR1_ON;       

            DIR2_ON;   

            PORTG = 0x02;   

            delay(500);//반시계

 

            default:

              ENABLE1_OFF; //정지

         

        }

    }

}


 
   
 

 


1