TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Nocturno en 30 de Enero de 2011, 04:12:56

Título: Interrupción Low_voltage
Publicado por: Nocturno en 30 de Enero de 2011, 04:12:56
Hola amigos, estoy intentando utilizar la interrupción por detección de bajo voltaje que incorpora mi 18F4520 pero no consigo que se active.

Así la inicializo:

Código: C
  1. EsperaEstabilizacion();
  2.    setup_low_volt_detect(LVD_45);
  3.    enable_interrupts(INT_LOWVOLT);
  4.    enable_interrupts(INT_TIMER0);
  5.    enable_interrupts(INT_TIMER1);
  6.    enable_interrupts(INT_TIMER2);
  7.    enable_interrupts(INT_EXT);
  8.    enable_interrupts(INT_EXT1);
  9.    enable_interrupts(INT_RDA);
  10.    enable_interrupts(GLOBAL);

Esta es la función de estabilización:
Código: C
  1. int8 EsperaEstabilizacion(void)
  2. {
  3.    int16 espera;    
  4.    espera = 0xFFFF;  
  5.    
  6.    while(espera--)
  7.      {
  8.       if(IRVST_BIT)
  9.          return(TRUE);
  10.      }        
  11.    return(FALSE);
  12. }

Mi intención es que la interrupción me guarde el contexto en la eeprom, pero para las pruebas estoy intentando apagar unos leds:
Código: C
  1. #int_lowvolt
  2. void BajoVoltaje(void)
  3. {
  4.    disable_interrupts(GLOBAL);
  5.    output_low(LED1);
  6.    output_low(LED2);
  7.    output_low(LED3);
  8.    while (1);
  9. }

Y nada, no consigo que se apaguen.

¿Alguna sugerencia?
Título: Re: Interrupción Low_voltage
Publicado por: migsantiago en 30 de Enero de 2011, 11:41:46
Hola

¿Se puede grabar la EEPROM teniendo bajo voltaje? Yo checaría ese dato. También checaría si el tiempo de grabado es suficiente antes de perder totalmente la energía (5ms por byte).
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 30 de Enero de 2011, 12:59:09
Pues mi objetivo es conseguir hacer esa prueba, Santiago, pero ni siquiera soy capaz de apagar unos leds.

Título: Re: Interrupción Low_voltage
Publicado por: jfh900 en 30 de Enero de 2011, 17:35:35
Para poder grabar, lo que se suele hacer es poner un condensador electrolítico de bastante capacidad con la alimentación del PIC y antes de este un diodo para evitar la descarga del mismo a través de la fuente. Antes del diodo verificamos la tensión, que puede caer, pero con el condensador mantenemos los 5V o 3,3V del micro.

Un saludo
Título: Re: Interrupción Low_voltage
Publicado por: jeremylf en 30 de Enero de 2011, 18:58:05
Estas simulando esa caida de voltaje con algun regulador variable o solo apagas todo? Pues en el ultimo caso, el LED consumiria lo suficientemente rapido lo que queda de corriente hasta que se te apage todo.
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 30 de Enero de 2011, 19:57:35
Bajando la fuente poco a poco y asegurándome con el polímero que la tensión cae por debajo del umbral.
Título: Re: Interrupción Low_voltage
Publicado por: Suky en 30 de Enero de 2011, 20:18:47
Controlaste que la versión de CCS que usas configura correctamente los registros? En este caso son HLVDCON, PIE2, IPR2, ect.


Saludos!
Título: Re: Interrupción Low_voltage
Publicado por: bmb en 30 de Enero de 2011, 20:40:10
Hola Nocturno, conociendo el temperamento del CCS y dependiendo de que versión estés usando, puedes intentar de la siguiente manera para el encabezado del main():

Código: C
  1. setup_low_volt_detect(LVD_45|LVD_TRIGGER_BELOW);
  2.    enable_interrupts(INT_LVD);
  3.    enable_interrupts(GLOBAL);

y con la interrupción asi:

Código: C
  1. #int_LVD
  2. void BajoVoltaje(void)
  3. {
  4.    disable_interrupts(GLOBAL);
  5.    output_low(LED1);
  6.    output_low(LED2);
  7.    output_low(LED3);
  8.    while (1);
  9. }

A partir de la vesión 4.109 cambia INT_LVD por INT_HLVD;

Saludos!
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 31 de Enero de 2011, 03:12:06
Pues finalmente haciendo caso de vuestros consejos he conseguido que funcione.
Una vez más, parece que CCS tenía la culpa, ya que esto:
Código: C
  1. setup_low_volt_detect(LVD_45|LVD_TRIGGER_BELOW);
  2. enable_interrupts(INT_HLVD);

