Перейти к содержанию
    

Многократный вход в функцию main

Добрый вечер всем!

 

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

 

Происходит многократный вход в функцию 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;
};

 

Буду рад любым подсказкам!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Буду рад любым подсказкам!

 

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

 

P.S. Еще проверьте размеры массивов и проч. Например, вы, работая через указатель, пытаетесь записать в массив больше данных, чем он в состоянии вместить, и эти данные разрушают соседние данные и стек ...

Изменено пользователем kovigor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При каких ещё условиях может происходить сброс?
В Вашем случае: разрешили прерывания по окончанию передачи символа, но функции обработки прерывания - нет. Зачастую, трансляторы/линковщики заполняют "неиспользуемые" вектора командой перехода на адрес 0.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Палыч, спасибо!

Cовершенно верно!

Уже сам нашел этот косяк.

Скопировал блок инициализации UARTA c какого-то сайта. При посылке символа программа слетала. Убрал 1 бит TXIE и всё стало отлично.

ещё раз спасибо! :beer:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...