뉴티씨



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

 

 
시리얼통신 모터제어 질문입니다.
 글쓴이 : 관리자
작성일 : 18-03-23 14:50
조회 : 25,919  
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.

제가 대강보니 소스에서 Interrupt로 수신하여 받는 것이 좋겠습니다.

여기서는 폴링으로 계속 체크해서 받고 하는 식으로 되는데,
평상시에 데이터가 없으니 NULL을 받은 것으로 인식해서,
모터를 계속 스톱시키는 명령이 들어가는 것 같습니다.

참고하시기 바랍니다.
감사합니다.

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