Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART на mega32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Freeze Anti
Собственно, сабж.

Инициализировал 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 выходом. делал. не помогло.
Палыч
По-моему:
UCSRC = 0x06; // Разряды UCSZx установлены для передачи 8 бит данных
P.S. Для наглядности и защиты от ошибок лучше записывать так:
UCSRC = (1 < < UCSZ1) | (1 < < UCSZ0); // Разряды UCSZx установлены для передачи 8 бит данных
smac
Цитата(Freeze Anti @ Aug 5 2008, 11:16) *
Собственно, сабж.

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



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

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

использую WinAVR

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


Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа
UCSRB = (1<<RXEN)|(1<<TXEN),
В этом случае упрощается поиск ошибки.
а если по теме, то может быть вы забыли порты Д и Б как выходы настроить ?
Палыч
Хотя у Вас и ошибка инициализации USART, но МК должен был принимать данные, даже неправильные... ИМХО, Вы передаёте с ПК, но СОМ-порт настроен на аппаратное управление потоком, поэтому данные с ПК - не уходят... Чем (какой программой) передаёте? Какие настройки СОМ-порта?
Freeze Anti
Ошибку в инициализации уже исправил. Не помогает.

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

На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно?
sysel
Попробуйте исключить компьютер из ваших экспериментов - закоротите выход USART на вход прямо на микроконтроллере и подолжить эксперименты.

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

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

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

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

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

Код работы с UART содержится в архиве serial.zip, код буфера - в fifobuf.zip
SysRq
Цитата(haker_fox @ Aug 5 2008, 13:07) *
Настройка портов не влияет на функциональность UART.

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

--

В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.
UniBomb
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 */

Здесь как раз и происходит то, о чём я говорил выше...
Зайцев Иван
я делал на меге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();
                     }
                 }
             }
haker_fox
Цитата(SysRq @ Aug 5 2008, 18:13) *
В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.

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

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

+1!
Freeze Anti
спасибо за подсказку про URSEL. сейчас попробую.

и еще спасибо за подсказку про настройки компьютера. я почему-то упустил из виду, что раньше использовал эту программу под Win98, а теперь - под WinXP... действительно, проверил сигналы на входе MAX232. уходит нормальный сигнал, а вот приходит один всплеск очень короткий... я почему-то думаю, что именно здесь собака и порылась... программа, которая была в одном из аттачей не помогает... сейчас посмотрю, что выложил hacker_fox...
haker_fox
Цитата(Freeze Anti @ Aug 5 2008, 18:41) *
спасибо за подсказку про URSEL. сейчас попробую.

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

Замкните ножки MAX232, которые на МК уходят. В терминалке при посылке символа Вы должны получить эхо и это обязательно!

Цитата(Freeze Anti @ Aug 5 2008, 18:41) *
сейчас посмотрю, что выложил hacker_fox...

Да еще, не пугайтесь, там идет программирование с приминением класса. Но это делу не помешает. Самое главное посмотреть код. + есть там дополнительные интересный фичи: вывод числа, получение строки...
Не знаю, советовали ли (всю ветку внимательно не читал), но проверьте ну выскокая ли у Вас ошибка для заданной скорости UART и системной частоте МК.
VladimirYU
Цитата(Freeze Anti @ Aug 5 2008, 11:16) *
Собственно, сабж.

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

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


ИМХО в меге 32 регистры UCSRC и UBRRH имеют один и тот же адрес в области I/O, для доступа к UCSRC надо установить в 1 старший бит URSEL. В вашем случае:
UCSRC = (0x03|(1<<URSEL));
Freeze Anti
Всем огромное спасибо за ответы. Рядом с max232 был непропай на плате. Установкой перемычки проблему удалось устранить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.