no provocaba ningún cambio en el contenido del registro HLVDCON.

Así que he dejado la inicialización así:
Código: C
  1. HLVDCON = 0b00110101;

Y ya por fin entra en la interrupción  :-/  :-/

Y he modificado la interrupción para ver si le daría tiempo de guardar el contexto en la EEPROM, ¡y también funciona!. Cada vez que quito la alimentación, se incrementan en uno los 4 primeros bytes de la eeprom.

Código: C
  1. #int_HLVD
  2. void BajoVoltaje(void)
  3. {
  4.    disable_interrupts(GLOBAL);
  5.    write_eeprom(0,read_eeprom(0)+1);
  6.    write_eeprom(1,read_eeprom(1)+1);
  7.    write_eeprom(2,read_eeprom(2)+1);
  8.    write_eeprom(3,read_eeprom(3)+1);
  9.    while (1);
  10. }
Título: Re: Interrupción Low_voltage
Publicado por: Suky en 31 de Enero de 2011, 10:38:05
Me alegro que haya funcionado, y muy interesante los resultados. Tener la posibilidad de guardar 4 Bytes  es muy útil!


Saludos!
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 31 de Enero de 2011, 12:16:48
Imagino que dependerá del condensador que tengas en la alimentación.
A ver si luego pruebo a escribir todos los bytes de la eeprom en un bucle para poder comprobar a cuántos le da tiempo a alcanzar con el tiempo de apagado.
Título: Re: Interrupción Low_voltage
Publicado por: Suky en 31 de Enero de 2011, 13:55:03
Imagino que dependerá del condensador que tengas en la alimentación.
A ver si luego pruebo a escribir todos los bytes de la eeprom en un bucle para poder comprobar a cuántos le da tiempo a alcanzar con el tiempo de apagado.

Claro, depende de cual sea el consumo de todo el sistema. Pero es algo a tener en cuenta.


Saludos!
Título: Re: Interrupción Low_voltage
Publicado por: jeremylf en 31 de Enero de 2011, 17:46:01
Por cierto, en ese PIC pero no piensas usar su Brown-Out (si es que tiene) ???
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 31 de Enero de 2011, 17:54:20
Sí, también uso Brown-out a un nivel inferior al de esta interrupción.
Título: Re: Interrupción Low_voltage
Publicado por: bmb en 31 de Enero de 2011, 20:04:28
Muy interesante la forma de resolverlo, me alegra que esté funcionando.

Saludos!
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 01 de Febrero de 2011, 03:02:51
Pues ya he hecho la prueba, modifiqué el código de la interrupción tal que así:


Código: C
  1. #int_HLVD
  2. void BajoVoltaje(void)
  3. {
  4.    for (i=0;i<255;i++) {
  5.       write_eeprom(i,read_eeprom(i)+1);
  6.    }
  7.    while (!EsperaEstabilizacion());
  8. }

Y al cortar la alimentación le ha dado tiempo a guardar ¡42 bytes!

Utilizo un condensador de 100uF/63V en las líneas de alimentación del PIC, y el consumo es de 30mA.
Título: Re: Interrupción Low_voltage
Publicado por: bmb en 01 de Febrero de 2011, 08:53:18
Pues esto que nos muestras va a ser algo muy útil  :-/.  Muchas gracias Nocturno!

Saludos!
Título: Re: Interrupción Low_voltage
Publicado por: micro_pepe en 26 de Julio de 2012, 16:52:28
Necesito justamente eso que hizo Nocturno, pero resulta que he visto un circuito que está haciendo algo así con un pic16f870. Este pic no tiene el módulo detector de bajo voltaje, y en el esquema no veo divisores de voltaje a un adc o algo así ¿Como lo hará?   :shock:  o nos está engañando y usa un 18f...

El esquema en cuestión es este:

http://www.rfcandy.biz/communication/pic/transchm.gif

y el proyecto:

http://www.rfcandy.biz/communication/transcendent.html

En el texto dice que los valores configurados se salvan al apagar el circuito.

Saludos.

Título: Re: Interrupción Low_voltage
Publicado por: MGLSOFT en 26 de Julio de 2012, 17:28:11
Pues ya he hecho la prueba, modifiqué el código de la interrupción tal que así:


Código: C
  1. #int_HLVD
  2. void BajoVoltaje(void)
  3. {
  4.    for (i=0;i<255;i++) {
  5.       write_eeprom(i,read_eeprom(i)+1);
  6.    }
  7.    while (!EsperaEstabilizacion());
  8. }

