Necesito ayuda para comprender la activación de ultra bajo consumo en PIC16F887

Estoy tratando de implementar la función "Despertar de potencia ultra baja" en un pequeño proyecto PIC. La idea es que el chip se vaya a dormir y luego se despierte en el futuro por la interrupción de ULPWU.

La idea detrás del ULPWU es que conectas un capacitor a este pin, lo cargas y pones el chip a dormir. Cuando está configurado, el pin ULPWU descargará lentamente el capacitor. Una vez que el voltaje en la tapa cae a algún valor, el chip se activa y posiblemente genera una interrupción.

Esta nota de aplicación (PDF) de Microchip explica cómo se programa e implementa el ULPWU. Consulte el Ejemplo 2 y la Figura 2 (abajo).

Ejemplo 2:

BANKSEL PORTA           ;
BSF PORTA, 0            ;Set RA0 data latch
BANKSEL ANSEL           ;
BCF ANSEL, 0            ;RA0 to digital I/O
BANKSEL TRISA           ;
BCF TRISA, 0            ;Output high to
CALL CapDelay           ;charge capacitor 
BANKSEL PIR2            ;
BCF PIR2, ULPWUIF       ;Clear flag
BANKSEL PCON            ;
BSF PCON, ULPWUE        ;Enable ULP Wake-up
BSF TRISA,  0           ;RAO to input
BSF PIE2, ULPWUIE       ;Enable interrupt
MOVLW B’11000000’       ;Enable peripheral
                        ;interrupt
MOVWF   INTCON          ;
SLEEP                   ;Wait for interrupt
NOP                     ;


ingrese la descripción de la imagen aquí

He llevado a cabo esto, pero estoy atascado con un problema extraño.

Cuando el chip entra en reposo, el pin ULWU (RA0) suministra 5 V. Si conecto este pin a tierra, el chip se activa y hace lo que se supone que debe hacer.

Mi pregunta es, ¿por qué hay 5V en este pin cuando se supone que es una entrada? Si tengo este pin conectado a un capacitor cargado, el capacitor nunca se descarga (los 5V en el pin lo mantienen cargado).

EDITAR
Aquí está mi código de prueba. No estoy usando un condensador en este caso. Simplemente estoy cambiando el pin RA0 de alto a bajo. La pregunta sigue siendo, ¿por qué RA0 es alto cuando se supone que debe descargar un capacitor para activar la función de activación?

INCLUDE registers.asm
__CONFIG 0x2EFF20E5
     ORG    0x00
    GOTO    MAIN
;***********************************************
;Interrupt Service Routine
;turn on an led and return
;*********************************************
    ORG 0X04
ISR
    BANKSEL PORTD
    BSF PORTD,7
RETFIE

MAIN
    CALL    SETUP
    CALL    SETUP_WU
    SLEEP
TRAP
    GOTO    TRAP

SETUP
    BANKSEL ANSELH
    CLRF    ANSELH      ;CONFIGURE ALL PINS FOR DIGITAL IO
    CLRF    ANSEL
    BANKSEL TRISD   ;PORTD IS OUTPUT
    CLRF    TRISD
    BANKSEL PORTD
    CLRF    PORTD
    RETURN

SETUP_WU
    BANKSEL PORTA
    BSF PORTA,0
    BANKSEL ANSEL
    CLRF    ANSEL
    BANKSEL TRISA
    BCF TRISA,0
    BANKSEL PIR2
    BCF PIR2,2
    BANKSEL PCON
    BSF PCON,5
    BSF TRISA,0
    BSF PIE2,2
    MOVLW   B'11000000'
    MOVWF   INTCON
    RETURN

END
¿A qué valor del condensador tienes conectado el pin?
@Oli Glaser He probado 100uF, 10uF y en algún lugar en el rango de pF.
Ha publicado el código de muestra, pero puede ayudar si publica el código real que está utilizando. Puede que haya algo mal allí.
Probablemente esté borrando, en lugar de configurar el bit menos significativo de TRISA. Debería ser " BSF TRISA, 0 " en lugar de "BCF TRISA, 0"
@gmagno Eso no puede ser correcto. Cuando el pin se conecta manualmente a tierra, el procesador se activa y se genera una interrupción. Eso indicaría que la función ULWU está funcionando y PORTA está configurado para la entrada.
@Michael En realidad, una unidad externa fuerte a tierra activaría el comparador ULPWU independientemente de si PORTA es una entrada o una salida. Pruebe qué tan fuerte es el ALTO en PORTA colocando una resistencia a tierra y midiendo su voltaje.
@Michael Solo para obtener más aclaraciones: ¿cuál es exactamente su configuración de prueba? ¿Tienes un multímetro conectado al pin todo el tiempo? Esto estará inyectando una corriente y mantendrá el pin cargado. ¿Ha probado el ULPWU sin nada en el pin excepto el capacitor (sin equipo de prueba)?
@justing Estoy usando un alcance para leer la señal en el pin. Me he acostumbrado a no usar una gorra y simplemente cambiar el pin de bajo a alto.

Respuestas (2)

¿Está seguro de que ha esperado el tiempo apropiado para que se descargue el condensador? Usando la Ecuación 2 en la nota de aplicación:

ecuación 2

y los valores de su condensador que ha proporcionado en sus comentarios (x pF, 10uF, 100uF), los tiempos de descarga serían:

(5V - 0.6V)*10pF / 140nA = 314 usegundos

(5V - 0.6V)*10uF / 140nA = 314 segundos ~= 5 minutos

(5V - 0,6V)*100uF / 140nA = 3143 segundos ~= 52,3 minutos

Tal vez no esté esperando lo suficiente en sus condensadores uF, y el pF es demasiado pequeño y hace que el micro se atasque en su rutina de interrupción (o algo así, sin proporcionar SU código es imposible adivinar cualquier tipo de error de codificación) .

Un buen valor para probar puede estar en el rango de 100 nF, que se despertaría cada ~ 3 segundos, lo que sería fácil de ver a simple vista si está funcionando.

NOTA: Tomé los valores que usé en la Ecuación 2 de los valores de ejemplo en la nota de aplicación.

Buena sugerencia. Sin embargo, puedo verificar con un alcance que la tapa se está cargando. Y no creo que eso responda a la pregunta de por qué el pin se configura alto con 5v después de haberlo configurado como entrada.
@Michael Deberías publicar tu código para obtener más ayuda. Solo publicar el código de ejemplo no nos ayuda mucho.
Sí, tienes razón y te pido disculpas. Esta función es parte de un programa más grande. Realmente debería haber intentado hacer que este subsistema funcionara por sí solo antes de incorporarlo a un programa más grande. Necesito pausar esta pregunta por un momento para poder trabajar un poco más.
He agregado mi programa a la pregunta según lo solicitado.

Es posible que haya un pull-up interno en este pin que esté activado.