Например TDA7294

Форум РадиоКот :: Просмотр темы - Влияние передачи данных по USART на выполнение программы
Форум РадиоКот
https://radiokot.ru/forum/

Влияние передачи данных по USART на выполнение программы
https://radiokot.ru/forum/viewtopic.php?f=20&t=75929
Страница 1 из 1

Автор:  ddimochka [ Вт июл 24, 2012 19:00:07 ]
Заголовок сообщения:  Влияние передачи данных по USART на выполнение программы

Товарищи, кто знает в чем дело? Написал программу в AVR Studio. Там же отладил. Все замечательно. Запускаю в Протеусе и тут - то выскакивает такой нюанс: у меня в главной функции имеется бесконечный цикл while(1), выглядит примерно так

int main(void)
{
bufer[0]=0;
bufer[1]=0;
bufer[2]=0;
bufer[3]=0;
DDRB=0xFF;
DDRA=240;
DDRC=0xFF;
PORTC=0;
ozhidanie(1, 's');
PORTC=1;
sei();
init_USART();
while(1)
{

ozhidanie(1, 'm');
while(bufer[3]==0);
intnapr=bufer[0];
maxnapr=bufer[1];
inttime=bufer[2];
bufer[3]=0;
nagrevatel(intnapr);
ozhidanie(inttime, 's');
USART_Transmit(soprotivlenie_1());

}

}

Т.е. получается, что некоторый кусок кода должен бесконечно повторяться. В AVR Studio все так и происходит, а вот Протеус каждый раз повторяет ВСЮ главную функцию целиком. Если убрать функцию передачи данных по USART (USART_Transmit(soprotivlenie_1());), то все работает как положено. Почему? USART_Transmit() у меня представляет собой всего лишь запись аргумента функции в регистр UDR.

Автор:  Olecorp [ Вт июл 24, 2012 20:58:50 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

А что представляет собой функция soprotivlenie_1() ?

Автор:  ddimochka [ Чт июл 26, 2012 09:13:54 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

Да без разницы что она представляет. я пробовал туда просто поставить UDR=8 ради проверки. Та же фигня творится
Попробовал даже вообще без цикла
int main(void)
{
bufer[0]=0;
bufer[1]=0;
bufer[2]=0;
bufer[3]=0;
DDRB=0xFF;
DDRA=240;
DDRC=0xFF;
sei();
init_USART();
UDR=8;

while(bufer[3]==0);
intnapr=bufer[0];
maxnapr=bufer[1];
inttime=bufer[2];
bufer[3]=0;
nagrevatel(intnapr);
ozhidanie(inttime, 's');

}

ТАк он после передачи восьмерки каждый раз сбрасывает программу

Автор:  ddimochka [ Чт июл 26, 2012 11:00:39 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

Эврика! Сам нашел ошибку. При инициализации USART я разрешил прерывания по завершении передачи, а пользоваться ими не стал, соответственно и обработчик не написал. Вот его и глючило. Если кто неопытен как я, возьмите на заметку

Автор:  Kavka [ Чт июл 26, 2012 11:07:56 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

Очень похоже, что ошибка кроется в других частях кода.

Могу только порекомендовать разрешать прерывания после инициализации UART-а.

Автор:  ddimochka [ Чт июл 26, 2012 11:12:06 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

А что, если нет ошибок в других частях кода, то отсутствие обработчика прерывания не вызовет никаких глюков?

Автор:  ddimochka [ Чт июл 26, 2012 11:13:16 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

Kavka писал(а):
Очень похоже, что ошибка кроется в других частях кода.

Могу только порекомендовать разрешать прерывания после инициализации UART-а.

Да я так и делаю. Приведенный код это одна из многих попыток исправить положение

Автор:  Jack_A [ Чт июл 26, 2012 13:26:28 ]
Заголовок сообщения:  Re: Влияние передачи данных по USART на выполнение программы

ddimochka писал(а):
отсутствие обработчика прерывания не вызовет никаких глюков?


В правильно написанной проге на всех неиспользуемых векторах соят reti. Если даже это прерывание разрешено, то при его наступлении выполнится обработчик по умолчанию
"Ничего не делать и вернуться в точку прерывания"
.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/