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