Forum: Mikrocontroller und Digitale Elektronik [AVR] Brownout Interrupt Vector?


von Michael H. (Gast)


Lesenswert?

Hi,

mein ATMega8 soll kurz vor dem Abschalten noch eine handvoll Daten ins 
Eeprom schreiben, damit beim wieder Einschalten passende Startwerte 
vorhanden sind. Auf "Knopfdruck" funktioniert das auch recht schön.

Nun wollte ich das mit dem Brownout verbinden, sprich beim Auftreten des 
BO-Interrupts soll geschrieben werden. Mir ist aber nicht klar wie ich 
den Interrupt "anzapfe", zum Einen wird mit dem Vektor 0 sowohl External 
Pin, Power-On-Reset, BO und der Watchdog behandelt, ich müsste das also 
zunächst irgendwie trennen, um nur bei BO in die ISR zu gehen.

Zum Anderen wirft mir der Compiler eine Meldung:
interrupt.c:96: warning: ‘RESET_vect’ appears to be a misspelled signal 
handler

Es scheint als könnte ich den Vektor 0 überhaupt nicht per SW behandeln? 
Oder habe das tatsächlich falsch geschrieben? Hier der relevante 
Ausschnitt aus der interrupt.c:
1
#include "config.h"      
2
#include <avr/interrupt.h> 
3
#include <avr/eeprom.h>
4
5
6
ISR(RESET_vect) 
7
{
8
  eeprom_write_block(&eedata, EE1_ADDR, sizeof(eedata));  
9
  while(1);            // nur 1x schreiben
10
}

Das ist natürlich nur ein nicht funktionierender Entwurf, da ich ja erst 
die verschiedenen Ereignisse trennen müsste.
Kann das so zum Ziel führen oder kriegt man das so nicht hin?

Danke,
Michael

PS: Ich kenne natürlich den Ansatz, per externem Interrupt das Absinken 
der Versorgungsspannung zu erkennen und darauf zu reagieren. Ich wollte 
allerdings wegen Platzknappheit den Anschluss eines weiteren IO-Pins 
vermeiden und die internen Ressourcen nutzen.

von (prx) A. K. (prx)


Lesenswert?

Brownout gibt Reset und das ist kein Interrupt. Das muss vorher 
abgefangen werden, bevor der Brownout zuschlägt. Per Analog Comparator 
oder ADC.

Versorgungsspannung lässt sich per ADC ohne Pin messen. Die interne 
Bandgap auf dem Muxer legen und Vcc als Referenz verwenden.

von Nicht-Gast (Gast)


Lesenswert?

Das wird so nicht gehen.

Sobald die Betriebsspannung unter den Brown-Out-Wert sinkt, wird die CPU 
erstmal komplett angehalten. der "Vector 0"/Reset-Vector wird erst 
angesprungen, wenn der Brown-Out wieder vorbei ist, also die 
Betriebsspannung auf Brown-Out-Wert + Hysterse angestiegen ist.

von Guest (Gast)


Lesenswert?

Brown Out erwirkt Reset und das es ein Brown Out Reset war ist hinterher 
m MCU Control and Status Register anhand des Brown-out Reset Flag zu 
lesen

von Ungast (Gast)


Lesenswert?

Es geht immer noch um die Uhrzeit?

Speicher die einfach immer im Eeprom.
Hatte ich mal bei einem Projekt so gemacht, wo der AVR die Uhrzeit 
zumindest ungefähr behalten sollte, ein Stromausfall aber so 
unwahrscheinlich war dass sich Goldcap/Li-Batterie/RTC etc nicht gelohnt 
hätten.

Datum brauchte ich nicht, nur den Wochentag. Im Eeprom habe ich dann 
"Minuten seit Mitternacht" gespeichert:

1 EEMEM-Byte für die MSBs (3 bits Wochentag, 4 bits Minute)
wurde einmal alle 128 Minuten geschrieben, die Zelle hätte also mind. 22 
Jahre gehalten.

105 EEMEM-Bytes (der unbenutzte Rest) für 7 Minuten-LSBs, jede Minute 
geschrieben, aber durch das Balancen auf 105 Zellen hätte das auch 
Jahrzehnte gehalten.

von Michael H. (Gast)


Lesenswert?

A. K. schrieb:
> Brownout gibt Reset und das ist kein Interrupt.

Das hatte ich aufgrund der Fehlermeldung schon befürchtet, mein Ansatz 
kann also nicht funktionieren.

> Versorgungsspannung lässt sich per ADC ohne Pin messen. Die interne
> Bandgap auf dem Muxer legen und Vcc als Referenz verwenden.

Das klingt interessant, mal sehen ob ich das zeitlich auf die Reihe 
kriege, da ich den ADC auch für anderes brauche.

Vielen Dank an alle für die Tips.

M

von Ungast (Gast)


Lesenswert?

>> Versorgungsspannung lässt sich per ADC ohne Pin messen. Die interne
>> Bandgap auf dem Muxer legen und Vcc als Referenz verwenden.
>
> Das klingt interessant, mal sehen ob ich das zeitlich auf die Reihe
> kriege, da ich den ADC auch für anderes brauche.

Daran denken dass der ADC sehr lange braucht um nach dem Umschalten der 
Ref-Spannung wieder vernünftige Werte zu liefern, REF-Bits setzen + 1x 
Dummy-Read langt meiner Erfahrung nach nicht.

von spess53 (Gast)


Lesenswert?

Hi

Der Analog-Komparator ist die bessere Wahl.

MfG Spess

von Ungast (Gast)


Lesenswert?

spess53 schrieb:
> Der Analog-Komparator ist die bessere Wahl.

Wenn man die Pins frei hat, sicher.

Wenn's ohne extra-Pins gehen soll, bleibt nur der Weg über Bandgap 
messen mit Vcc als Ref.

von spess53 (Gast)


Lesenswert?

Hi

>spess53 schrieb:
>> Der Analog-Komparator ist die bessere Wahl.

>Wenn man die Pins frei hat, sicher.

Nur wenn man es erst merkt, wenn es zu spät ist.

MfG Spess

von Ungast (Gast)


Lesenswert?

Ah ja, @Michael:

Die Betriebsspannung per ADC (oder von mir aus mit dem Komparator) zu 
überwachen bringt nichts gegen kurze (<1ms) Einbrüche, die beim 
Relais-schalten entstehen.
Dagegen hilft nur ein gutes Layout (Kein Eagle-Autorouter) und saubere 
Entkopplung der Betriebsspannung.

Wenn es dafür schon zu spät ist: Du kannst doch einfach VOR jedem 
Relais-Schaltvorgang deine Daten ins EEProm sichern.
Klar, die EEProm-Zellen halten nicht ewig, aber das tun Relaiskontakte 
auch nicht.

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.