TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Axel en 11 de Julio de 2011, 01:25:11

Título: ejemplo de interrupciones con PIC12F629 & PIC16F88
Publicado por: Axel en 11 de Julio de 2011, 01:25:11
hola a todos, por mas que busque con el buscador, no he encontrado algo que me ayude a comprender bien el uso de las interrupciones, lo unic que e logrado comprender es como se configura una interrupcion, pero aun no logro entender como funciona, lo que encontre fue esto:


Citar
el registro intcon viene asi

         |GIE|EEIE|T0IE|INTE|RBIE|T0IF|INTF|RBIF|
bit        7      6      5     4        3      2      1     0



EEIE: Permiso de Interrupción por fin de la escritura en la EEPROM
  1:   Permite se origine una interrupción cuando termina la escritura de la EEPROM de datos.
  0:Prohíbe que se produzca esta interrupción.
TOIE: Permiso de Interrupción por sobrepasamiento del TMRO
  1:Permite una interrupción al desbordarse el TMR0.
  0:Prohíbe esta interrupción.
INTE: Permiso de Interrupción por activación de la patita RBOIINT
  1:Permite la interrupción al activarse RBO/INT.
  0:Prohibe esta interrupción.
RBIE: Permiso de Interrupción por cambio de estado en RB7.RB4
  1:Permite esta interrupción.
  0:Prohibe esta interrupción.
T0IF: Señalizador de sobrepasamiento del TMRO
  1:Se pone a 1 cuando ha ocurrido el sobrepasamiento.
  0:Indica que el TMRO no se ha desbordado.
INTF: Señalizador de activación de la patita RBOIINT
  1:Se pone a 1 al activarse RBO/INT, al recibir un flanco activo desde el exterior.
  0:Indica que RBO/INT no ha recibido un flanco activo.
RBIF: Señalizador de cambio de estado en las patitas RB7:RB4
  1:Pasa a 1 cuando cambia el estado de alguna de estas 4 lineas.
  0:No ha cambiado el estado de RB7:RB4.

Cuando GIE=0 no se acepta ninguna de las interrupciones. si GIE=1 solo se aceptan aquella interrupciones cuyo bit de permiso esta habilitado "1"

 « Última modificación: 21 de Marzo de 2009, 03:08:32 por jhozate  »

ahora bien por lo que he entendido si quiero programar la interrupcion en un 12f629 por medio de un pin (GPIO2) debo usar esta linea de comando:

Citar
INTCON = %10010000

eso lo tuve que lograr hacer mediante el datasheet del 12f629 en la pagina 15..

si bien voy continuo, si me equivoco en algo porfavor corrijanme

ahora leyendo el manual de pbp encontre este codigo ejemplo:

Citar
ON INTERRUPT GOTO myint
INTCON = %10010000
DISABLE
myint: led = 1
INTCON.1 = 0
RESUME
ENABLE

por lo que he entendido, las lineas:
Citar
ON INTERRUPT GOTO myint ' entendi que esta linea nos envia a la etiqueta "myint" en caso de que GP2 entre en estado alto
INTCON=%10010000          'en esta se configura la interrupcion para GP2, me vino la duda de saber si esta linea deberia ir antes de "ON INTERRUPT GO TO.."
DISABLE                            'dice que se desabilita la interrupcion, pero no comprendo este comando aun
myint: led = 1                    'aqui va el comando que se ejecuta al momento de la interrupcion
INTCON.1 = 0                     'segun el datasheet este es una bandera que indica si la interrupcion fue correcta, pero no entiendo porque envia un 0 al flag por lo que dice el datasheet deberia ponerse en estado 1 y no en 0 cuando ya se haya realizado la interrupcion
RESUME                            'es el equivalente al RETURN de GOSUB
ENABLE                             'habilita la interrupcion, al igual que DISABLE no entiendo para que sirve esta linea

bueno me seria de mucha ayuda que alguien me explicara o me diera un ejemplo de las interrupciones, pues estaba trabajando con un teclado matricial, pero nececito usar las interrupciones con el teclado, pues usaba un tipo de barrido continuo para detectar la tecla, esto lo hacia en un 16f88, pero quiero aprender a usarlo con el 12f629, igual supongo que no hay problema al pasar el codigo de un pic a otro, gracias por su ayuda.
saludos!

Alex. 8)


