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

 
 
> Прерывание для RS232 на AtMega128
Nekromant
сообщение Apr 5 2009, 14:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



Добрый день, уважаемые форумчане.
Возникла задача реализовать общение между контроллером и ПК.
Сама передача работает. т.е контроллер принимает символы и отправляет, но при попытке организовать прерывание по приему символа-оно просто не срабатывает. вот фрагменты кода на строгий суд:
используется отладочная плата STK500
CODE
extern THD44780Service Lcd;
extern char c;

void TDebugSerial::Init() //инициализация USART
{
/* Enable double speed */
UCSR1A = (1 << U2X);
/* Enable receiver, transmitter and interrupts */
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
/* 8 bit data */
UCSR1C = (1 << UCSZ11) | (1 << UCSZ10) ;
/* high byte of UART speed */
UBRR1H = (8000000 /(19200 * 8L) - 1) >> 8;
/* low byte of UART speed */
UBRR1L = (uint8_t)(8000000 / (19200 * 8L)-1);

}
......
ISR(USART1_RX_vect)//организация прерывания по приему символа
{
uint32_t i=98765432; //проверка срабатывания прерывания
Lcd.WriteInt(i); //проверка срабатывания прерывания


}



Lcd.WriteInt(i)---функция вывода на дисплей жк-индикатора-в главных циклах и других функция срабатывает. В этом же прерывании просто молчание и никакой реакции. вместо нее даже пытался менять состояние светодиодов-все равно молчание.
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nekromant
сообщение Apr 6 2009, 01:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



Не совсем понял почему всего один раз и еще и при инициализации, но не суть важно.
мне в данный момент не прочитать символы надо а просто просто вообще понять что контроллер попал в область ISTR().
первоначальный вариант был следующим:
Код
ISR(USART1_RX_vect)//организация прерывания по приему символа
{
char i; //проверка срабатывания прерывания
i=GetChar();
Lcd.WriteInt(i); //проверка срабатывания прерывания

}
Где
char TDebugSerial::GetChar()
{

while(!(UCSR1A & (1 << RXC1)));
return (char)UDR1;//вот здесь и читаем все что надо-в общей программе без прерываний работает, в прерывании же нет.

}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
smac
сообщение Apr 6 2009, 06:02
Сообщение #3


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

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Nekromant @ Apr 6 2009, 05:30) *
Не совсем понял почему всего один раз и еще и при инициализации, но не суть важно.
мне в данный момент не прочитать символы надо а просто просто вообще понять что к...


Попробуйте сделать как Вам уже посоветовали - считывать UDR в прерываниях без функции GetChar(), не могу объяснить почему но мне кажется что дело в ней. Считывание UDR обязательно, т. к. только таким образом можно сбросить RXС1.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 12:45
Рейтинг@Mail.ru


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