alex_hyp 0 7 июня, 2011 Опубликовано 7 июня, 2011 · Жалоба Добрый вечер всем! Суть проблемы: Происходит многократный вход в функцию main - контроллер на терминал выдает символ многократно, хотя по идее должен лишь единожды при пуске. Сторожевой таймер выключен. Питание и reset - стабильны. При каких ещё условиях может происходить сброс? #include <avr/io.h> #include <avr/interrupt.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <util/delay.h> #include <avr/iotn2313.h> // 19200, 8 бит, 2 стоповых #define USART_BAUDRATE 19200 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) char ReceivedByte; char s[] = "Hello"; int main(void) { DDRD = 255; PORTD =255; DDRB = 255; PORTB = 255; sei(); UCSRB |= (1 << RXEN) | (1 << TXEN) | (1 << RXCIE) | (1 << TXCIE); UCSRC |= (1 << USBS) | (1 << UCSZ0) | (1 << UCSZ1); UBRRL = BAUD_PRESCALE; UBRRH = (BAUD_PRESCALE >> 8); while ((UCSRA & (1 << UDRE)) == 0) {}; UDR = s[1]; while(1) { _delay_ms(300); }; return 0; }; ISR(USART_RX_vect) { ReceivedByte = UDR; switch (ReceivedByte) { case ('1'): while ((UCSRA & (1 << UDRE)) == 0) {}; UDR = s[2]; break; } UDR = ReceivedByte; // Echo back the received byte back to the computer return; }; Буду рад любым подсказкам! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 7 июня, 2011 Опубликовано 7 июня, 2011 (изменено) · Жалоба Сторожевой таймер выключен. Питание и reset - стабильны. При каких ещё условиях может происходить сброс? Буду рад любым подсказкам! Ну, мало ли. Например, стек переполняется. Попробуйте запретить прерывания. тоже будет сбрасываться ? Скорее всего, дело в стеке. P.S. Еще проверьте размеры массивов и проч. Например, вы, работая через указатель, пытаетесь записать в массив больше данных, чем он в состоянии вместить, и эти данные разрушают соседние данные и стек ... Изменено 7 июня, 2011 пользователем kovigor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 8 7 июня, 2011 Опубликовано 7 июня, 2011 · Жалоба При каких ещё условиях может происходить сброс?В Вашем случае: разрешили прерывания по окончанию передачи символа, но функции обработки прерывания - нет. Зачастую, трансляторы/линковщики заполняют "неиспользуемые" вектора командой перехода на адрес 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex_hyp 0 7 июня, 2011 Опубликовано 7 июня, 2011 · Жалоба Палыч, спасибо! Cовершенно верно! Уже сам нашел этот косяк. Скопировал блок инициализации UARTA c какого-то сайта. При посылке символа программа слетала. Убрал 1 бит TXIE и всё стало отлично. ещё раз спасибо! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться