Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Многократный вход в функцию main
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alex_hyp
Добрый вечер всем!

Суть проблемы:

Происходит многократный вход в функцию main - контроллер на терминал выдает символ многократно, хотя по идее должен лишь единожды при пуске.
Сторожевой таймер выключен. Питание и reset - стабильны. При каких ещё условиях может происходить сброс?


CODE

#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
Цитата(alex_hyp @ Jun 7 2011, 15:39) *
Сторожевой таймер выключен. Питание и reset - стабильны. При каких ещё условиях может происходить сброс?
Буду рад любым подсказкам!


Ну, мало ли. Например, стек переполняется. Попробуйте запретить прерывания. тоже будет сбрасываться ? Скорее всего, дело в стеке.

P.S. Еще проверьте размеры массивов и проч. Например, вы, работая через указатель, пытаетесь записать в массив больше данных, чем он в состоянии вместить, и эти данные разрушают соседние данные и стек ...
Палыч
Цитата(alex_hyp @ Jun 7 2011, 16:39) *
При каких ещё условиях может происходить сброс?
В Вашем случае: разрешили прерывания по окончанию передачи символа, но функции обработки прерывания - нет. Зачастую, трансляторы/линковщики заполняют "неиспользуемые" вектора командой перехода на адрес 0.
alex_hyp
Палыч, спасибо!
Cовершенно верно!
Уже сам нашел этот косяк.
Скопировал блок инициализации UARTA c какого-то сайта. При посылке символа программа слетала. Убрал 1 бит TXIE и всё стало отлично.
ещё раз спасибо! beer.gif

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.