Autor Tema: Interrupciones para el 12F629  (Leído 8814 veces)

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

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
Interrupciones para el 12F629
« en: 29 de Junio de 2004, 05:21:00 »
Hola chicos


Me gustaría pediros que echárais un ojo a este código que he preparado para controlar el parpadeo de una lámpara. Estoy usando el enano capullito 12F629, que está dando una guerra....

Se debe iniciar una secuencia de parpadeo cuando entra un flanco de bajada en la entrada "activar", y se debe interrumpir el parpadeo en cuanto entre un flanco de bajada en la entrada "desactivar".

Yo por más que miro y miro ... no veo nada erróneo...  compila bien... pero no hace nada!
a ver qué opináis los gurús del basic este de marras...
Muchas gracias!!
Codigo:

"****************************************************************
"*  Name    : lampara-flash.BAS                                 *
"*  Author  : Elena                                             *
"*          : All Rights Reserved.... pozzi                     *
"*                                                              *
"*  ENTRADAS: activar y desactivar: señal de radiofrecuencia    *
"*             que entran al PIC por flanco de bajada           *
"*  SALIDA  : señal a un relé para encender o                   *
"*          : apagar la lamparita                               *
"*          :                                                   *
"****************************************************************
    @ DEVICE pic12F629, 0x1FC4 "palabra de configuración: PWRT y BOREN enables
    " Programo el enano este con Osc_Interno,
    " pero con Mclr_externo!! según me ha dicho Sispic,
    @ ID 0x0012
    OPTION_REG = %01111111 "resistencias de pullup
    WPU = %00110011 "despertar resistencias
    TRISIO=%001100 "entradas: GP4 y GP5. Salida: GP2
    CMCON=%00000111 " Deshabilitar Comparatores. No lo uso para nada.
    INTCON = %10001000  "registro de interrupciones
        " 7=GIE, 6=PEIE, 5=TMR0IE, 4=INTE, 3=GPIE, 2=TMR0IF, 1=INTF, 0=GPIF
        " GIE = 1"global interrupt enable
        " INTE = 0"GP2 interrupt enable
        " GPIE = 1"GPIO interrupt enable: interrupción por cambio de estado
        " INTF = 0" Clear GP2 INT Flag
        " GPIF = 0" Clear GPIO INT Flag
     IOC.4 = 1" habilitar interrupción por cambio en GP4
     IOC.5 = 1" habilitar interrupción por cambio en GP5

    " Variables y alias
     GPIF VAR INTCON.0  
     rele VAR GPIO.2
     activar VAR GPIO.5
     desactivar VAR GPIO.4
     mode VAR BIT
     i VAR WORD
     ON INTERRUPT GOTO MyInter


     "rutina de interrupción
     Disable"Deshabilitar Interrupciones mientras ejecuta la rutina
MyInter:
     "Comprobar si la interrupción la causó cambio de estado en GP4 o GP5
    IF GPIF then
     GPIF = 0"borrar flag de interrupción
        if !activar then"cuando lea el puerto, borraré el flag de interrupción
        mode = 1
        gosub activaRele
        endif
        if !desactivar then"cuando lea el puerto, borraré el flag de interrupción
        LOW rele
        endif
    ENDIF
    Resume
    Enable

    "rutina principal
MAIN:
    IF mode THEN
        mode = 0
        " Primer parpadeo
        HIGH rele
        PAUSE 10000
        LOW rele
        " Segundo parpadeo
        FOR i = 1 TO 30
            HIGH rele
            PAUSE 100
            LOW rele
            PAUSE 100
        NEXT i
        " Tercer parpadeo
    loop:
        HIGH rele
        PAUSE 100
        LOW rele
        PAUSE 1100  
        Goto loop
    ENDIF
    GOTO MAIN

activaRele:
    HIGH rele
    return

End





Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #1 en: 29 de Junio de 2004, 07:21:00 »
Codigo:

     "rutina de interrupción
     Disable"Deshabilitar Interrupciones mientras ejecuta la rutina
MyInter:
     "Comprobar si la interrupción la causó cambio de estado en GP4 o GP5
    IF GPIF=1 then
        if activar = 1 then"cuando lea el puerto, borraré el flag de interrupción
        mode = 1
        high rele
        endif
        if desactivar = 1 then"cuando lea el puerto, borraré el flag de interrupción
        mode = 0
        LOW rele
        endif
    ENDIF
    GPIF = 0"borrar flag de interrupción
    Resume
    Enable
   
    "rutina principal
