Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
02.12.2008, 13:12
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
AVR и UART через прерывание - help :)
Приветсвтую!
Кто-нибудь, скиньте пожалуйста для CodeVision РАБОЧИЙ примерчик приема через UART на tiny2313 через прерывание по 8 байт в пакете. Я сделал через визадр, он принимает 8 байт и больше не хоча...
Инфу отправляю с мега16.
благодарю
|
|
|
|
04.12.2008, 00:40
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
может быть надо после приема 8 байт отправлять какую-нибудь информацию?
|
|
|
|
04.12.2008, 03:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Ждете телепатов? ![Улыбка](images/smilies/icon_smile.gif) Приведите Ваш исходник. И еще совет - не пользуйтесь визардами всякими, пишите сами. Дальше будет проще.
|
|
|
|
04.12.2008, 11:39
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Код:
|
/************************************************** ***
Chip type : ATtiny2313
Clock frequency : 4,000000 MHz
************************************************** ***/
#include ‹tiny2313.h›
#include ‹stdio.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)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE‹256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data,i;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE)
{
for(i=0;i‹8;i++)
{
printf("%02X
",rx_buffer[i]);
}
rx_wr_index=0;
}
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
printf("overflow
");
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
#include ‹stdio.h›
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
USICR=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x19;
ACSR=0x80;
// Global enable interrupts
#asm("sei")
printf("start
");
while (1)
{
};
} |
Почему телепатами? Я ведь еще просил поделится вашим вариантом ![Улыбка](images/smilies/icon_smile.gif)
А без визарда я воообще никак не сделаю
-- Прилагается рисунок: --
|
|
|
|
04.12.2008, 13:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
У меня для CV нету. Этим г пользоваться не могу.
Не используйте printf в прерывании и прием наладится. Эта функция очень медленная и именно из за нее идут пропуски.
|
|
|
|
04.12.2008, 14:41
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
уважаемые господа, читайте, пожалуйста, внимательнее сообщения. вопрос не в пропусках, а в том, что принимает только 8 байт... у меня ничего не пропускается!
если кто-то не пользуется CV, прошу вариант для др. компилятора UART с прерывнием по 8 байт (+ толковые пояснения).
спасибо!
|
|
|
|
04.12.2008, 16:19
|
|
Временная регистрация
Регистрация: 06.12.2007
Сообщений: 91
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
#define RX_BUFFER_SIZE 8
Это ни о чем не говорит ????
тогда - ну я не знаю....Это не сюда...
Это... Вот - "какая гадость... какая гадость эта Ваша фаршированная рыба !!!(С)
__________________
разум когда-нибудь победит... (с)
|
|
|
|
04.12.2008, 17:57
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
говорит о том, что размер буфера 8 байт.
что еще не так? этот буфер надо почистить перед прием новых байтов? может лучше дадите рабочий пример, вместо того, чтобы делать вид какие все умные?
|
|
|
|
04.12.2008, 18:28
|
|
Временная регистрация
Регистрация: 06.12.2007
Сообщений: 91
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
оно само чистится
Рабочий пример - чего ??? У Вас свои задачи - у меня свои.
сколько нужно байт? Нужно двадцать, задайте 20. Память не резиновая.
Правильно формируйте пакет. Если не знаете, сколько будет - после маркера пакета - количество байт, закрывайте пакет контрольной суммой.
Принимаете ответный пакет - проанализируйте, дошел ли предыдущий, при неуспехе - повторить.
__________________
разум когда-нибудь победит... (с)
|
|
|
|
04.12.2008, 18:44
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
про очистку буфера это я так к примеру.
моя задача такая: с 1го мк отправляется пакет, например 8 байт. через некоторый промежуток времени (например, 5 секунд, 1 час, ...) отправляется пакет с новыми данными. 2й мк должен его принять. У меня он принимает только ПЕРВЫЙ пакет (т.е. 8 байт), как будто после приема 8-го байта надо снова разрешать/выключать прерывания или еще что-то делать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:55.
|
|