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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> USART на mega32, пердает нормально, а принимать не хочет
Freeze Anti
сообщение Aug 5 2008, 07:16
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Собственно, сабж.

Инициализировал USART. сигнал с контроллера передается номально. По компорту ловлю на компьютере. А вот если с компьютера передавать - нет реакции. Вот кусок кода моей программы

Код
UBRRH = 0;
UBRRL = 103;  // Скорость обмена USART 9600 бод
UCSRB = 0x18; /* Устанавливаем разряды TXEN и RXEN для
         активизации USART в режиме ввода/вывода через
         выводы 0 и 1 порта D */
UCSRC = 0x03; // Разряды UCSZx установлены для передачи 8 бит данных
while (1)
{

    if(UCSRA & 0x80)
    {
        USARTBuffer = UDR;
        PORTB = USARTBuffer & 0xE0;
        PORTD = (USARTBuffer << 3) & 0xE0;
    }
    
}


просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции.

где может быть ошибка?

использую WinAVR

зы. видел тут в одной из соседних тем советовали указать при инициализации порта RxD выходом. делал. не помогло.


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 5 2008, 07:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



По-моему:
UCSRC = 0x06; // Разряды UCSZx установлены для передачи 8 бит данных
P.S. Для наглядности и защиты от ошибок лучше записывать так:
UCSRC = (1 < < UCSZ1) | (1 < < UCSZ0); // Разряды UCSZx установлены для передачи 8 бит данных
Go to the top of the page
 
+Quote Post
smac
сообщение Aug 5 2008, 07:34
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Freeze Anti @ Aug 5 2008, 11:16) *
Собственно, сабж.

Инициализировал USART. сигнал с контроллера передается номально. По компорту ловлю на компьютере. А вот если с компьютера передавать - нет реакции. Вот кусок кода моей программы ...



просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции.

где может быть ошибка?

использую WinAVR

зы. видел тут в одной из соседних тем советовали указать при инициализации порта RxD выходом. делал. не помогло.


Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа
UCSRB = (1<<RXEN)|(1<<TXEN),
В этом случае упрощается поиск ошибки.
а если по теме, то может быть вы забыли порты Д и Б как выходы настроить ?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 5 2008, 07:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Хотя у Вас и ошибка инициализации USART, но МК должен был принимать данные, даже неправильные... ИМХО, Вы передаёте с ПК, но СОМ-порт настроен на аппаратное управление потоком, поэтому данные с ПК - не уходят... Чем (какой программой) передаёте? Какие настройки СОМ-порта?
Go to the top of the page
 
+Quote Post
Freeze Anti
сообщение Aug 5 2008, 07:59
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Ошибку в инициализации уже исправил. Не помогает.

Светодиодами уже моргал без усарта. Здесь ошибки нет.

На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно?


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
sysel
сообщение Aug 5 2008, 08:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852



Попробуйте исключить компьютер из ваших экспериментов - закоротите выход USART на вход прямо на микроконтроллере и подолжить эксперименты.

Посмотрите, правильно ли у Вас настроен порт D:
Должно быть так: PD0 - вход, PD1 - выход.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 5 2008, 08:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Freeze Anti @ Aug 5 2008, 10:59) *
На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно?
С этой программой - не работал... В настройках СОМ-порта этой программы попробуйте найти "Управление потоком" (или как-то так), и убирите всякое (аппаратное и программное) управление. Для проверки правильности работы программы на ПК необходимо отключить кабель от МК и замкнуть контакты приёмника и передатчика между собой на отключённой стороне кабеля, и попробовать что-то передать: переданные данные должны тут же вернуться обратно (приняться). После чего всё вернуть на место и, зациклив передачу какого либо байта (удобно - символ U), убедиться, что данные доходят до ноги приёмника МК с помощью осциллографа.
Цитата
Посмотрите, правильно ли у Вас настроен порт D:
Должно быть так: PD0 - вход, PD1 - выход.
Специально ноги приёмника и передатчика на ввод(вывод) выставлять нет необходимости - параллельный порт отключается от ног МК при установке RXEN и TXEN
Go to the top of the page
 
+Quote Post
sKWO
сообщение Aug 5 2008, 08:28
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(Freeze Anti @ Aug 5 2008, 10:59) *
На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно?

попробуйте это
Прикрепленные файлы
Прикрепленный файл  Term2x.rar ( 245.49 килобайт ) Кол-во скачиваний: 35
 


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 5 2008, 08:44
Сообщение #9


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Freeze Anti @ Aug 5 2008, 06:16) *
Просто пытаюсь поморгать светодиодами в зависимости от пришедших данных. ноль реакции. Где может быть ошибка?

