Forum: Compiler & IDEs mega88 wacht nicht mehr auf


von Agst (Gast)


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:
1
C-Code
2
3
void Fehlerroutine(void)
4
{
5
  Spg = Messung(Spannung);
6
  if (Spg >= 120)  // Wenn Wert überschritten dann setze Fehler in EEPROM zurück
7
  {
8
    eeprom_write_byte(&ee_Fehlerspg, false);  // Fehler in EEPROM aufheben
9
    Unterspg = eeprom_read_byte(&ee_Fehlerspg); // Fehler aus EEPROM auslesen
10
  }
11
  else
12
  {
13
    //Ausgang ausschalten;
14
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
15
    sleep_mode();
16
    _delay_ms(250);
17
  }
18
}
19
20
void main(void)
21
{
22
Unterspg = eeprom_read_byte(&ee_Fehlerspg);    // Fehler aus EEPROM ermitteln 
23
24
if (Unterspg == true) //Wenn Fehler vorliegt springe in Fehlerroutine
25
{
26
  Fehlerroutine();
27
  break;
28
}
29
else // Wenn nicht (z.B.leeres EEPROM)
30
{    // dann schreibe False ins EEPROM
31
  eeprom_write_byte(&ee_Fehlerspg,false);
32
  Unterspg = false
33
}
34
35
while(1) //Programmschleife
36
{
37
// programm läuft
38
// bei einem Fehler gehts in die Fehlerroutine
39
}
40
}

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?

von (prx) A. K. (prx)


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.

von Agst (Gast)


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.

von (prx) A. K. (prx)


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.

von Agst (Gast)


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.

von (prx) A. K. (prx)


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.

von Agst (Gast)


Lesenswert?

Vielen Dank für deine Hilfe! Werde noch ein wenig herumprobieren:

Guten Rutsch!

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.