뉴티씨



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


 
UART 통신 테스트
 글쓴이 : 관리자
작성일 : 21-02-24 17:14
조회 : 160  
안녕하세요 고객님,
저희 뉴티씨 제품을 이용해주셔서 감사합니다.

해당 코드 확인 및 컴파일 결과, 정상 출력 되는 것을 확인하였습니다.
고객님이 사용하시는 터미널 프로그램의 문제인 것 같습니다.
다시 한번 설정을 확인하여 주시고, 혹시 한글출력이 안되는 프로그램인지 확인하여 주십시오.

저희가 사용한 터미널 프로그램은 hercules 3.2.8입니다.

감사합니다.

>
>
> 안녕하세요.
>
> ex_Motor_VR_Speed_control_WINAVR_AVRSTUDIO4
>
> 뉴티씨 자료실에 있는 펌웨어 컴파일하여 PC 터미널로 테스트 해보았읍니다.
> 터미널에서 " printf("\r\n\a 현재 모터속도(50~255)\r\n");
> 프린트 되어야 하는데 데이터가 깨져서 나옵니다. 데이터 속도는 9600으로 맞추었읍니다.
> 왜 그럴까요?
>
> //UART 통신제어실습
>
> #include <avr/io.h>
> #include <util/delay.h>
> #include <stdio.h>
>
> #define MOTOR_PORT PORTB
> #define MOTOR_PORT_DDR DDRB
>
> #define SW_PORT PING
> #define SW_PORT_DDR DDRG
>
>
> #define CW 0
> #define CCW 1
>
> #define MAX 255
> #define MIN 50
>
> #define PWM2_ON (MOTOR_PORT|=0x10)
>  #define PWM2_OFF (MOTOR_PORT&=0xEF)
> #define DIR2_CW (MOTOR_PORT|=0x20)
> #define DIR2_CCW (MOTOR_PORT&=0xDF)
> #define ENABLE2_OFF (MOTOR_PORT|=0x40)
> #define ENABLE2_ON (MOTOR_PORT&=0xBF)
> #define BREAK2_ON (MOTOR_PORT|=0x80)
> #define BREAK2_OFF (MOTOR_PORT&=0x7F)
>
> volatile unsigned char temp=60, input;
>
>
> // ADC initialize
> // Conversion time: 75uS
> void adc_init(void)
> {
>  ADCSRA = 0x00; //disable adc
> ADMUX = 0x00;  //select adc input 0
> ADCSRA = 0xC6;
> }
>
> // 입력으로 들어오는 채널의 ADC를 스타트 시킨다.
> void startConvertion(unsigned char ch)
> {
>  ADCSRA = ADCSRA & 0x3f;
> ADMUX = 0x60 | (ch & 0x0f);
> ADCSRA = ADCSRA | 0xc0;
> }
>
> // startConvertion() 후에 수행되며 컨터팅 된 값을 리턴한다. 
> unsigned char readConvertData(void)
> {
>  volatile unsigned char temp;
> while((ADCSRA & 0x10)==0);
> ADCSRA = ADCSRA | 0x10;
> temp = ADCL;
> temp = ADCH;
> ADCSRA = ADCSRA | 0x10;
> return temp;
> }
>
> void init_UART(void)
> {
> UCSR0A=0x00;
> UCSR0B=0x18;
> UCSR0C=0X06;
> UBRR0H=0x00;
> UBRR0L=0x67;
> }
>
> int SerialPutChar(char ch, FILE *fp)
> {
> while(((UCSR0A>>UDRE0)&0x01)==0);
> UDR0 = ch;
> return 0;
> }
>
> int SerialGetChar(FILE *fp)
> {
> while((UCSR0A & 0x80)==0);
> return UDR0;
> }
>
> void Initialize_Timer(void)
> {
>  TCCR0=0x00;
> TCCR0=(0<<CS02)|(0<<CS01)|(1<<CS00)|(1<<WGM00)|(1<<WGM01)|(1<<COM01);
> }
>
> void Initialize_Motor(void)
> {
>  MOTOR_PORT_DDR=0xff;
> MOTOR_PORT=0x00;
> }
>
> void motor_init(void){
> ENABLE2_ON;
>  PWM2_ON;
>  BREAK2_OFF;
> DIR2_CW;
> }
>
>
> void Direction_Control(void){
> input = (SW_PORT&0x0c)>>2;
> if(input == 0x01){
> DIR2_CW;
> }
>  if(input == 0x02){
> DIR2_CCW;
> }
> }
>
> void Status_to_UART(void){
> startConvertion(1); // VARIABLE RESISTOR Converting
> temp = readConvertData();
>
> printf("\r\n\a 현재 모터속도(50~255)\r\n");
> if(temp >= MAX) printf("Now MAX speed ");
> if(temp <= MIN) {
> printf("  Now MIN speed ");
> temp = MIN;
> }
>
> printf("  Motor Speed : %d\n\r",temp);
> _delay_ms(100);
> }
>
>
>
> int main(void)
> {
>    SREG  = 0x00;
>    UCSR0C = 0x06; // 8 bit, 비동기 통신, parity none, stop bit 0
>    UBRR0L = 0x67;  // 16000000/(9600*16) -1; //set baud rate lo 9,600bps
>    UBRR0H = 0;    // set baud rate hi
>    UCSR0B = 0x18; // RX enable, TX enable
>    SREG  = 0x80;  // Global interrupt enable
>
>
> init_UART();              // UART 0 초기화
> Initialize_Timer();
> Initialize_Motor();
> adc_init();
> motor_init();
> SW_PORT_DDR = 0x00;
> fdevopen(SerialPutChar,SerialGetChar);
> printf("\r\n\a모터속도 Encoder테스트 \r\n");
>
>    while(1){
> Status_to_UART();
> OCR0=temp; // Speed Control
> Direction_Control();
> }
>   
> while(0){
>        //scanf("%s", str);
> //SerialPutChar(ch);
> //SerialGetChar( );
> //printf("Input:%s",str);
>    }
> return 0;
> }
>