Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 17.01.2011, 20:26  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Я делаю так
в прерывании USART кладем принятый символ в масив[UART2Count] , инкремент указателя UART2Count, далее

if ( UART2Count › 7)// если приняли кодограмму( длинна 8 байт)
{
if ((UART2Buffer[0] == 0x24) & (UART2Buffer[6] == 0x0D ) & (UART2Buffer[7] == 0x0A))
{ обрабатываю пакет
UART2Count =0;
}
}
else // иначе сдвигаем буфер на 1 позицию в сторону младшего байта
{
UART2Buffer[0] = UART2Buffer[1] ;
UART2Buffer[1] = UART2Buffer[2] ;
.........
UART2Buffer[6] = UART2Buffer[7] ;

UART2Count -= 1;
}
в данном случае 0x24 (знак $)начало пакета, 0x0D и 0x0A окончание.
Реклама:
diglook вне форума  
Непрочитано 18.01.2011, 11:31  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

diglook, спасибо. я пока что спрашивал про отправку. как обрабатывать буфер у меня вопросов нет. меня интересует как правильно отправлять и принимать (прием с использованием прерывания и может с кольцевым буфером).
у меня проблема в том, что мега324 принимает не совсем то, что ей отправляет 1281.
поэтому хотелось бы сначала удостоверится что мой код отправки правилен.
code-by вне форума  
Непрочитано 18.01.2011, 13:49  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

заполняем буфер, В месте проги где принимаешь решение об отправке в UDR отправляем arey[UART2_Transmit_Count] и продолжаем заниматся чем надо,
по прерыванию окончание передачи по USART инкремент UART2_Transmit_Count, проверяем if(UART2_Transmit_Count ‹ длинна пакета) в UDR отправляем arey[UART2_Transmit_Count]-т.е следующий байт. если передача закончена свистим об окончании или ничего не делаем.
Цитата:
проблема в том, что мега324 принимает не совсем то, что ей отправляет 1281
подробнее можно? может неправильные настройки (скорость,четность, и т.д.)
diglook вне форума  
Непрочитано 18.01.2011, 14:50  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

код для меги1281 см. чуть выше.

код программы приема (работает неправильно):

Код:
// CPU 4MHz, char is unsigned

#include ‹mega324.h›
#include ‹stdio.h›
#include ‹delay.h›

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1‹‹FE)
#define PARITY_ERROR (1‹‹UPE)
#define DATA_OVERRUN (1‹‹OVR)
#define DATA_REGISTER_EMPTY (1‹‹UDRE)
#define RX_COMPLETE (1‹‹RXC)

#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0‹256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif

bit rx_buffer_overflow0;


// сгенерированно генератором codevision (кроме PORTB):
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
   {
      rx_counter0=0;     
      rx_buffer_overflow0=1; 
      PORTB.5=0;
   };
}
else
{
    PORTB.5=0;
}
}

// сгенерированно генератором codevision (кроме PORTB):

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif


void main(void)
{

unsigned char s;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=1 State6=1 State5=1 State4=T State3=T State2=T State1=T State0=T 
PORTB=0xE0;
DDRB=0xE0;

// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x98;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x19;

#asm("sei")

while (1)
{
      
      s=getchar();
      if(s!='')
      {
        printf("%с",s);
      }     

};
}

Последний раз редактировалось code-by; 18.01.2011 в 14:53.
code-by вне форума  
Непрочитано 18.01.2011, 15:27  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

давай по другому
Цитата:
принимает не совсем то, что ей отправляет
исходя из чего Вы сделали такие выводы?
что отправили? что приняли? ошибка постоянно или периодически?

У меня был случай: GPS модуль шлет данные в АВР, иногда проскакивают "казяблики",
оказалось что провода RX и TX перепутаны, а длинна проводов около 1метра, так АВР умудрялся принимать данные по наводке
diglook вне форума  
Непрочитано 18.01.2011, 17:04  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

я делаю симуляцию в шпротеусе 7.4. самое интересное, что когда отправляю с терминала 1 на мегу324 и вывожу на терминал 2, то всё нормально. когда отправляю с мега1281 на Т1, то тоже всё нормально (за исключением того, чтобы в терминалах правильно выводились символы, отправляемые с МК, их скорость надо ставить другую).
Но когда отправляю с М1281 на М324 и М324 выводит принятое, то выводится совсем не то, что надо. А просто отправляемый текст с М324 выводит всё-равно правильно.
Может это шпротеус так глючит?
code-by вне форума  
Непрочитано 18.01.2011, 19:33  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Цитата:
Может это шпротеус так глючит?
такое иногда бывает, это проверяется на железе, Поэтому лучше сразу делать макет и мучать его а не симулятор.
diglook вне форума  
 

Закладки

Метки
avr, uart, буфер
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инверсия uart в at89c52 sanek231081 Микроконтроллеры, АЦП, память и т.д 2 04.01.2011 11:22
Симуляция UART для AVR studio mm12345 Микроконтроллеры, АЦП, память и т.д 0 22.11.2010 15:40
Подключение Siemens A52 по UART serb-radio Микроконтроллеры, АЦП, память и т.д 2 30.09.2010 07:15
Нужно 2 UART на мк , как быть? Zemlyanov Микроконтроллеры, АЦП, память и т.д 77 04.05.2010 19:26
Нужна простая библиотечка программного UART на С DK Микроконтроллеры, АЦП, память и т.д 7 08.04.2010 06:01


Часовой пояс GMT +4, время: 05:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot