Autor Tema: Interrupcion RB0 no deseada  (Leído 2220 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado D1to

  • PIC10
  • *
  • Mensajes: 39
Interrupcion RB0 no deseada
« en: 02 de Agosto de 2021, 19:30:12 »
Buenas tardes estimados.

Recurro a ustedes ya que me encuentro en un dilema, estoy haciendo un proyecto, el cual consiste en calentar una plancha.

Uso un pic 16f877A  para el control y mikroC para programar compilar
Un triac para la carga
La carga es una resistencia calefactora
 Nota adicional. La energía llega a una bornera, de ahí alimento la resistencia y alimento una fuente 12v 2A y con ésta fuente alimento al pic. obviamente lo paso por un regulador 7805.

03 pulsadores, set (RB0), + y - para configurar parámetros
01 lcd 16x2 para visualizar temperatura

El programa es más o menos el siguiente,  uso select case para configurar los diferentes parámetros y interrupción RB0 para ir de un case a otro, lo uso así, debido  a la demora que pueda tener al responder al pulsador cuando hay mucho contenido.

El problema es el siguiente. Cuando lo enciendo todo va bien, pero cuando mido voltaje en la bornera  (mencionada anteriormente) salta del case 0 al case 1, como si presionará el botón set  (RB0)

En otra ocasiones va bien pero cuando presiono el botón (RB0) se salta directo al case 2 o hace una mezcla del case 1 con el case 2 (según veo en el lcd).
 A veces va todo bien.

Consulta, es esto causa de ruido eléctrico ¿? nobuso reles
 Se puede arreglar con programación  ( a fin de evitar el tener que rediseñar el circuito)
Si tuviese que rediseñar el circuito, que medida puedo tomar para evitar que esto suceda.
Si implemento WDT ayudaría de algo?

Muchas gracias  por su tiempo, espero puedan ayudarme.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Interrupcion RB0 no deseada
« Respuesta #1 en: 03 de Agosto de 2021, 05:20:37 »
Sin ver por lo menos el fragmento de código de la interrupción va a ser difícil poder averiguar nada.

  Saludos.

Desconectado Yoshua

  • PIC16
  • ***
  • Mensajes: 213
Re:Interrupcion RB0 no deseada
« Respuesta #2 en: 03 de Agosto de 2021, 13:37:00 »
¿Diagrama o fotos de la placa y cableado?
¿De que valor son las resistencias de pull?

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Interrupcion RB0 no deseada
« Respuesta #3 en: 03 de Agosto de 2021, 14:03:40 »
cordial saludo, en ocasiones me ha pasado lo mismo en especial cuando la resistencia pullup es de 10k, lo que he realizado es cambiarla por una de 5.6k o 4.7k y se ha resuelto el problema.
al parecer es  por la corriente de carga, con 10k es de 5 microamperios y con 4.7k es de 1 miliampero y el multimetro altera esa medida y dispara erróneamente.
Esto para pullup, si es pulldown tendrías que colgar el diagrama.
(Tambien seria cuestión de ver cuantos ohmios x voltio tiene tu multimetro, ya que estaría afectando la medición.)
« Última modificación: 03 de Agosto de 2021, 16:05:03 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado D1to

  • PIC10
  • *
  • Mensajes: 39
Re:Interrupcion RB0 no deseada
« Respuesta #4 en: 03 de Agosto de 2021, 22:47:52 »
 

* FUENTE.png
(36.93 kB, 999x384 - visto 410 veces)
 

* PIC.png
(94.21 kB, 1117x597 - visto 415 veces)
 

* PIC.png
(94.21 kB, 1117x597 - visto 374 veces)


Muchas gracias por su tiempo compañeros.

Respondiendo a sus dudas.
Adjunto imágenes de algunas partes del circuito ya que lo tengo muy segmentado.
Los botones los tengo en pull down con resistencias de 10k.
El codigo es bastante extenso, coloco un fragmento del mismo espero sea suficiente, de no serlo, colocaré todo el código.

Código: [Seleccionar]
// Interrupciones
 
  void interrupt() {
       if (INTCON.INTF) {
         //TMR0IE_bit     = 0;
         
         menu++;
         if (menu >2) menu = 0;
         lim_pant       = 1;

         INTCON.INTF    = 0;
       }
       
       if (INTCON.TMR0IF){
          TMR0 = 61;
         
          timer ++;

          PORTC.F5 = ~PORTC.F5; //Monitorear el ciclo
          INTCON.TMR0IF = 0;
      }

 }

Código: [Seleccionar]
while (1){
         switch (menu) {

                case 0:     //Pantalla 1 - Configuracion  Temperatura

                      if (lim_pant == 1){
                          Lcd_Cmd(_LCD_CLEAR);
                          LCD_Out(1, 1, "AJUSTAR");
                          LCD_Out(2, 1, "TEMPERATURA:");
                          lim_pant = 0;
                          delay_ms(400);
                      }
                      if (Button(&PORTE, 1, 100, 1)) {                            // Disminuir temperatura
                          if (set_temp < 28) set_temp++;
                      }
                      if (Button(&PORTE, 0, 100, 1)) {                            // Disminuir temperatura
                          if (set_temp > 16) set_temp--;
                      }

                       ShortToStr(set_temp, txt);
                       Lcd_Out(2, 13, txt);
                     
                break;
                case 1:     // Pantalla 2  - Configuración de Humedad
                     if (lim_pant == 1){
                         Lcd_Cmd(_LCD_CLEAR);
                         Lcd_Out(1, 1, "AJUSTAR");
                         Lcd_Out(2, 1, "HM:");
                         lim_pant = 0;
                         delay_ms(400);
                     }
                     
                     if (Button(&PORTE, 1, 100, 1)) {                            // Aumentar hm
                        if (set_hm < 70) set_hm++;
                     }
                     if (Button(&PORTE, 0, 100, 1)) {                            // Disminuir hm
                        if (set_hm > 50) set_hm--;
                     }
                     
                     ShortToStr(set_hm, txt);
                     Lcd_Out(2, 13, txt);
                break;
                case 2:      // Pantalla 3  - Guardar los parámetros en la rom
                         GIE_bit        = 0;
                         if (lim_pant == 1){
                             Lcd_Cmd(_LCD_CLEAR);
                             Lcd_Out(1, 1, "GUARDANDO");
                             Lcd_Out(2, 1, "CONFIGURACION");
                             delay_ms(1000);
                         }
                         guardar();
                         menu = 10;
                         delay_ms(500);
                         GIE_bit        = 1;
                break;
                ...
                }
}
// menu 10 me lleva aun modo a case 10 donde mido la temperatura del dth11

Muchas gracias por su tiempo.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Interrupcion RB0 no deseada
« Respuesta #5 en: 04 de Agosto de 2021, 22:31:57 »
Generalmente se utiliza un filtro de tipo RC a las entradas del microcontrolador que vienen desde pulsadores e interruptores ¿Las estás usando?

También para eliminar ruido que producen otros elementos y cargas externas, se utilizan filtros como se indica en la imagen adjunta
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Interrupcion RB0 no deseada
« Respuesta #6 en: 04 de Agosto de 2021, 23:12:50 »
Analizando tu código, la variable menú se va incrementar debido a los rebotes mecánicos del pulsador.

Un buen diseño consiste en eliminar los rebotes con un filtro de hardware y software. Si ya no puedes agregar el filtro por hardware, puedes hacerlos por software.

Algo que veo en tu código es que tu lazo while(1) no tiene un estado de reposo donde no haga nada, y sólo cuando sea necesario debería cambiarse la variable menu para ejecutar un proceso y y al finalizarlo vuelva a reposo.

Por ejemplo, digamos que cambias menu a 1. Hace todo lo que tienes en ese case y al finalizar, el lazo while se ejecuta de nuevo y como menu sigue en 1, nuevamente vuelve a realizar todo lo de ese case y así sucesivamente por siempre. Esa programación no es correcta.

Otro consejo. En la interrupción no debes realizar mucho procesamiento, eso debes hacerlo en el lazo while. A lo mucho ahí debes cambiar el valor de menu y nada más.

 
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Interrupcion RB0 no deseada
« Respuesta #7 en: 04 de Agosto de 2021, 23:32:19 »
Más o menos para darte una idea, necesitas un temporizador de los que tienes disponibles y que este siempre funcionando. Funcionará como temporizador del sistema. Digamos que lo configuras para que cada 1000 conteos de ciclos genere 1 ms. También necesitas una variable para capturar el valor del temporizador.

Tu lazo while 1 será así:
Código: [Seleccionar]
while (1)
{
case 1:

menu = reposo; // al final de cada case, vuelvo a reposo
break;
case 2:

menu = reposo; // al final de cada case, vuelvo a reposo
break;
case 3:
menu = reposo; // al final de cada case, vuelvo a reposo
break;
....
case reposo: break;
case antirebote:
if ((obtenerValorTemporizador() - retardo) > _10ms) //cuando transcurran 10 ms, relaiza el proceso que necesitas
{
menu++; /*****************************/
if (menu >2) menu = 0;      /*** En este case hago la modificación de menu ***/
lim_pant       = 1;         /*************************************************/

}

break;


}
Por defecto menu será igual a reposo.

Cuando suceda la interrupción, puedes hacer algo así:
Código: [Seleccionar]
if (INTCON.INTF)
{
if (reposo == menu)
{
menu = antirebote;
retardo = obtenerValorTemporizador(); //capturo un valor del temporizador.
}
INTCON.INTF    = 0;
}
Cuando ocurra una interrupción, si menu está en reposo se cambia menu a antirebote y en la variable retardo se captura el valor que tenga ese instante el temporizador (Cualquiera que tenga)

No importa cuantas veces suceda la interrupción, como menu ya no es igual a reposo, ya no ejecutará lo que hay dentro del if:

Ahora si analizas el case antirebote, verás un if que compara el valor del temporizador menos el capturado. Como dije arriba suponiendo que 1000 ciclos de conteo son 1 ms, entonces _10ms es 10000 ciclos.

Este case, denominado  antirebote, se ejecuta hasta que pasen los 10ms (o el tiempo que logres determinar que es el correcto para eliminar el rebote), cambias el valor de menu y se ejecuta cualquiera de los otros cases. Y ojo.. Cuando finalizas cualquiera de los otros cases, vuelves a poner la variable menu a reposo para otra pulsación
« Última modificación: 05 de Agosto de 2021, 10:07:41 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado D1to

  • PIC10
  • *
  • Mensajes: 39
Re:Interrupcion RB0 no deseada
« Respuesta #8 en: 06 de Agosto de 2021, 01:10:25 »
Muchas gracias estimados

Voy a implementar los cambios sugeridos y voy a ver como me va, vuelvo por aquí en un par de días para comentarles como me fue.
Muchas gracias una vez mas.

Desconectado gustavopic

  • PIC18
  • ****
  • Mensajes: 417
Re:Interrupcion RB0 no deseada
« Respuesta #9 en: 11 de Agosto de 2021, 11:44:50 »
veo en tus dibujos que NO usas ningun electrolitico  robusto, nada de siquiera 100 uF, claro, no lo necesitas ya que venis de una fuente, no de un trafo.
 y leo que al tocar al bornera se te marea todo.

estas seguro , segurisimo que esa bornera no hace falso contacto ??
te ha pasado lo mismo con 2 placas distintas ??
pone un led con su resistencia despues de la bornera.
y pone tambien despues de la bornera un electrolitico de 470 uf , solo para ver que sucede .

 

Desconectado D1to

  • PIC10
  • *
  • Mensajes: 39
Re:Interrupcion RB0 no deseada
« Respuesta #10 en: 18 de Septiembre de 2021, 12:06:11 »
Buenos días
Compañeros.

Después de implementar todos los cambios sugeridos incluyendo los capacitores antes del regulador logré solucionar el problema del ruido incluyendo el de los pulsadores.

Muchas gracias a todos por su tiempo y dedicación.