¿Es el uso correcto del RTC RV8523 para activar un atmega328p?

1

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:

    
pregunta A.Girafe

1 respuesta

1

Solo se puede utilizar la interrupción de nivel para despertar mediante INT0 / 1. La interrupción de cambio de nivel no funciona.

Además, si hay una necesidad de procesar la interrupción (no solo de despertarse), entonces se debe mantener bajo durante todo el tiempo de activación, que puede durar hasta 258 ciclos de reloj. De lo contrario, la MCU se activará, pero la interrupción se perderá.

ACTUALIZACIÓN

No está directamente relacionado con la pregunta, pero podría valer la pena considerarlo.

El límite de 8 segundos en el tiempo de espera que lo obligó a usar un temporizador externo es artificial. Es un resultado directo de la biblioteca que está utilizando confiar en el temporizador de vigilancia como fuente de interrupción de activación. La razón por la que usan el watchdog es que WDT es la única fuente de interrupción interna disponible en todos los modos de suspensión. Esto facilita la escritura de la biblioteca, pero no significa que el resultado final sea el mejor posible.

El modo de inactividad más bajo es el apagado. Watchdog, interrupción externa y coincidencia TWI son las únicas fuentes de interrupción posibles disponibles. Esto le obliga a utilizar una interrupción externa para demoras de más de 8 s. El consumo total de energía es apagado + reloj externo, o 0.5uA + 0.13uA = 0.63uA

Echemos un vistazo al modo de ahorro de energía. La única diferencia con el apagado es que el reloj asíncrono está activo, lo que le permite utilizar el cristal de reloj de 32.768 kHz como fuente de reloj. Y se puede utilizar para la interrupción del despertador. El consumo total de energía es Ahorro de energía, que es Apagado + reloj interno. De acuerdo con la hoja de datos, la corriente de alrededor de 0.95uA se puede lograr en este modo (aunque es necesario hacer algunos trucos de software avanzados para esto, como desactivar el apagón, apagar el ADC, etc.)

La diferencia entre estos modos es dos veces menor que incluso el consumo de LDO de corriente de reposo ultra bajo (aproximadamente 0.5uA). Teniendo en cuenta que esto le permite deshacerse de todas esas partes externas, diría que es una opción bastante viable.

Hay dos inconvenientes a considerar. Primero, dado que los mismos pines se utilizan para el cristal de reloj que para el oscilador de cristal normal, está limitado al oscilador RC interno como fuente de reloj del sistema. Tenga en cuenta que el usuario puede calibrar el RC interno con aproximadamente un 1% de precisión, lo que debería ser suficiente para la mayoría de las aplicaciones.

En segundo lugar, no hay ninguna copia de seguridad de botón que haya mencionado anteriormente. Sin embargo, dado que se trata de una aplicación que funciona con batería (supongo que sí, de lo contrario controlaría el adaptador de alimentación por el reloj, no el modo de espera de la MCU), no veo la necesidad de realizar una copia de seguridad. Una batería es una batería. Puede agregar simples interruptores Mosfet para apagar la alimentación del resto del circuito y para conectar la batería al pin ADC. Luego mediría el voltaje de la batería al despertar y deshabilitaría todo menos el RTC si está bajando demasiado.

    
respondido por el Maple

Lea otras preguntas en las etiquetas