Покажите, как у вас настроены порты B и D? Может быть они настроены на ввод?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 5 2008, 09:11
Сообщение #10


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(=GM= @ Aug 5 2008, 17:44) *
Покажите, как у вас настроены порты B и D? Может быть они настроены на ввод?

Настройка портов не влияет на функциональность UART.

В архиве приложил свою библиотечку. 100% рабочая! Код не комментирован. С помощью макросов есть возможность выбрать работу с программным FIFO буфером, прерываниями, а также выбрать платформу - AVR или ARM (не до конца портирован).

Код работы с UART содержится в архиве serial.zip, код буфера - в fifobuf.zip
Прикрепленные файлы
Прикрепленный файл  serial.zip ( 2.14 килобайт ) Кол-во скачиваний: 48
Прикрепленный файл  fifobuff.zip ( 975 байт ) Кол-во скачиваний: 38
 


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Aug 5 2008, 09:13
Сообщение #11


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(haker_fox @ Aug 5 2008, 13:07) *
Настройка портов не влияет на функциональность UART.

А на этих портах предположительно светодиоды висят, речь не об USART..

--

В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.
Go to the top of the page
 
+Quote Post
UniBomb
сообщение Aug 5 2008, 09:14
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416



Freeze Anti, во-первых регистры UBRR и UCSRС находятся по одному адресу, посему существует некая последовательность действий, а именно - сначала записывать в регистр UBRR (что в данном случае верно), а вторая - перед записью в регистр UCSRС нужно сначала установить флаг URSEL, т.о. вот так:

Код
UBRRH = 0;
UBRRL = 103;
UCSRC = (1 << URSEL|1 << UCSZ1|1 << UCSZ0);

А в твоём случае скорость устанавливалась скорость непойми какая (самая маленькая) и 5 бит посылка (по умолчанию).

Теперь что касается конфигурации портов - их вообще не нужно трогать, т.к. внутренний мультиплексор при конфигурировании сам законтачивает их на регистр приёмо-передатчика. Всё. При сконфигурированном УСАРТЕ мк уже не важно что находится в соответсвующих регистрах DDRx и PORTx.

Теперь что касается записи:
Код
UCSRB = 0x18; /* Устанавливаем разряды TXEN и RXEN для
      активизации USART в режиме ввода/вывода через
         выводы 0 и 1 порта D */

Здесь как раз и происходит то, о чём я говорил выше...

Сообщение отредактировал UniBomb - Aug 5 2008, 09:16
Go to the top of the page
 
+Quote Post
Зайцев Иван
сообщение Aug 5 2008, 09:19
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-07-08
Из: Екатеринбург
Пользователь №: 39 153



я делал на меге32 8МГц

Код
#include "bn-185_usart.h"

/******************************************************************************
    Инициализация
******************************************************************************/
void USART_Init(void)
     {
      UCSRB = 0x98;                // (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
      UCSRC = 0x86;                // 1000 0110
      UBRRH = 0x00;
      UBRRL = 12;
     }
void USART_InitDBG(void)
     {
    
     }
/******************************************************************************
    Передача байта
******************************************************************************/
void USART_Transmit(u08 D)
     {
      while(bit_is_clear(UCSRA,UDRE));
      UDR = D;
     }
/******************************************************************************
    Прием байта
******************************************************************************/
u08 USART_Receive(void)
     {
      u08 D=0;
      while(bit_is_clear(UCSRA,RXC));
      D = UDR;
      return D;
     }
/******************************************************************************
    Передача строки
******************************************************************************/
void USART_TransmitStr(char s[])
     {
      u08 i;
      for(i=0;i<64;i++)
         {
          if(s[i]=='\0') break;
          USART_Transmit(s[i]);
         }
     }
/******************************************************************************
    Передача строки из флеш памяти
******************************************************************************/
void USART_TransmitStrFLASH(const char *pFlashStr)
     {
      u08 i;
      
      for(i=0;pgm_read_byte(&pFlashStr[i]) && i<60; i++)
         {
          USART_Transmit(pgm_read_byte(&pFlashStr[i]));
         }
     }
/******************************************************************************
    ОБРАБОТЧИК ПРЕРЫВАНИЯ - ОКОНЧАНИЕ приема символа USART
******************************************************************************/
SIGNAL(SIG_USART_RECV)
     {
      UART_cmd = UDR;
      RxTimOvf = 0;
      if(UART_cmd==FirstRx)
         {
          // первый принятый байт = 0x5A?
          // если верен читаем дальше
          RxTimOvf--;
          TCCR0 = 0x00;                    // Timer0 stop
          TCNT0 = 0xEC;                    // переполнение 0.0026 sec
          sbi(TIMSK,TOIE0);                // enable interrupt
          TCCR0 = 0x05;                    // F=Fclk/1024
          
          cbi(UCSRB,RXCIE);                // запрет прерываний по приему
         }
     }
