Forum: Mikrocontroller und Digitale Elektronik uC wird immer wieder zurückgesetzt


von Martin (Gast)


Lesenswert?

Hallo @all,

ich arbeite mich gerade in die AtMEGA16 Familie von Atmel rein und habe 
mit meinem Code Probleme.

Der uC geht immer wieder zur ersten Anweisung (ganz an den Anfang) 
zurück das schaut nach einem RESET für mich aus und ich weiß nicht 
warum.

Ich arbeite mit AVR Studio. Das Programm soll ledigleich im der ISR den 
Zustand von PINA_1 ändern.

Kann mir jemand sagen was ich falsch mache?

Der Quellcode lautet:


#include <avr/io.h>
#include <avr/interrupt.h>

int n = 0;
int main (void){

sei();

DDRA  = 0xff;
PORTA = 0x00;

DDRB  = 0xff;
PORTB = 0x00;

DDRC  = 0xff;
PORTC = 0x00;

DDRD  = 0b11111011;
PORTD = 0b01000000;

TCCR1B   =   0b00000001;
TIMSK   =  0b00001000;
TIFR  =  0b00001000;

OCR1A  = 0x5F;

//////////////////////////////////////////////////////////////////////// 
/
//////////////////////////////////////////////////////////////////////// 
/


while (1) {
PORTA  =  0x00;
}


}


/////////////////////   end main   ////////////


///////////// ISR(TIMER1_COMPA_vect)  /////////

ISR(TIMER1_COMPA_vect)
{

PORTA = 0b00000001;

while (n<10)
{
n++;
}

n=0;

}

/////////////  end ISR(TIMER1_COMPA_vect)  //////

von holger (Gast)


Lesenswert?

>Kann mir jemand sagen was ich falsch mache?

TIMSK   =  0b00001000;

Das ist falsch. Benutze nicht die binäre Schreibeweise.
So sind Fehler vorprogrammiert. Nimm:

TIMSK   =  (1<<OCIE1A);

von Klaus S. (skibby)


Lesenswert?

Du solltest die Interrupts erst nach den Initialisierungen der Ports und 
des Timers aktivieren.

von Martin (Gast)


Lesenswert?

Vielen Dank!

Ich war am verzweifeln.

Schönen Abend.

von Michael U. (amiga)


Lesenswert?

Hallo,

was soll der arme AVR auch machen, wenn Du den Timerinterrupt für 
Compare B freigibst und eine ISR für COMPA schreibst...

Es liest sich merklich einfacher, wenn man statt

TIMSK   =  0b00001000;
TIMSK = (1<<OCIE1B);

schreibst. Dann sieht man auch den Fehler sofort.

PS: su spät... ;-)

Gruß aus Berlin
Michael

von Martin (Gast)


Lesenswert?

@ holger (Gast)

Vielen Dank Du hast mir sehr geholfen.

Das war tatsächlich der Fehler.

von Martin (Gast)


Lesenswert?

@ all

Danke für die schnelle Hilfe.

Schönen Abend.

von Magnus Müller (Gast)


Lesenswert?

Mit welchen Mitteln stellst du fest, dass sich der Controller reseted?

In der ISR weist du PORTA einen neuen Wert zu, welcher nach dem 
Verlassen der ISR sofort von der Main wieder auf 0 gesetzt wird.

von Martin (Gast)


Lesenswert?

ich habe vor der while (1) { } schleife einen Breakpoint gesetzt. Dieser 
darf bei korrektem Ablauf nur ein einziges mal auftreten. Der Trat 
jedoch immer wieder auf. Daher habe ich einen RESET vermutet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.