www.mikrocontroller.net

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


Autor: Carlos (Gast)
Datum:
Angehängte Dateien:

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

Autor: prinz3nroll3 (Gast)
Datum:

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

Autor: xxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include "main.h"

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

int main (void){
....
}

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

überleg mal...

Autor: Maxx (Gast)
Datum:

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

Autor: Carlos (Gast)
Datum:

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

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.