mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)  //////

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klaus Skibowski (skibby)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest die Interrupts erst nach den Initialisierungen der Ports und 
des Timers aktivieren.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

Ich war am verzweifeln.

Schönen Abend.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ holger (Gast)

Vielen Dank Du hast mir sehr geholfen.

Das war tatsächlich der Fehler.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ all

Danke für die schnelle Hilfe.

Schönen Abend.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.