MAIN:
    IF mode = 1 THEN
        mode = 0
        " Primer parpadeo
        HIGH rele
        PAUSE 10000
        LOW rele
        pause 100
        " Segundo parpadeo
        FOR i = 1 TO 30
            HIGH rele
            PAUSE 100
            LOW rele
            PAUSE 100
        NEXT i
        " Tercer parpadeo
    loop:
        HIGH rele
        PAUSE 100
        LOW rele
        PAUSE 1100  
        Goto loop
    ENDIF
    GOTO MAIN

End



Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #2 en: 29 de Junio de 2004, 07:24:00 »
ahora, solo me queda decir, que el tercer parpadeo, se queda en un buble infinito... vamos eso creo...

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Interrupciones para el 12F629
« Respuesta #3 en: 29 de Junio de 2004, 07:29:00 »
A ver Abago, bonito, que no tengo la bola mágica bien calibrada esta mañana......

¿qué quieres ddecir con tu respuesta? ¿que te ha gustado mucho esa parte del código y la vas a guardar como recuerdo? o que mi código está mal porque la parte de configuración de PIC hay que pasársela por el forro?...
Más bien creo que se te ha escapado el dedico al botón de añadir respuesta, verdad?

Jejeje... si es que no se puede desayunar cazalla, hombre....

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Interrupciones para el 12F629
« Respuesta #4 en: 29 de Junio de 2004, 07:31:00 »
AH! JAJA has sido más rápido que yo con esa segunda respuesta.

Pues sí, eso es lo que debe hacer: quedar parpadeando en forma de baliza hasta que le entre un flanco en "desactivar", lo que produciría una interrupción con mode=0 y eso haría apagar la lámpara. Eso es. Esta correcto ese bucle ahí puesto.

Más cositas?

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #5 en: 29 de Junio de 2004, 07:37:00 »
Pero por mucho que pongas el flag mode a 0, nunca saldrás del bucle, porque una vez que llegas al tercer parpaceo, ya no vuelves a comparar el flag...

yo lo haría con un

while mode = 0
      HIGH rele
      PAUSE 100
      LOW rele
      PAUSE 1100  
wend

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Interrupciones para el 12F629
« Respuesta #6 en: 29 de Junio de 2004, 07:41:00 »
Pero a ver.... saldré del bucle en cuento entre una nueva interrupción. En ese caso la ejecución del programa salta a la rutina MyInter. No hace falta chequear la variable mode para salir del bucle, salgo con la interrupción, no?

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: Interrupciones para el 12F629
« Respuesta #7 en: 29 de Junio de 2004, 15:12:00 »
He puesto asteriscos en donde parece que hay cosas raras ************** y esta corregido pero no provado

Codigo:

"****************************************************************
"*  Name    : lampara-flash.BAS                                 *
"*  Author  : Elena                                             *
"*          : All Rights Reserved.... pozzi                     *
"*                                                              *
"*  ENTRADAS: activar y desactivar: señal de radiofrecuencia    *
"*             que entran al PIC por flanco de bajada           *
"*  SALIDA  : señal a un relé para encender o                   *
"*          : apagar la lamparita                               *
"*          :                                                   *
"****************************************************************
    @ DEVICE pic12F629, 0x1FC4 "palabra de configuración: PWRT y BOREN enables
    " Programo el enano este con Osc_Interno,
    " pero con Mclr_externo!! según me ha dicho Sispic,
    @ ID 0x0012
    OPTION_REG = %01111111 "resistencias de pullup
    WPU = %00110011 "despertar resistencias
    TRISIO=%001100 "entradas: GP4 y GP5. Salida: GP2
    CMCON=%00000111 " Deshabilitar Comparatores. No lo uso para nada.
    INTCON = %10001000  "registro de interrupciones
        " 7=GIE, 6=PEIE, 5=TMR0IE, 4=INTE, 3=GPIE, 2=TMR0IF, 1=INTF, 0=GPIF
        " GIE = 1"global interrupt enable
        " INTE = 0"GP2 interrupt enable
        " GPIE = 1"GPIO interrupt enable: interrupción por cambio de estado
        " INTF = 0" Clear GP2 INT Flag
        " GPIF = 0" Clear GPIO INT Flag
     IOC.4 = 1" habilitar interrupción por cambio en GP4
     IOC.5 = 1" habilitar interrupción por cambio en GP5

    " Variables y alias
     GPIF VAR INTCON.0
     rele VAR GPIO.2
     activar VAR GPIO.5
     desactivar VAR GPIO.4
     mode VAR BIT
     i VAR WORD
     ON INTERRUPT GOTO MyInter

     mode = 0 ""  *****************
     Goto MAIN ""***************  saltar el hadler de interrupciom es mejor *********************
     
     "rutina de interrupción
     Disable"Deshabilitar Interrupciones mientras ejecuta la rutina
