реклама на сайте
подробности

 
 
> Виснет USART
zheka
сообщение Dec 22 2010, 13:34
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа, ковыряюсь с USART, есть проблемы.
Контроллер 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"

  };
  
}


Отлаживаю оригинально, но без JTAG - привык только так.
Что означают выводимые на экран символы - читайте выше, в комментария к коду. А на экране появляется строка "Старт 2 3 1 2 3 1 2"

Добавлю - в этот момент на USART ничего не передается, отключил передачу сразу как понял что программа не хочет бесконечно ждать символа.

Ошибок монтажа точно нет, игрался с терминалом примитивными командами - байты отправляет/байты принимает.

Код содрал из оригинальной прошивки, написанной для IAR. Может где и намухлевал, сами знаете, перенос кода мерзкое дело.
В чем причина зависания?

P.S. выкладываю оригинальную программу для mega48, которую и хочу встроить в другую программу, написанную под CodeVision и mega32.

Сообщение отредактировал zheka - Dec 22 2010, 13:36
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zheka   Виснет USART   Dec 22 2010, 13:34
- - defunct   Цитата(zheka @ Dec 22 2010, 18:34) Господ...   Dec 22 2010, 15:07
- - zheka   defunct, я попробую, а в ознакомьтесь пока с неглю...   Dec 22 2010, 15:20
|- - Fry__   Цитата(zheka @ Dec 22 2010, 22:20) Кроме ...   Dec 22 2010, 16:12
- - zheka   КодЗамени лог. условие "&&" на ...   Dec 23 2010, 00:51
|- - _Pasha   Цитата(zheka @ Dec 23 2010, 06:51) Вы еще...   Dec 23 2010, 04:42
||- - Палыч   Цитата(_Pasha @ Dec 23 2010, 10:42) Попро...   Dec 23 2010, 05:04
|- - Fry__   Цитата(zheka @ Dec 23 2010, 07:51) КодЗам...   Dec 23 2010, 06:53
- - alexeyv   to Fry__ ЦитатаЗамени лог. условие "&...   Dec 23 2010, 00:56
- - zheka   Только что прощупал осциллографом линии TxD и RxD....   Dec 23 2010, 01:07
- - alexeyv   Каким компилятором пользуешься? Код#define TO_cnt ...   Dec 23 2010, 01:26
- - zheka   ЦитатаКаким компилятором пользуешься? Я пользуюсь ...   Dec 23 2010, 01:50
- - -=Женек=-   ЦитатаНа линии RxD у меня все время лог.1. Порылся...   Dec 23 2010, 03:35
- - zheka   Господа, причина, условно говоря найдена. Код напи...   Dec 23 2010, 05:23
- - alexeyv   У меня в старой схеме: 1. между DP-GND и DM-GND ст...   Dec 23 2010, 06:02
- - zheka   alexeyv у меня по такой же схеме как и здесь собра...   Dec 23 2010, 06:32
- - fantex   При передаче по цепи RxD вывод 9 идет звон и навод...   Dec 23 2010, 11:04
- - zheka   ЦитатаПри передаче по цепи RxD вывод 9 идет звон и...   Dec 23 2010, 13:41


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 17:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016