Estoy usando el RV8523 para despertarme cada 2 minutos con un arduino atmega328p. El rtc está cableado de esta manera:
DondeINT1estácableadoalpuertoDpin3.Laresistenciadeextraccióninternaestáactivaday,sinembargo,funcionacorrectamente.Sedespiertaavecescada2minutos,peroavecesno.
HayuncódigoparaprogramarelRTC:
#defineI2C_ADDR(0xD0>>1)#defineTIMERA_CLK0x03#defineTIMERA_PERIOD0x02voidRtc_init(){Wire.beginTransmission(I2C_ADDR);Wire.write(byte(0x00));//control1registerWire.write(byte(0x00));Wire.endTransmission();Wire.beginTransmission(I2C_ADDR);Wire.write(byte(0x01));//control2registerWire.write(byte(0x02));Wire.endTransmission();Wire.beginTransmission(I2C_ADDR);Wire.write(byte(0x02));//control3registerWire.write(byte(0x00));Wire.endTransmission();Wire.beginTransmission(I2C_ADDR);Wire.write(byte(0x10));//TimerAClockregisterWire.write(byte(TIMERA_CLK));//Wire.endTransmission();Wire.beginTransmission(I2C_ADDR);Wire.write(byte(0x11));//TimerAregisterWire.write(byte(TIMERA_PERIOD));//Wire.endTransmission();Wire.beginTransmission(I2C_ADDR);Wire.write(byte(0x0F));//Timer&ClkoutregisterWire.write(byte(0xBA));//Wire.endTransmission();pinMode(INT,INPUT_PULLUP);//<==SleepmodefromRTCdelay(100);}
Yallíestáelcódigo"principal":
#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()
{
}
Se incluye toda la biblioteca y hay la señal del pin de interrupción rtc (INT1):
Sitienealgunapistaquemeguíehacialadireccióncorrectaparaladepuración,notengomásideas:-/
EDITAR:Deberíaprecisarquelaatmósferaestáactivadaporunvoltajede3.3ValigualqueelRTC.EDIT2:laseñalvisibleenelalcanceserepitecorrectamente1vezcada2minutos,PEROlaatmeganosedespierta: