mikrocontroller.net

Forum: Compiler & IDEs mega88 wacht nicht mehr auf


Autor: Agst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich denke dass ich meinen ATmega88 erfolgreich schlafen gelegt habe und 
befürchte das er nun nicht mehr aufwacht. Folgenden Code habe ich 
dareingebastelt:
C-Code

void Fehlerroutine(void)
{
  Spg = Messung(Spannung);
  if (Spg >= 120)  // Wenn Wert überschritten dann setze Fehler in EEPROM zurück
  {
    eeprom_write_byte(&ee_Fehlerspg, false);  // Fehler in EEPROM aufheben
    Unterspg = eeprom_read_byte(&ee_Fehlerspg); // Fehler aus EEPROM auslesen
  }
  else
  {
    //Ausgang ausschalten;
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_mode();
    _delay_ms(250);
  }
}

void main(void)
{
Unterspg = eeprom_read_byte(&ee_Fehlerspg);    // Fehler aus EEPROM ermitteln 

if (Unterspg == true) //Wenn Fehler vorliegt springe in Fehlerroutine
{
  Fehlerroutine();
  break;
}
else // Wenn nicht (z.B.leeres EEPROM)
{    // dann schreibe False ins EEPROM
  eeprom_write_byte(&ee_Fehlerspg,false);
  Unterspg = false
}

while(1) //Programmschleife
{
// programm läuft
// bei einem Fehler gehts in die Fehlerroutine
}
}

Das Hauptprogramm läuft - wenn ein Fehler auftritt (Spannungswert wird 
unterschritten) werden die Ausgänge abgeschaltet und der Prozessor 
schlafen geschickt - um Strom zu sparen. Später wird die 
Versorgungsspannung abgeschaltet

Der Prozessor soll durch erneutes anlegen der Spannungsversorgung wieder 
aufwachen (ich dachte durch Reset beim Einschaltvorgang)

Das EEPROM  mit dem abgespeicherten Fehler wird ausgelesen. Erst wenn 
ein Wert überschritten wird, wird dieser Fehler überschrieben und das 
Hauptprogramm soll wieder "rennen".

Heißt: Ich wecke den Prozessor nicht durch einen Interrupt sondern durch 
Anlegen der Versorgungsspannung - geht das?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brownout Detector eingeschaltet? Der Powerup Reset greift nur, wenn die 
Spannung ziemlich gründlich weg war, bei Unterspannung hingegen nicht.

Und wenn du den Controller schlafen legst, weil die Spannung zu klein 
ist, dann wird er ohne Interrupt nur durch Reset wieder aufwachen. Also 
nur wenn die Spannung soweit weg war, dass der Powerup oder Brownout 
Reset greift. Wenn die Spannung hingegen wieder ansteigt, dann hast du 
verloren. So geht das also nicht.

Autor: Agst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort.

Ich habe den Brown-out auf 1,8V eingestellt.

Wie gesagt, die Spannung wird nach dem einstellen des Sleep Mode 
komplett abgeschaltet.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep, aber wenn der Controller bei ansteigender Spannung aufwacht bevor 
die Messung ihm hinreichende Spannung signalisiert, dann legt er sich 
wieder schlafen und das war's dann. Aufwachen tut er dann erst wieder 
beim nächsten Versuch dieser Art und der Spuk geht erneut los.

M.a.W: Wenn die Messgrenze unter der Brownout-Grenze liegt ist die 
überflüssig und wenn sie drüber liegt ein Erreger der Schlafkrankheit. 
So wird das also nix.

Verrate mal mehr drüber was das werden soll.

Alternativer Ansatz: Watchdog-Timer verwenden um ab und zu aufzuwachen 
und nach dem Rechten zu sehen.

Autor: Agst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich überwache damit einen Akku, an der verschiedene LED's und Schalter 
betrieben werden und auch ein PWM-betriebener Motor als 
Hauptverbraucher.

Wenn die Spannung z.B einen Wert von 2,5V erreicht hat, sollen alle 
Verbraucher ausgeschaltet werden um den Akku vor Tiefentladung zu 
schützen. Und weil nichts mehr betrieben wird und ein Fehler vorliegt 
(Akku-Spannung zu niedrig) wird der Prozessor schlafen gelegt um 
zusätzlich Strom zu sparen. Zuvor wurde dieser Fehler im EEPROM 
abgelegt.

Erst wenn die Akkuspannung wieder midestens 4V beträgt ( nach dem 
externen Ladevorgang, d.h. Batterie wurde getrennt und Prozessor hat 0V) 
wird der Fehlermode wieder ausgeschaltet.

Heißt: Nach dem Einschalten der Versorgungsspannung Controller wieder 
wach, Fehlerbild auslesen (kein Fehler -> alles OK, mach weiter wie 
bisher)oder Fehler (ermittelt aus EEPROM) Ist die Spannung wieder 
ausreichend vorhanden -> Fehlerbild löschen und Betreiben unter normalen 
Bedingungen bis der Akku wieder leer ist.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst den Watchdog-Timer als Interrupt-Quelle verwenden um den 
Controller ab und zu wieder aufzuwecken und nachzusehen wie es der 
Spannung geht. Der dadurch verbratene Strom ist so gering, dass bereits 
eine Knopfzelle für Monate bis Jahre ausreicht, sollte also kein Problem 
für einen ordentlichen Akku sein.

Alternativ solltest du sicherstellen, dass die erste Messung nach dem 
Reset erst stattfindet, wenn die Spannung garantiert ein stabiles Niveau 
erreicht hat.

Autor: Agst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für deine Hilfe! Werde noch ein wenig herumprobieren:

Guten Rutsch!

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.