Ich verwende den RV8523, um alle 2 Minuten einen Arduino atmega328p aufzuwecken. Die RTC ist wie folgt verkabelt:
Wobei INT1 mit Port D Pin 3 verdrahtet ist. Der interne Pull-up-Widerstand ist aktiviert und funktioniert dennoch ordnungsgemäß. Es wacht manchmal alle 2 Minuten auf, manchmal aber nicht.
Es gibt den Code zum Programmieren der RTC:
#define I2C_ADDR (0xD0 >> 1)
#define TIMERA_CLK 0x03
#define TIMERA_PERIOD 0x02
void Rtc_init()
{
Wire.beginTransmission(I2C_ADDR);
Wire.write(byte(0x00)); //control 1 register
Wire.write(byte(0x00));
Wire.endTransmission();
Wire.beginTransmission(I2C_ADDR);
Wire.write(byte(0x01)); //control 2 register
Wire.write(byte(0x02));
Wire.endTransmission();
Wire.beginTransmission(I2C_ADDR);
Wire.write(byte(0x02)); //control 3 register
Wire.write(byte(0x00));
Wire.endTransmission();
Wire.beginTransmission(I2C_ADDR);
Wire.write(byte(0x10)); // Timer A Clock register
Wire.write(byte(TIMERA_CLK)); //
Wire.endTransmission();
Wire.beginTransmission(I2C_ADDR);
Wire.write(byte(0x11)); // Timer A register
Wire.write(byte(TIMERA_PERIOD)); //
Wire.endTransmission();
Wire.beginTransmission(I2C_ADDR);
Wire.write(byte(0x0F)); // Timer & Clkout register
Wire.write(byte(0xBA)); //
Wire.endTransmission();
pinMode(INT, INPUT_PULLUP); // <== Sleep mode from RTC
delay(100);
}
UND da ist der "Haupt"-Code:
#define INT 1
void setup()
{
Serial.begin(9600);
while (!Serial){;}
mySerial.begin(9600);
mySerial.println("Start ");
// Setup RTC
Rtc_init();
mySerial.println("RTC Init Done");
}
void loop ()
{
mySerial.println("\n\nWAKE UP ");
delay(1000);
mySerial.println("\n\nGoing to sleep");
mySerial.flush();
attachInterrupt(INT, Push, FALLING);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(INT);
}
void Push()
{
}
Alle Bibliotheken sind enthalten und es gibt das Signal vom RTC-Unterbrechungsstift (INT1):
Wenn Sie einen Hinweis haben, um mich in die richtige Richtung zum Debuggen zu führen, habe ich keine Ideen mehr :-/
BEARBEITEN: Ich sollte präzisieren, dass der Atmega genau wie die RTC mit einer Spannung von 3,3 V betrieben wird. BEARBEITEN 2: Das auf dem Oszilloskop sichtbare Signal wird alle 2 Minuten 1 Mal korrekt wiederholt, ABER der Atmega wacht nicht auf:
Zum Aufwecken durch INT0/1 kann nur der Pegel-Interrupt verwendet werden. Pegelwechsel-Interrupt funktioniert nicht.
Wenn außerdem ein Interrupt verarbeitet werden muss (nicht nur aufwachen), dann sollte es während der gesamten Aufwachzeit, die bis zu 258 Taktzyklen lang sein kann, niedrig gehalten werden. Andernfalls wacht die MCU auf, aber der Interrupt geht verloren.
AKTUALISIEREN
Bezieht sich nicht direkt auf die Frage, könnte aber eine Überlegung wert sein.
Die 8-Sekunden-Grenze für die Schlafverzögerung, die Sie dazu zwang, einen externen Timer zu verwenden, ist rein künstlich. Es ist ein direktes Ergebnis der Bibliothek, die Sie verwenden, indem Sie sich auf den Watchdog-Timer als Wake-Up-Interrupt-Quelle verlassen. Der Grund, warum sie Watchdog verwenden, ist, dass WDT die einzige interne Interrupt-Quelle ist, die in allen Schlafmodi verfügbar ist. Das macht das Schreiben der Bibliothek einfacher, bedeutet aber nicht, dass das Endergebnis das Beste ist, was sein könnte.
Der Schlafmodus mit dem niedrigsten Stromverbrauch ist Power-down. Watchdog, externer Interrupt und TWI-Match sind die einzig möglichen verfügbaren Interrupt-Quellen. Dies zwingt Sie dazu, einen externen Interrupt für Verzögerungen von mehr als 8 Sekunden zu verwenden. Der gesamte Stromverbrauch ist Power-down + externer Takt oder 0,5 uA + 0,13 uA = 0,63 uA
Werfen wir einen Blick auf den Energiesparmodus. Der einzige Unterschied zum Power-down besteht darin, dass die asynchrone Uhr aktiv ist, sodass Sie 32,768-kHz-Uhrquarz als Taktquelle verwenden können. Und es kann für Wake-up-Interrupts verwendet werden. Der Gesamtstromverbrauch ist Power-save, also Power-down + interne Uhr. Laut Datenblatt ist in diesem Modus ein Strom von etwa 0,95 uA erreichbar (obwohl Sie dafür einige fortgeschrittene Software-Tricks anwenden müssen, wie das Deaktivieren von Brown-Out, das Herunterfahren von ADC usw.).
Der Unterschied zwischen diesen Modi ist zweimal kleiner als selbst LDOs mit extrem niedrigem Ruhestrom verbrauchen (etwa 0,5 uA). In Anbetracht dessen, dass Sie damit all diese externen Teile loswerden können, würde ich sagen, dass dies eine durchaus praktikable Option ist.
Es sind zwei Nachteile zu berücksichtigen. Erstens, da die gleichen Pins für den Uhrenquarz wie für den normalen Quarzoszillator verwendet werden, sind Sie auf den internen RC-Oszillator als Systemtaktquelle beschränkt. Beachten Sie, dass der interne RC vom Benutzer auf eine Genauigkeit von etwa 1 % kalibriert werden kann, was für die meisten Anwendungen ausreichen sollte.
Zweitens gibt es kein Knopfzellen-Backup, das Sie zuvor erwähnt haben. Da dies jedoch eine batteriebetriebene Anwendung ist (ich nehme an, sonst würden Sie das Netzteil über die Uhr steuern, nicht über den MCU-Schlafmodus), sehe ich keine Notwendigkeit für ein Backup. Eine Batterie ist eine Batterie. Sie können einfache Mosfet-Schalter hinzufügen, um die Stromversorgung vom Rest der Schaltung abzuschalten und die Batterie mit dem ADC-Pin zu verbinden. Dann würden Sie beim Aufwachen die Batteriespannung messen und alles außer RTC deaktivieren, wenn es zu niedrig wird.
Ahorn
A.Girafe
A.Girafe
A.Girafe
Ahorn
Ahorn
Ahorn
A.Girafe
A.Girafe
Ahorn
A.Girafe
Ahorn
A.Girafe
Ahorn
A.Girafe
Ahorn
Ahorn