'AVR ATMEGA328 is Resetting when (TIMER1_CAP_VECT)Interrupt Occurs and sometime with the UART interrupt
I configure the ICP1 to get the pulses but when it happens, the avr is resetting, sometimes when the uart iterrput occurs it also reset. I don't know where I'm missing, I think it could be the fact that I'm using a Makefile not the AVR-STUDIO, but I use Linux.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdbool.h>
#include <string.h>
#include "display.h"
#include "memoria.h"
#include "pcf8574.h"
#include "lcdpcf8574.h"
#include "uart_hal.h"
#define ON 1
#define OFF 0
#define BOMBA DDD7
#define LDVD DDD6
#define LDVM DDD5
#define TRIGGER DDD2
#define BAUDRATE 9600
void rotina_da_bomba();
void bomba_state(bool state);
void led_verde_state(bool state);
void led_vermelho_state(bool state);
void monta_mensagem(char *mensagem);
void monta_resposta();
caixa_dagua caixa;
bool encher = false;
long dist;
int main(void)
{
char mensagem_lcd[33] = " ";
/* configure timer1 in normal mode */
TCCR1A = 0;
/* configure icr on rising edge with noise filter */
TCCR1B = _BV(ICES1) | _BV(ICNC1) | _BV(CS10);
TIMSK1 = _BV(ICIE1);
// LED VERMELHO // LED VERDE // BOMBA
DDRD = _BV(BOMBA) | _BV(LDVD) | _BV(LDVM) | _BV(TRIGGER); // Configura Saida do LED e da Bomba
lcd_init(LCD_DISP_ON);
lcd_puts(" Iniciando Equipamento");
_delay_ms(500); // busy wait, 500ms
lcd_clrscr();
lcd_puts(" Lab:Sistemas Embarcados");
_delay_ms(500); // busy wait, 500ms
lcd_clrscr();
ler_informacoes_salvas(&caixa);
uart_init(BAUDRATE, OFF); // inicia a comunicação bluetooth com um ponteiro de flag para saber se chegou dado
sei();
uart_send_string("Iniciando Bluetooth\n");
caixa.altura_atual = 200;
while (1)
{
char mensagem_bluetooth[50] = ""; // Estou sempre zerando essa variavel
char resposta[50] = "";
PORTD |= _BV(PORTD2);
_delay_ms(10);
PORTD &= ~_BV(PORTD2);
uart_send_string("Teste Bluetooth");
rotina_da_bomba();
if (uart_read_count()) // Chegou mensagem Bluetooth
{
uart_get_string(&mensagem_bluetooth);
uart_send_string(mensagem_bluetooth);
}
monta_mensagem(&mensagem_lcd); // Montando que será exibida no LCD
lcd_clrscr();
lcd_puts(mensagem_lcd);
_delay_ms(250); // busy wait, 500ms
}
return 1;
}
ISR(TIMER1_CAP_VET)
{
static long temp = 0;
if (TCCR1B & _BV(ICES1))
temp = ICR1;
else
dist = ((ICR1 - temp) * 1e6) / F_CPU / 5.8;
TCCR1B ^= _BV(ICES1);
}
Here is my Makefile
FILENAME = app/main
FILENAME2 = app/display
FILENAME3 = app/uart_hal
FILENAME5 = app/memoria
FILENAME6 = app/twimaster
FILENAME7 = app/pcf8574
FILENAME8 = app/lcdpcf8574
PORT = /dev/ttyACM*
DEVICE = atmega328p
PROGRAMMER = arduino
BAUD = 115200
COMPILE = avr-gcc -Wall -Os -mmcu=$(DEVICE)
all: compile upload clean
compile:
$(COMPILE) -c $(FILENAME).c -o $(FILENAME).o
$(COMPILE) -c $(FILENAME2).c -o $(FILENAME2).o
$(COMPILE) -c $(FILENAME3).c -o $(FILENAME3).o
$(COMPILE) -c $(FILENAME5).c -o $(FILENAME5).o
$(COMPILE) -c $(FILENAME6).c -o $(FILENAME6).o
$(COMPILE) -c $(FILENAME7).c -o $(FILENAME7).o
$(COMPILE) -c $(FILENAME8).c -o $(FILENAME8).o
$(COMPILE) -o $(FILENAME).elf $(FILENAME).o $(FILENAME2).o $(FILENAME3).o $(FILENAME5).o $(FILENAME6).o $(FILENAME7).o $(FILENAME8).o
avr-objcopy -j .text -j .data -O ihex $(FILENAME).elf $(FILENAME).hex
avr-size --format=avr --mcu=$(DEVICE) $(FILENAME).elf
upload:
avrdude -v -p $(DEVICE) -c $(PROGRAMMER) -P $(PORT) -b $(BAUD) -U flash:w:$(FILENAME).hex:i
clean:
rm $(FILENAME).o
rm $(FILENAME2).o
rm $(FILENAME3).o
rm $(FILENAME5).o
rm $(FILENAME6).o
rm $(FILENAME7).o
rm $(FILENAME8).o
rm $(FILENAME).elf
rm $(FILENAME).hex
I also have this warning on compilation
warning: ‘TIMER1_CAP_VET’ appears to be a misspelled signal handler, missing __vector prefix [-Wmisspelled-isr]
ISR(TIMER1_CAP_VET)
I Change to
ISR(TIMER1_CAP_vect)
But still resetting
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|