Gast
#1962692
Hallo, beim megaAT16 habe ich folgendes Problem: Sobald der Befehl SEI()
aufgerufen wird, springt das Programm zurück auf den Reset Vektor. Die
nachfolgende while-Schleife wird nie erreicht. Der Dissassembler zeigt
ebenfalls nachdem sei-Befehle einen jump auf Adresse 0x0000 - also Reset
an.
Was mache ich hier falsch?
Hier ein Auszug des Listing
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>
#include <string.h>
#include "USART.h"
#define F_CPU 16000000
#define USART_BAUD_RATE 19200
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*161)-1)
volatile uint16_t counterNew, counterOld;
char frequency_ascii[6], newDigit, oldDigit;
char zeichenspeicher[35],Ziffer[6], TransFlag, repetition[4],
sequence[6];
unsigned char Blockzaehler=0, Resetzaehler=0, n, Zeichenzaehler,
BurstCounter, Flag;
int main(void)
{
MCUCSR &= ~(1<<ISC2); //INT2 reagiert auf fallende Flanke
MCUCR &= ~(1<<ISC11); //INT1 löst bei Low-Pegel aus
MCUCR &= ~(1<<ISC10);
MCUCR &= ~(1<<ISC01); //INT0 löst bei Low-Pegel aus
MCUCR &= ~(1<<ISC00);
GICR |= (1<<INT2); //Aktiviere INT2
USART_Init(51);
TCCR1B |= (1<<CS11); //Counter1-Prescaler auf 8
TIMSK |= (1<<TOIE0); //Aktiviere Timer0 Overflow Interrupt
TCCR0 &= ~((1<<CS01) | (1<<CS00)); //Stoppe Timer0
TCCR2 |= (1<<CS22) | (1<<CS21) | (1<<CS20); // Timer2 Prescaler auf
1024
TIMSK |= (1<<TOIE2); //Aktiviere Timer2 Overflow Interrupt
sei(); //Aktiviere Interrupts
while (1)
{
if (Flag == 1)
{
Flag = 0;
Zeichenzaehler=0;
n=0;
Blockzaehler=0;
}
}
}