Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.01.2011, 20:26
|
|
Временная регистрация
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
|
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 окончание.
|
|
|
|
18.01.2011, 11:31
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Кольцевой буфер uart
diglook, спасибо. я пока что спрашивал про отправку. как обрабатывать буфер у меня вопросов нет. меня интересует как правильно отправлять и принимать (прием с использованием прерывания и может с кольцевым буфером).
у меня проблема в том, что мега324 принимает не совсем то, что ей отправляет 1281.
поэтому хотелось бы сначала удостоверится что мой код отправки правилен.
|
|
|
|
18.01.2011, 13:49
|
|
Временная регистрация
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
|
Re: Кольцевой буфер uart
заполняем буфер, В месте проги где принимаешь решение об отправке в UDR отправляем arey[UART2_Transmit_Count] и продолжаем заниматся чем надо,
по прерыванию окончание передачи по USART инкремент UART2_Transmit_Count, проверяем if(UART2_Transmit_Count ‹ длинна пакета) в UDR отправляем arey[UART2_Transmit_Count]-т.е следующий байт. если передача закончена свистим об окончании или ничего не делаем.
Цитата:
|
проблема в том, что мега324 принимает не совсем то, что ей отправляет 1281
|
подробнее можно? может неправильные настройки (скорость,четность, и т.д.)
|
|
|
|
18.01.2011, 14:50
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
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.
|
|
|
|
18.01.2011, 15:27
|
|
Временная регистрация
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
|
Re: Кольцевой буфер uart
давай по другому
Цитата:
|
принимает не совсем то, что ей отправляет
|
исходя из чего Вы сделали такие выводы?
что отправили? что приняли? ошибка постоянно или периодически?
У меня был случай: GPS модуль шлет данные в АВР, иногда проскакивают "казяблики",
оказалось что провода RX и TX перепутаны, а длинна проводов около 1метра, так АВР умудрялся принимать данные по наводке
|
|
|
|
18.01.2011, 17:04
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Кольцевой буфер uart
я делаю симуляцию в шпротеусе 7.4. самое интересное, что когда отправляю с терминала 1 на мегу324 и вывожу на терминал 2, то всё нормально. когда отправляю с мега1281 на Т1, то тоже всё нормально (за исключением того, чтобы в терминалах правильно выводились символы, отправляемые с МК, их скорость надо ставить другую).
Но когда отправляю с М1281 на М324 и М324 выводит принятое, то выводится совсем не то, что надо. А просто отправляемый текст с М324 выводит всё-равно правильно.
Может это шпротеус так глючит?
|
|
|
|
18.01.2011, 19:33
|
|
Временная регистрация
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
|
Re: Кольцевой буфер uart
Цитата:
|
Может это шпротеус так глючит?
|
такое иногда бывает, это проверяется на железе, Поэтому лучше сразу делать макет и мучать его а не симулятор.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|