MyInter:
    Disable "********************
     "Comprobar si la interrupción la causó cambio de estado en GP4 o GP5
                      " ************  IF GPIF then - esto no funciona bien con pbp , no se por que usa  IF GPIF=1 then
    IF GPIF = 1 then  " ************  es absurdo comprovar la causa si solo ella esta activada ,, pero no pasa nada
     GPIF = 0"borrar flag de interrupción
        if activar = 0 then"   if activar ******** cuando lea el puerto, borraré el flag de interrupción
        mode = 1
        gosub activaRele
        endif
        if desactivar = 0 then" if desactivar  ****** cuando lea el puerto, borraré el flag de interrupción
        LOW rele
        endif
    ENDIF
    Resume
    Enable

    "rutina principal
MAIN:
    IF mode = 1 THEN   " ************
        mode = 0
        " Primer parpadeo
        HIGH rele
        PAUSE 10000
        LOW rele
        " Segundo parpadeo
        FOR i = 1 TO 30
            HIGH rele
            PAUSE 100
            LOW rele
            PAUSE 100
        NEXT i
        " Tercer parpadeo
    loop:                 """ *** Abago tiene razon con lo que dice , de aqui no saldras nunca
        HIGH rele         """ solo cuando atienda a la interrupcion , pero regresa otra vez al encontrar RESUME
        PAUSE 100
        LOW rele
        PAUSE 1100
        if mode = 0 then Goto loop    """ ******** sales asi por ejemplo
    ENDIF
    GOTO MAIN

activaRele:
    HIGH rele
    return

End


tu sistema de salir del loop no funcionara por que al poner al final de la llamada de interrupcion RESUME es como añadir retfie.


Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #8 en: 29 de Junio de 2004, 17:02:00 »
La interrupción solo cambia el estado del flag, pero hay que hacer una comparación para salir del buble...

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Interrupciones para el 12F629
« Respuesta #9 en: 30 de Junio de 2004, 03:08:00 »
Vale chicos, Muuuuuuuuuuuuchas gracias a los dos!!!!!!
A ver, recopiando:

* Inicializar la variable mode. Vale.... esto se me pasó...
* Saltar el jandeler de interrupciones al comenzar. Pozzi, también se me pasó.
* Poner el disable interrupciones justo a la entrada de la rutina de interrupción. De acuerdo. Aunque a veces
he leído que hay que colocarlo antes...
* Comprobar el estado de "mode" para poder salir del bucle infinito ese.. muy bien: hacer más caso a Abago.

Bueno, esta tarde los pruebo y ya os cuento a ver.
GRACIAS!!!!!!!!!!!!!!!!!!!
Elena

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #10 en: 30 de Junio de 2004, 04:14:00 »
a ver si te pasas a tomar el bloody mary y nos lo curramos en un periquete....


Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Interrupciones para el 12F629
« Respuesta #11 en: 30 de Junio de 2004, 04:26:00 »
AH! gracias, bonito.
Cualquier día te aviso y voy a pasar el modelito a t passarela,
Espero que no hagas los bloody mary"s muy bien, porque me encantan.... y corro el riesgo de entrar en un bucle infinito...
loop:
       HIGH bloody-mary
       if borrachuza=0 then
       goto loop

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #12 en: 30 de Junio de 2004, 04:58:00 »
while ((borrachuza = 0) and (bareto_abierto = 1))
 HIGH Bloody_Mary
wend

Yo sigo en mis trece... con el while o el loop until...
Se nota que usas el ensamblador.... y lo digo por lo de los gotos....

Ah!!!, por cierto, ya tenemos primer visitante del foro al garito..
RGL...
Podíamos nombrar Passarela... Punto de encuentro de FOREROS ALCOHOLICOS....

Desconectado Elena2000

  • PIC24F
  • *****
  • Mensajes: 722
RE: Interrupciones para el 12F629
« Respuesta #13 en: 30 de Junio de 2004, 05:08:00 »
Si, jejeje, no puedo evitar los gotossssss. Si te digo la verdad, esta chorrada de programa la hice
en ensamblador en un periquete, y funcionó que-te-cagas, (la hice para un 16f84, pero es similar).
De momento el basic me torea, ya ves, pero en fin... a ver si con más práctica domino los whiles como tú.

Anda! así que me han ganado por la mano! estuvo Ricky por ahí?! pues nada, genial, cualquier día caigo yo, ya sabes. Prepara el bloody.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: Interrupciones para el 12F629
« Respuesta #14 en: 30 de Junio de 2004, 05:16:00 »
A ver si liamos tambien a marques, y montamos una tertulia sobre electrónica....
Que la verdad ya estoy harto de hablar de mis proyectos a gente que me pone cara de pez...
Y la verdad es que no se si es por el pedo que llevan, o porque no entienden nada de lo que les estoy contando...


 

anything