#include <avr/io.h>
#define F_CPU 16000000UL
#include <avr/delay.h>
#include <avr/interrupt.h>
void port_init(void)
{
DDRA=0xff;
PORTD=0xff; // 포트D 내부 풀업 사용(스위치)
EICRA=0x02; // falling edge
EIMSK=0x0f; // INT0,1,2 Enable
}
void putch0(unsigned char data) // TXD0 명령어 전송
{
while(!(UCSR0A&0x20)); // Wait if a byte is being transmitted
UDR0 = data; // Transmit data
}
void putch1(unsigned char data) // TXD1 명령어 전송
{
while(!(UCSR1A&0x20)); // Wait if a byte is being transmitted
UDR1 = data; // Transmit data
}
int main()
{
int i=0;
UCSR0B=0x18; // Rx, Tx enable
UCSR0C=0x06; // 비동기 방식, No Parity bit, 1 Stop bit, 8 데이터 비트 설정
UBRR0H=0; UBRR0L=0x08; // 115200 bps 보레이트 설정
DDRE=0xfe; // uart0 Rx(입력 0), Tx(출력 1) 설정
UCSR1B=0x18; // Rx, Tx enable
UCSR1C=0x06; // 비동기 방식, No Parity bit, 1 Stop bit, 8 데이터 비트 설정
UBRR1H=0; UBRR1L=0x08; // 115200 bps 보레이트 설정
DDRD=0xff; // uart1 Rx(입력 0), Tx(출력 1) 설정
/*모터 드라이브 1*/
unsigned char speed0[]="SS1000,1000!"; // 속도 설정
unsigned char text1[]="Ss100,100!"; // 가/감속 구간의 시간 설정
unsigned char text2[]="PE0001!"; // 통신포트 설정
unsigned char text3[]="SM0202!"; // 위치제어 모드
unsigned char return0[]="PA5100000,5100000!"; // 원점으로
i=0;
while(speed0[i])putch0(speed0[i++]); //명령어 전송 TXD0 으로
_delay_ms(100);
i=0;
while(text1[i])putch0(text1[i++]);
_delay_ms(100);
i=0;
while(text2[i])putch0(text2[i++]);
_delay_ms(100);
i=0;
while(text3[i])putch0(text3[i++]);
_delay_ms(100);
i=0;
while(return0[i])putch0(return0[i++]);
_delay_ms(100);
/*모터 드라이브 2*/
unsigned char speed00[]="SS1000,1000!"; // 속도 설정
unsigned char text11[]="Ss100,100!"; // 가/감속 구간의 시간 설정
unsigned char text22[]="PE0001!"; // 통신포트 설정
unsigned char text33[]="SM0202!"; // 위치제어 모드
unsigned char return1[]="PA5100000,5100000!"; // 원점으로
i=0;
while(speed00[i])putch1(speed00[i++]); //명령어 전송 TXD1 으로
_delay_ms(100);
while(text11[i])putch1(text11[i++]);
_delay_ms(100);
i=0;
while(text22[i])putch1(text22[i++]);
_delay_ms(100);
i=0;
while(text33[i])putch1(text33[i++]);
_delay_ms(100);
i=0;
while(return1[i])putch1(return1[i++]);
_delay_ms(100);
}
하이퍼 터미널로 했을 때는 각각 통신이되는데
모터드라이브로 통신을하면 충돌이 일어나는지 하나의 모터드라이브밖에 실행이되지 않습니다.
어떤 문제인가요 ?
aa
polling방식으로 순차적으로 모터와 통신이 구현되어 있으므로 구조가 문제가 있어 보입니다.
모터안의 딜레이가 너무 많네요, 모터도 동시에 구현되도록 인터럽트 방식으로 구현해보세요.