/******************************************************************************
    ОБРАБОТЧИК ПРЕРЫВАНИЯ - очистка бита UDRE
******************************************************************************/
SIGNAL(SIG_USART_DATA )
     {
    
     }
/******************************************************************************
    ОБРАБОТЧИК ПРЕРЫВАНИЯ - ОКОНЧАНИЕ передачи символа USART
******************************************************************************/
SIGNAL(SIG_USART_TRANS)
     {
    
     }
/******************************************************************************
bn-185_usart.h
******************************************************************************/
#define    FirstRx            0x5A            // Первый байт КОМАНДЫ
#define    cmdUnk            0x50            // КОМАНДА - неизвестна

#define    cmdRS            0x20            // КОМАНДА - тест RS232
#define    cmdAx            0x21            // КОМАНДА - передать данные Ax
#define    cmdAy            0x22            // КОМАНДА - передать данные Ay
#define    cmdAz            0x23            // КОМАНДА - передать данные Az
#define    cmdWx            0x24            // КОМАНДА - передать данные Wx
#define    cmdWy            0x25            // КОМАНДА - передать данные Wy
#define    cmdWz            0x26            // КОМАНДА - передать данные Wz
#define    cmdAxT            0x27            // КОМАНДА - передать данные AxT
#define    cmdAyT            0x28            // КОМАНДА - передать данные AyT
#define    cmdAzT            0x29            // КОМАНДА - передать данные AzT
#define    cmdWxT            0x2A            // КОМАНДА - передать данные WxT
#define    cmdWyT            0x2B            // КОМАНДА - передать данные WyT
#define    cmdWzT             0x2C            // КОМАНДА - передать данные WzT
#define    cmdReadEEPROM   0x2D
#define    cmdWriteEEPROM  0x2E

#define    cmdAxAxT        0x30            // КОМАНДА - передать данные Ax AxT
#define    cmdAyAyT        0x31            // КОМАНДА - передать данные Ay AyT
#define    cmdAzAzT        0x32            // КОМАНДА - передать данные Az AzT
#define    cmdWxWxT        0x33            // КОМАНДА - передать данные Wx WxT
#define    cmdWyWyT        0x34            // КОМАНДА - передать данные Wy WyT
#define    cmdWzWzT        0x35            // КОМАНДА - передать данные Wz WzT

#define    cmdReadIDF        0x40
#define    cmdWritIDF        0x41
/******************************************************************************

******************************************************************************/

/******************************************************************************

******************************************************************************/
#define    erError            0xE0            // ОШИБКА - глобальная
#define    erUnkCmd        0xE1            // ОШИБКА - команда неизвестна


Ну и использование
Код
          USART_Init();
          
          RxTimOvf = 0x00;
          cmd_RS   = 0x00;
          TIMSK    = 0x00;
          
          sei();
          
          USART_TransmitStrFLASH(SOME_STRING);                //
          USART_TransmitStrFLASH(ENABLE_INT);                //
          
          for(;;)
             {
              if(RxTimOvf!=0)
                 {
                  code_CMD = USART_Receive();                //
                  if(code_CMD<cmdRS)                        // код меньше 0x20
                     {
                      USART_TransmitStrFLASH(BAD_COMMAND);    //
                     }
                  else
                  if(code_CMD>=cmdUnk)                        // код больше 0x50
                     {
                      USART_TransmitStrFLASH(UNKNOW_COMMAND);    //
                     }
                  if(cmdRS<code_CMD<cmdUnk)
                     {
                      ExeCommand();
                     }
                 }
             }
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 5 2008, 09:40
Сообщение #14


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(SysRq @ Aug 5 2008, 18:13) *
В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.

Как я верно понял, это Вы не мне?)

Цитата(smac @ Aug 5 2008, 16:34) *
Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа
UCSRB = (1<<RXEN)|(1<<TXEN),
В этом случае упрощается поиск ошибки.

+1!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Freeze Anti
сообщение Aug 5 2008, 09:41
Сообщение #15


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



спасибо за подсказку про URSEL. сейчас попробую.

и еще спасибо за подсказку про настройки компьютера. я почему-то упустил из виду, что раньше использовал эту программу под Win98, а теперь - под WinXP... действительно, проверил сигналы на входе MAX232. уходит нормальный сигнал, а вот приходит один всплеск очень короткий... я почему-то думаю, что именно здесь собака и порылась... программа, которая была в одном из аттачей не помогает... сейчас посмотрю, что выложил hacker_fox...


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:24
Рейтинг@Mail.ru


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