*olvide agregar, en caso de que la unica solucion para comprender este comando sea con lenguaje assembler, nececitaria una explicacion aun mas detallada pues estoy en ceros con el assembler desconosco de toda su sintaxis y funciones.
Título: Re: ejemplo de interrupciones con PIC12F629 & PIC16F88
Publicado por: Axel en 11 de Julio de 2011, 14:10:25
leyendo mas posts, encontre que hay 2 tipos de interrupciones, por software, y por hardware, y las dos tienen sus pros y sus contras
por soft tiene una latencia alta mas agregar el tiempo que se demore una pausa o un serin en curso.
por hardware es necesario hacerla por codigo aasembler, tiene una latencia muy baja
el problema es que desconosco sobre el lenguaje assembler
Título: Re:ejemplo de interrupciones con PIC12F629 & PIC16F88
Publicado por: eliasmtz en 27 de Noviembre de 2015, 13:38:45
Amigo, siempre pudiste resolver este problema? Yo no entiendo mucho el lenguaje C, pero si el assembler; leí unicamente que activando individualmente el Bit INTEDG como 1, es activada la interrupcion cuando pones a estado logico 1 en el interruptor. Mientras en el caso contrario un 0, activa la interrupcion con un estado logico 0.  Si consigo algo lo publico aqui, ¿va?
Título: Re:ejemplo de interrupciones con PIC12F629 & PIC16F88
Publicado por: Stban en 27 de Noviembre de 2015, 16:26:48
Prueba este ejemplo espero que te funcione,
Activación de interrupción a través del pin RB0/INT:

' Programa en Pic Basic Pro
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
TRISA = %00000000 ' Configura el Puerto A como salida
TRISB = %00000000 ' Configura el Puerto B como salida
I VAR Byte
Symbol LED1 = PORTA.0
Symbol LED2 = PORTA.1
Symbol INTEDG = OPTION_REG.6 ' Bit 6 del registro “Option”
' El bit 6 (INTEDG) del registro Option define si la interrupción será
' activada por flanco positivo o negativo.
On Interrupt GoTo Interrup ' Define el vector de interrupción.
INTCON = %10010000 ' Activa el inspector de interrupciones y
' habilita la interrupción RB0/INT.
PORTA = $00 ' Inicializa el puerto A.
LED1 = 0 ' Apaga el Led1
LED2 = 0 ' Apaga el Led2
INTEDG = 0 ' Cero (0) para activación de RB0/INT en flanco descendente
' Uno (1) para activación de RB0/INT en flanco ascendente
Inicio:
LED1 = 1 ' Enciende el Led1
Pause 1000 ' Pausa de 1000 ms (1 segundo)
LED1 = 0 ' Apaga el Led1
Pause 1000 ' Pausa de 1000 ms (1 segundo)
GoTo Inicio ' Salta a la etiqueta inicio
' Rutina de interrupción:
Interrup:
Disable ' Detiene al inspector de interrupciones mientras
' ejecuta las siguientes líneas:
For I = 1 To 6
LED2 = 1 ' Enciende el Led2
Pause 200 ' Pausa de 200 ms
LED2 = 0 ' Apaga el Led1
Pause 200 ' Pausa de 200 ms
Next I
INTCON = %10010000 ' Habilita las interrupciones (GIE=1)
' Habilita la interrupción RB0/INT (INTE=1)
' Inicializa la interrupción (INTF=0)
Enable ' Habilita el inspector de interrupciones.
Resume ' GIE = 1 y retorna al punto donde había quedado
' antes de la interrupción.
End
Título: Re:ejemplo de interrupciones con PIC12F629 & PIC16F88
Publicado por: eliasmtz en 27 de Noviembre de 2015, 20:39:43
Amigo, mira estuve indagando en la datasheet (porque también estaba en lo mismo: Aprendiendo), y finalmente pude realizar un flasheo (tipo estrobo, con un diodo led blanco); usando la interrupción, lo que dices de un barrido, leí que esa tecnica es llamada Polling en inglés. Pero las interrupciones son una maravilla cuando quieres realmente interrumpir el programa y continuar con lo que realizabas sin hacer un "barrido" del puerto. Te dejo mi código, espero puedas entender el Assembler. De cualquier manera tienes que leer el Datasheet del PIC12F629, para entender de lo que se habla. También estoy aprendiendo a usar el TMR0 ;)
También te dejo el circuito para que entiendas lo que hice en fisico. Checalo, a lo mejor te sirve de algo. :-)

 - Tienes que ingresar para ver archivos adjuntos -
 - Tienes que ingresar para ver archivos adjuntos -