[AVR] Brownout Interrupt Vector?

Gast #1533081
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.
#1533088
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.
Gast #1533091
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.
Gast #1533105
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.
Gast #1533136
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
Gast #1533146
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.
Gast #1533206
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren