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

 
 
> 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
 
Start new topic
Ответов
Зайцев Иван
сообщение Aug 5 2008, 09:19
Сообщение #2


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Freeze Anti   USART на mega32   Aug 5 2008, 07:16
- - Палыч   По-моему: UCSRC = 0x06; // Разряды UCSZx установле...   Aug 5 2008, 07:26
- - smac   Цитата(Freeze Anti @ Aug 5 2008, 11:16) С...   Aug 5 2008, 07:34
- - Палыч   Хотя у Вас и ошибка инициализации USART, но МК дол...   Aug 5 2008, 07:46
- - Freeze Anti   Ошибку в инициализации уже исправил. Не помогает. ...   Aug 5 2008, 07:59
|- - sysel   Попробуйте исключить компьютер из ваших эксперимен...   Aug 5 2008, 08:05
|- - Палыч   Цитата(Freeze Anti @ Aug 5 2008, 10:59) Н...   Aug 5 2008, 08:18
|- - sKWO   Цитата(Freeze Anti @ Aug 5 2008, 10:59) Н...   Aug 5 2008, 08:28
- - =GM=   Цитата(Freeze Anti @ Aug 5 2008, 06:16) П...   Aug 5 2008, 08:44
|- - haker_fox   Цитата(=GM= @ Aug 5 2008, 17:44) Покажите...   Aug 5 2008, 09:11
|- - SysRq   Цитата(haker_fox @ Aug 5 2008, 13:07) Нас...   Aug 5 2008, 09:13
|- - haker_fox   Цитата(SysRq @ Aug 5 2008, 18:13) В UCSRC...   Aug 5 2008, 09:40
- - UniBomb   Freeze Anti, во-первых регистры UBRR и UCSRС наход...   Aug 5 2008, 09:14
- - Freeze Anti   спасибо за подсказку про URSEL. сейчас попробую. ...   Aug 5 2008, 09:41
|- - haker_fox   Цитата(Freeze Anti @ Aug 5 2008, 18:41) с...   Aug 5 2008, 09:47
- - VladimirYU   Цитата(Freeze Anti @ Aug 5 2008, 11:16) С...   Aug 5 2008, 11:23
- - Freeze Anti   Всем огромное спасибо за ответы. Рядом с max232 бы...   Aug 5 2008, 11:38


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

 


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


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