Форум РадиоКот 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/ |