Контроллер mega32, 16МГц, настроен USART на 250кбод, 8бит , 2 стоповых бита.
Суть программы проста - принимать от FT232R байты, отправлять их по SPI, затем принимать по SPI и отправлять по USART на FT232R. Такой USB-SPI преобразователь.
В бесконечном цикле пытаюсь дождаться стартового слова 0xAA. Каждый раз на второй итерации программа замирает.
Вот код
Код
#define TO_cnt 100000
unsigned char TimeOut;
......
void InitUART(void)
//Настраивает UART на 250000 бод - настройки взяты из исходника устройства, принцип общения с USART которого я хочу повторить в точности ибо работает с заточенным под него ненастраиваемым софтом
{
DDR_RXD =0;
DDR_TXD =1;
UBRRL = 3;//250кБод при 16 МГц (у оригинального устройства стояло "1" - 250кбод при 8 МГц)
UBRRH = 0;
UCSRA = 0;
UCSRC = (1<<USBS)|(3<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN);
}
ubyte RcvUART0(void)
//дожидается прихода байта в UART0 и возвращает его
{
ulong cnt=0;
unsigned char dat;
PutString("2 "); // очередной запуск функции чтения байта - выводится символ "2"
while((((UCSRA)&(1<<RXC))==0) &&(cnt<TO_cnt))cnt++;//ждем приход байта c таймаутом // В ЭТОЙ СТРОКЕ СУДЯ ПО ВСЕМУ И ПРОИСХОДИТ ЗАВИСАНИЕ НА ВТОРОЙ ИТЕРАЦИИ БЕСКОНЕЧНОГО ЦИКЛА В ОСНОВНОЙ ПРОГРАММЕ
if(cnt>=TO_cnt){
PutString("3 "); //если не дождались байта по таймауту, то символ "3" появляется на экране
TimeOut=1;
return 0;
}
return UDR; //Возвращаем его
}
void SendUART(ubyte data)
{
while((UCSRA&(1<<UDRE))==0);//ждем освобождения буфера передатчика
UDR = data;
}
void main()
{
ubyte data;
ubyte cnt;
InitTFTPort();
InitUART();
SetBackLight(255);
ClrScr();
CursorXY(100,50);
PutString("Старт");
//ждем команду
while(1){
TimeOut = 0; //Таймаут приема одного байта
cnt=0;
//Ждем, когда придет первый байт пакета
if(RcvUART0()==0xAA){
while(TimeOut==0){
data = RcvUART0();
if(TimeOut==0){
// data = Send2SPI(data);
if ((data == 0xFF)&&(cnt==0))cnt=10;
if (cnt>0){
cnt--;
SendUART(data);
}
}
}
};
PutString("1 "); //очередная итерация бесконечного цикла - выводится символ "1"
};
}
unsigned char TimeOut;
......
void InitUART(void)
//Настраивает UART на 250000 бод - настройки взяты из исходника устройства, принцип общения с USART которого я хочу повторить в точности ибо работает с заточенным под него ненастраиваемым софтом
{
DDR_RXD =0;
DDR_TXD =1;
UBRRL = 3;//250кБод при 16 МГц (у оригинального устройства стояло "1" - 250кбод при 8 МГц)
UBRRH = 0;
UCSRA = 0;
UCSRC = (1<<USBS)|(3<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN);
}
ubyte RcvUART0(void)
//дожидается прихода байта в UART0 и возвращает его
{
ulong cnt=0;
unsigned char dat;
PutString("2 "); // очередной запуск функции чтения байта - выводится символ "2"
while((((UCSRA)&(1<<RXC))==0) &&(cnt<TO_cnt))cnt++;//ждем приход байта c таймаутом // В ЭТОЙ СТРОКЕ СУДЯ ПО ВСЕМУ И ПРОИСХОДИТ ЗАВИСАНИЕ НА ВТОРОЙ ИТЕРАЦИИ БЕСКОНЕЧНОГО ЦИКЛА В ОСНОВНОЙ ПРОГРАММЕ
if(cnt>=TO_cnt){
PutString("3 "); //если не дождались байта по таймауту, то символ "3" появляется на экране
TimeOut=1;
return 0;
}
return UDR; //Возвращаем его
}
void SendUART(ubyte data)
{
while((UCSRA&(1<<UDRE))==0);//ждем освобождения буфера передатчика
UDR = data;
}
void main()
{
ubyte data;
ubyte cnt;
InitTFTPort();
InitUART();
SetBackLight(255);
ClrScr();
CursorXY(100,50);
PutString("Старт");
//ждем команду
while(1){
TimeOut = 0; //Таймаут приема одного байта
cnt=0;
//Ждем, когда придет первый байт пакета
if(RcvUART0()==0xAA){
while(TimeOut==0){
data = RcvUART0();
if(TimeOut==0){
// data = Send2SPI(data);
if ((data == 0xFF)&&(cnt==0))cnt=10;
if (cnt>0){
cnt--;
SendUART(data);
}
}
}
};
PutString("1 "); //очередная итерация бесконечного цикла - выводится символ "1"
};
}
Отлаживаю оригинально, но без JTAG - привык только так.
Что означают выводимые на экран символы - читайте выше, в комментария к коду. А на экране появляется строка "Старт 2 3 1 2 3 1 2"
Добавлю - в этот момент на USART ничего не передается, отключил передачу сразу как понял что программа не хочет бесконечно ждать символа.
Ошибок монтажа точно нет, игрался с терминалом примитивными командами - байты отправляет/байты принимает.
Код содрал из оригинальной прошивки, написанной для IAR. Может где и намухлевал, сами знаете, перенос кода мерзкое дело.
В чем причина зависания?
P.S. выкладываю оригинальную программу для mega48, которую и хочу встроить в другую программу, написанную под CodeVision и mega32.