Autor Tema: 12F629 Interrupciones  (Leído 3183 veces)

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

Desconectado wolfman77

  • PIC12
  • **
  • Mensajes: 82
    • Dos en la ruta
12F629 Interrupciones
« en: 31 de Diciembre de 2015, 17:57:55 »
Hola a todos, he vuelto despues de unos meses de ausencia (el trabajo me esta matando), y decidi retomar lo de los pic bajo Pic Simulator IDE, en este caso estoy en un proyecto de funcionamiento muy sencillo, para lo que quiero utilizar un 12F629, la idea consiste en encender un led de manera gradual (una especie de PWM improvisado) y apagarlo de la misma manera, lo hice y el efecto funciona de maravillas, el problema esta cuando quiero hacer que funcione mediante un pulsador, no doy en la tecla con las interrupciones
En resumen: pulso y quiero que encienda gradualmente, pulso de nuevo y quiero que apague tambien gradualmente, vuelvo a pulsar y quiero que encienda, y asi por los siglos de los siglos.

Les dejo el codigo a ver si alguno puede ser tan amable de darme una pequeña mano con las instrucciones, me canse de buscar y no encuentro nada o donde puedo estar errando (no busco solo desde hoy, llevo varios dias en esto y se me quemaron los papeles)


Seteo a GP3 como entrada y GP0 como salida

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 4
TRISIO = %001000
Dim tiempon As Word
Dim tiempoff As Word
INTCON = %10001000
tiempon = 0
tiempoff = 20

encendido:                                 '-- Encendido progresivo --
GPIO = %000001                      'Enciendo el LED
WaitMs tiempon                         'Espero tiempon
GPIO = %000000                      'Apago el LED
WaitMs tiempoff                         'Espero tiempoff
tiempon = tiempon + 1              'Incremento el valor de tiempon
tiempoff = tiempoff - 1               'Reduzco el valor de tiepoff
If tiempon = 20 Then
Goto fin
Else
Goto encendido
Endif

apagado:
GPIO = %000001
WaitMs tiempon
GPIO = %000000
WaitMs tiempoff
tiempon = tiempon - 1
tiempoff = tiempoff + 1
If tiempon = 1 Then
Goto fin
Else
Goto apagado
Endif

fin:

End                                               

On Interrupt
If tiempon = 1 Then
Goto encendido
Else
Goto apagado
Resume                                           

Volviendo al mundo de los PIC....

Desconectado luchoc

  • PIC10
  • *
  • Mensajes: 47
Re:12F629 Interrupciones
« Respuesta #1 en: 06 de Enero de 2016, 15:03:40 »
Hola, yo no tengo gran conocimiento pero entre los dos seguro lo sacamos andando!

1)En que lenguaje estas programando? yo uso BASIC.
2)Fijate que en la linea donde dice fin: abajo tenes END, en teoría "END" debería ir al final de todo el código.
3)Subí el archivo de simulación así lo pruebo desde acá!

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:12F629 Interrupciones
« Respuesta #2 en: 08 de Enero de 2016, 12:10:13 »
Tienes varios fallos de estructuración pero el principal es que cuando se entra en la subrutina de interrupciones a la fuerza hay que permitir que se ejecute la ultima línea "RESUME", si no se ejecuta, al poco el micro comienza a hacer cosas raras. Te recomendaría que reescribieras el programa omitiendo los Gotos y los sustituyeras por los Gosub-Return. En realidad los gotos no se utilizan en los lenguajes de alto nivel porque hacen el código muy complicado de entender para el que no lo ha realizado, y pueden provocar fácilmente, como en tu caso, que se sature la pila o stack del micro provocando que trabaje el pic de una forma errática.

----------------------------------

Nota: Recién me he dato cuenta que no tienes activado el bit INTCON.PEIE (bit 6) que habilita las interrupciones de periféricos, así que la rutina On Interrupt/Resume no se ejecuta nunca.
Los bit de permiso de interrupciones por lo general son como mínimo 3:
  Dos generales:
    INTCON.GIE = 1  'Global interrupt enable bit, bit 7
    INTCON.PEIE = 1  'Periferical interrupt enable bit, bit 6
  Y el tercero que es el especifico del modulo que tiene que generar la interrupción, en este caso INTCON.GPIE = 1  'Port change interrupt enable bit.
En este caso concreto, para este periferico se necesita indicar un bit más, este bit es el que indica que pin puede provocar la interrupción, en concreto: IOC.IOC3 = 1  'Indica el pin que genera la interrupción.

Y para cerrar el tema toda interrupción activa una bandera o flag especifico, y en la mayoría de los caso hay que poner este flag a cero antes de llegar a la línea RESUME.
Para este ejemplo sería: INTCON.GPIF = 0  'Port change Interrupt flag Bit
Que en el programa se vería de la siguiente manera:
'******************************************
On Interrupt
   If tiempon = 1 Then
      Gosub encendido
   Else
      Gosub apagado
   Endif
   INTCON.GPIF = 0  'Port change Interrupt flag Bit
Resume             
« Última modificación: 08 de Enero de 2016, 22:23:09 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:12F629 Interrupciones
« Respuesta #3 en: 08 de Enero de 2016, 22:41:07 »
Se me olvidaba, este microcontrolador no tiene convertidor analógico digital, pero esto no impide que tenga entradas analógicas, entradas analógicas para el comparador analógico interno que al igual que el ADC también usa entradas analógicas, así que es conveniente asegurarse que los pin funcionaran como digitales (I/O) indicándolo mediante el registro ANSEL = 0 'Todos los pin como digitales o también mediante la forma abreviada Alldigital.

En el código quedaría así:
Define CLOCK_FREQUENCY = 4
Alldigital 'Todos los pin como digitales (I/0)
TRISIO = %001000
Dim tiempon As Word
Dim tiempoff As Word
« Última modificación: 08 de Enero de 2016, 22:43:24 por dogflu66 »
Saludos desde Granada, España.

Desconectado wolfman77

  • PIC12
  • **
  • Mensajes: 82
    • Dos en la ruta
Re:12F629 Interrupciones
« Respuesta #4 en: 10 de Enero de 2016, 16:57:33 »
Gracias muchachos por las respuestas
luchoc Estoy haciendolo con el Pic Simulator Ide (basic), lo del END me trajo varios dolores de cabeza ya que me tiraba errores con ese anuncio, ahi lo reviso. Cuando lo modifique lo subo asi lo probas.

dogflu66 gracias por el dato, ahi veo para cambiarlo.

Es increible como se olvidan las cosas si no estas en practica constante, pensar que hice un semaforo, algunas cosas con display y usaba interrupciones, y ahora no me acuerdo nada  :shock:
gracias muchachos!  :)
Volviendo al mundo de los PIC....

Desconectado wolfman77

  • PIC12
  • **
  • Mensajes: 82
    • Dos en la ruta
Re:12F629 Interrupciones
« Respuesta #5 en: 27 de Abril de 2016, 14:03:34 »
En definitiva no lo pude hacer andar, soy un tipo completamente negado para lo que es tratar con interrupciones.
Modifique el codigo y puse unas lineas en el medio que ven el estado de las entradas y si hay cambios ejecutan otra parte del programa... un garron :5]
Volviendo al mundo de los PIC....

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:12F629 Interrupciones
« Respuesta #6 en: 27 de Abril de 2016, 15:44:27 »
Para eso no es necesario las interrupciones, solo tenes que testear un pin y con ese pin cambiar el estado de una bandera a lo sumo usas el desbordamiento del timer 1 para leer el pin cada 500 ms o menos


 

anything