Перейти к содержанию
    

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

 

Инициализировал 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 бит данных

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

 

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

 

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

 

использую WinAVR

 

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

 

Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа

UCSRB = (1<<RXEN)|(1<<TXEN),

В этом случае упрощается поиск ошибки.

а если по теме, то может быть вы забыли порты Д и Б как выходы настроить ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя у Вас и ошибка инициализации USART, но МК должен был принимать данные, даже неправильные... ИМХО, Вы передаёте с ПК, но СОМ-порт настроен на аппаратное управление потоком, поэтому данные с ПК - не уходят... Чем (какой программой) передаёте? Какие настройки СОМ-порта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Посмотрите, правильно ли у Вас настроен порт D:

Должно быть так: PD0 - вход, PD1 - выход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На ПК ипользую COM Port ToolKit 0.171. А как настроить правильно?
С этой программой - не работал... В настройках СОМ-порта этой программы попробуйте найти "Управление потоком" (или как-то так), и убирите всякое (аппаратное и программное) управление. Для проверки правильности работы программы на ПК необходимо отключить кабель от МК и замкнуть контакты приёмника и передатчика между собой на отключённой стороне кабеля, и попробовать что-то передать: переданные данные должны тут же вернуться обратно (приняться). После чего всё вернуть на место и, зациклив передачу какого либо байта (удобно - символ U), убедиться, что данные доходят до ноги приёмника МК с помощью осциллографа.

Посмотрите, правильно ли у Вас настроен порт D:

Должно быть так: PD0 - вход, PD1 - выход.

Специально ноги приёмника и передатчика на ввод(вывод) выставлять нет необходимости - параллельный порт отключается от ног МК при установке RXEN и TXEN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

попробуйте это

Term2x.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

Код работы с UART содержится в архиве serial.zip, код буфера - в fifobuf.zip

serial.zip

fifobuff.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

--

 

В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я делал на меге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();
                     }
                 }
             }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В UCSRC пишете не правильно вроде, надо бы URSEL ставить в 1.

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

 

Лучше инициализировать не числами (хотя может быть это компилятор виноват, не силен я в С) а записями типа

UCSRB = (1<<RXEN)|(1<<TXEN),

В этом случае упрощается поиск ошибки.

+1!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...