Forum: Mikrocontroller und Digitale Elektronik ungewollter Reset nach 7 Mal power-down


von Carlos (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab zwar schon ein paar grundlegende Projekte mit einem µC gemacht, 
bin aber seit längerer Zeit an einem Problem am hängen wo ich absolut 
nicht mehr weiter komme. Ich hab auch schon länger in den Foren hier 
rumgestöbert und im Internet nach Lösungen gesucht, aber bisher hat kein 
Ansatz funktioniert. Da mit das Problem auch relativ speziell aussieht 
wollte ich mich mal die Profis von hier befragen.

Bei dem Projekt (basierend auf einem ATtiny2313) geht es darum, dass 
sich der µC grundsätzlich im power-down mode befinden soll und durch 
einen Taster, der über INT0 angeschlossen ist, den µC wecken soll. 
Dieser soll dann ja nach Zustand 4 Relais in einer gewissen Reihenfolge 
in bestimmten Zeitabständen schalten.

Soweit so gut. Die ersten 7 Durchläufe funktionieren einwandfrei (also 4 
Mal "anschalten" und 3 Mal "ausschalten"). Beim 4 Mal Ausschalten tritt 
dann allerdings ein Reset auf. Die Frage ist nur warum?? Das Programm 
ist doch 3 Mal korrekt "durchgelaufen".

Ich habe im Anhang mal den Schaltplan gepostet und unten den Quellcode 
des Hauptprogramms. Die Funktionen zum Schalten der Relais habe ich mal 
weggelassen, da hier außer Pin auf high setzen, 6 Zehntelsekunden warten 
und Pin wieder auf low setzen nicht passiert. Bei Bedarf kann ich aber 
auch diesen Code noch posten.

Weiß da absolut nicht mehr weiter. Wahrscheinlich ist's nur ein 
amateurhafter Fehler. Hoffe ihr könnt mir da helfen.

Gruß Carlos

#include "main.h"
uint8_t Zustand;

void my_delay_Zehntel_Sekunde (int zs){
  int i;
  for (i=0;i<=zs;i++){
    _delay_ms(100);
  }
}

int main (void){
  MCUCR |= (1<<SM1)|(1<<SM0)|(1<<SE);
  wdt_disable();Hallo,

#include "main.h"
#include <avr/wdt.h>

uint8_t Zustand;

void my_delay_Zehntel_Sekunde (int zs){
  int i;
  for (i=0;i<=zs;i++){
    _delay_ms(100);
  }
}

int main (void){
  MCUCR |= (1<<SM1)|(1<<SM0)|(1<<SE);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  DDRD &= ~(1<<2);
  MCUCR |= (1<<ISC01);
  MCUCR &= ~(1<<ISC01);
  GIMSK |= (1<<INT0);
  sei();

  Relais_init();
  Zustand = aus;

  sleep_mode();

  while (1>0){
  }
}

SIGNAL (SIG_INTERRUPT0){
  GIMSK &= ~(1<<INT0);
  if (Zustand==aus){
    bistabiles_Relais_an(1);
    bistabiles_Relais_an(2);
     bistabiles_Relais_an(3);
    my_delay_Zehntel_Sekunde(80);
    Relais_anziehen(4);
    Zustand = an;
  }
  else{
    Relais_anziehen(4);
    my_delay_Zehntel_Sekunde(60);
    bistabiles_Relais_aus(3);
    bistabiles_Relais_aus(2);
     bistabiles_Relais_aus(1);
    Zustand = aus;
  }
  GIMSK |= (1<<INT0);
  sei();
  sleep_mode();
}

von prinz3nroll3 (Gast)


Lesenswert?

Hallo,
ich würde zum Testen anstatt der Relais mal LEDs oder ähnliches 
schalten.
Um herauszufinden ob es Sw oder Hw ist.

von xxx (Gast)


Lesenswert?

#include "main.h"

int main (void){
......
#include "main.h"
}

int main (void){
....
}

2x main.h??????????????
2x int main(void)????????????

überleg mal...

von Maxx (Gast)


Lesenswert?

- Das sei() raus aus der ISR
- das sleep() raus aus der ISR, rein in die main ins while(1)

So wie jetzt haust du dir den Stack voll, weil deine ISR von der ISR von 
der ISR ... unterbrochen wird.

von Carlos (Gast)


Lesenswert?

Hey Leute, danke für die schnelle Antwort. Die Sache lief ja ziemlich 
optimal. Hab mich lange mit der Sache rumgeärgert und dann hier nach 
noch nicht mal 20 Minuten eine Lösung bekommen. Das verleitet einen ja 
dazu sich viel zu schnell an diese Stelle hier zu wenden. Aber das 
wollen wir ja auch nicht. Vorher kann man sich ruhig mal ein paar 
Stunden selbst mit so'ner Sache beschäftigen. Aber wenn bei mir dann mal 
nicht mehr weitergeht, weiß ich wo ich mich dann hinwende.

@prinz3nroll3: gute Idee (hatte ich nämlich auch schon ;-)

@xxx: da ist wohl was beim Kopieren für's Posten schief gelaufen, das 
sind noch Fragmente aus längst vergangenen hilflosen Versuchzeiten, ab 
dem 2. #include "main.h" fängt das Programm erst an.

@Maxx: WELTKLASSE !!!!
genau das war der Fehler in der Matrix. Jetzt wo ich drauf gestossen 
werd, leucht's mir auch ein. Keine Ahnung wo ich den Ansatz mit dem 
sleep() in der ISR her hatte (liegt schon länger zurück).

Nochmal vielen Dank an alle!!

PROBELM GELÖST !!!!

Gruß Carlos

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.