Y al cortar la alimentación le ha dado tiempo a guardar ¡42 bytes!

Utilizo un condensador de 100uF/63V en las líneas de alimentación del PIC, y el consumo es de 30mA.


Para que leer una posicion de eeprom y guardarla en la anterior??
Si asi guardaste 42 bytes, sin leer la eeprom seguro guardas mas de 64...
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 27 de Julio de 2012, 00:51:13

En el texto dice que los valores configurados se salvan al apagar el circuito.



¿Te refieres a esta frase?
Power down memory for all menu options and settings

Si es así, no interpreto que haga el salvado de datos al apagar, sino que los conserva al apagarlo, pero perfectamente ha podido hacer el salvado después de configurar el dispositivo. Basta con guardar en la eeprom después de cada cambio en la configuración.

Para que leer una posicion de eeprom y guardarla en la anterior??
Si asi guardaste 42 bytes, sin leer la eeprom seguro guardas mas de 64...

Lo que hace esa rutina es incrementar los registros de la eeprom a modo de contador para poder evaluar hasta dónde llegó, pero tienes razón, si es un salvado simple te dará tiempo a mucho más.
Título: Re: Interrupción Low_voltage
Publicado por: MGLSOFT en 27 de Julio de 2012, 08:54:33
Citar
Basta con guardar en la eeprom después de cada cambio en la configuración.
Cuando es un valor de configuracion, tienes razon.
El tema es cuando es un totalizador, por ejemplo la cuenta de litros despachados de un surtidor.
Si lo grabas despues de cada despacho, y se despacha bastante, lo mas probable es que tu eeprom se muera al cabo de un tiempo, porque superó el limite de grabaciones.

Para eso lo que se hace es, primero revisar si el valor a guardar es distinto al valor en la posición respectiva en eeprom, si es distinto, entonces se graba. O sea que primero la lees, la comparas, y si es distinto grabas, sino sigues con el proximo valor...

A esto me referia, Manolo, veía que leías, pero no comparabas, sino que escribías directamente el valor, en ese caso para que leerlo?? ;-) ;-)
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 27 de Julio de 2012, 10:55:58
Sí, sí, si tengo claro lo que cuentas. El objetivo de mi rutina era de alguna forma medir el tiempo que tardaba el micro en dejar de guardar datos y para ello puse un contador incremental. Pero vamos, que es verdad que se puede optimizar un huevo.
Título: Re: Interrupción Low_voltage
Publicado por: micro_pepe en 27 de Julio de 2012, 10:58:59
¿Te refieres a esta frase?
Power down memory for all menu options and settings

No, me referia a esta: All settings of the transcendent counter will be stored during power down.

Lo de leer primero y guardar si es diferente ahorra ciclos de escritura, pero si es un parametro que se modifica con mucha frecuencia, siguen siendo muchas.

Salidos.
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 27 de Julio de 2012, 12:10:14
Ah, pues tienes razón; no sé cómo lo habrá hecho. Sería interesante descubrirlo.
Título: Re: Interrupción Low_voltage
Publicado por: MGLSOFT en 27 de Julio de 2012, 14:15:19
Deben hacerse varias cosas:
Apagar todas las salidas que estan activas en ese momento, no usar el conversor, sacar de servicio todos los perifericos y cosas que consumen energia.
Despues deberia alcanzar para guardar los datos sin problemas...
Título: Re: Interrupción Low_voltage
Publicado por: micro_pepe en 30 de Julio de 2012, 09:14:59
Deben hacerse varias cosas:
Apagar todas las salidas que estan activas en ese momento, no usar el conversor, sacar de servicio todos los perifericos y cosas que consumen energia.
Despues deberia alcanzar para guardar los datos sin problemas...

Sí, pero eso se hace cuando se detecta que el pic se ha apagado con la interrupción de low-voltaje, pero con un pic que no tiene esa interrupción ¿como se hace?

Saludos.
Título: Re: Interrupción Low_voltage
Publicado por: MGLSOFT en 30 de Julio de 2012, 09:23:48
En un PIC sin interrupcion por low voltaje se usa un integrado externo que detecta el bajo voltaje y entra por un pin de interrupcion externa, es "casi" lo mismo, y puedes resguardar tus datos de la misma forma.
Por supuesto tu placa ser mas grande y mas cara tambien.. :mrgreen:
Título: Re: Interrupción Low_voltage
Publicado por: Nocturno en 30 de Julio de 2012, 10:57:48
También puedes detectarlo sensando la alimentación antes del regulador. Cuando empiece a caer, tienes unos ms para guardar proporcionados por el condensata que hay tras el regulador.