Autor Tema: Problema en las interrupciones PBP Y MPLAB  (Leído 3172 veces)

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

Desconectado joapi

  • PIC10
  • *
  • Mensajes: 4
Problema en las interrupciones PBP Y MPLAB
« en: 04 de Octubre de 2013, 23:43:36 »
buenas noches disculpen estoy comenzando con el lenguaje de Basic con el pbp y el mplab , hace un tiempo hice el prgrama para un pic16f84a y el 16f648 y me anduvieron pero , avance el proyecto y le inclui una interrupcion la cual funciona , para situar mas el punto, tengo un programa , si se activa la interrupcion , el programa de la interrupcion es un if qe pregunta al puerto RB4 si esta en 1 o 0 osea :
IF PORTB.4=0 THEN
GOSUB PROG
ELSE
GOSUB PRIG
ENDIF
RETURN
ENABLE
Elijiendo un programa salta a otros subrutinas llamados prog y prig y en prog y prig hay otros if que preguntan el ultimo estado qe tenian los puertos:
PROG:
IF PORTB=%10101010 then
PORTB=%11101000
PAUSE 2000
PORTB=%01001000
PAUSE 20000
ELSE
PORTB=%01001000
PAUSE 20000
ENDIF
RETURN

PRIG:
IF PORTB=%01000110 THEN
PORTB=%00001000
PAUSE 2000
PORTB=%01001110
PAUSE 20000
ELSE
PORTB=%01001110
PAUSE 20000
ENDIF
RETURN
 
el problema esta en qe una de las rutinas de interrupcion me anda ! es decir primero pasa por el primer if del puerto rb4  luego decide qe programa y vuelve a preguntar , es decir una rutina anda completa (prog) pero prig , es como si me saltara la linea despues del "then" o sea me salta la parte del
........................"THEN
PORTB=%00001000
PAUSE 2000"
y se me va a a lo qe sigue luego de esa instruccion es raro y me he travado con eso una semana , descubri que si le cambio en el "IF PORTB.4=O" se lo cambio por "IF PORTB.4=1" prig me anda completo pero se me va el error a prog
quisiera saber si prponen algun tipo de solucion desde ya muchas gracias !! saludos y buenas noches!
               

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Problema en las interrupciones PBP Y MPLAB
« Respuesta #1 en: 05 de Octubre de 2013, 17:56:10 »
hola compañero joapi creo que tu pregunta es algo complicada de resolver primero que nada y sin ser molesto para ti de mi parte lo que estas posteando es un programa con subrutinas que en caso no es el empleo de la interupcion interna del micro que son partes del programa que cuando ocurre dicha interrupción el micro deja de paso lo que este haciendo ya sea en un waitms o en un if etc. para atender el llamado de la interupcion y al terminar el proceso del cual fue llamado regresar del mismo

te sugiero que pongas el programa completo por que sinceramente a mi entender no le encuentro forma de nada ha ese programa sin ofender saludos

Desconectado joapi

  • PIC10
  • *
  • Mensajes: 4
Re: Problema en las interrupciones PBP Y MPLAB
« Respuesta #2 en: 09 de Octubre de 2013, 01:02:20 »
hola! tenes razon ahora te paso el programa completo , pero igual anduve averiguando y logre hacerlo funcionar pero en assembler , pero de todas maneras sigo sin entender porque
TRISB=%00000000
TRISB=%00010001
INTCON=%10010000
ON INTERRUPT GOTO Verde
INPUT PORTB.0
INPUT PORTB.4

ENABLE
INICIO:
ENABLE
PORTB=%10000010
PAUSE 7000
PORTB=%01000010
PAUSE 3000
PORTB=%00101000
PAUSE 7000
PORTB=%00100100
PAUSE 3000
GOTO INICIO

DISABLE
PROG:
IF PORTB=%00101000 THEN
PORTB=%00100100
PAUSE 2000
PORTB=%10000010
PAUSE 15000
RETURN
ELSE
PORTB=%10000010
PAUSE 15000
RETURN
ENDIF

DISABLE
PRIG:
IF PORTB=%10000010 THEN
PORTB=%01000010
PAUSE 2000
PORTB=%00101000
PAUSE 15000
RETURN
ELSE
PORTB=%00101000
PAUSE 15000
RETURN
ENDIF

DISABLE
Verde:
IF PORTB.4=0 THEN
GOSUB PROG
ELSE
GOSUB PRIG
ENDIF
INTCON =%10010000
RESUME
ENABLE
END

vas a notar que los tris los repeti si no que en la simulacion me lanzaba errores al no poner primero los tris a 0 y luego definir las entradas viendolo al programa hay varias cosas qe redundan en el mismo , igual ese no es el problema , repito en assembler lo logre hacer andar =D gracias por el interes!

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Problema en las interrupciones PBP Y MPLAB
« Respuesta #3 en: 12 de Octubre de 2013, 16:22:44 »
hola amigo no entiendo muy bien tu programa es algo revuelto pero a mi entender esta bien una pregunta lo simulas o lo estas asiendo físicamente si es físicamente tienes resistencias de pullup a masa o a positivo ?? en el pin rb.0  tal vez ese es tu problema trate de acomodar tu código a un modo mas fácil de entender tal ves as te ande saludos


Código: [Seleccionar]
trisb=%00010001
intcon=%10010000 'ativacion de interrupción por rb.0

on interupt goto verde ' creo que esto equivale ala ruta donde atiende la interrupción corrígeme si me equivoco

input portb.0 ' estas no se para que las declaras como entradas si ya el tris lo hiciste
input portb.4

enable ' este tampoco se para que es

inicio

enable

portb=%10000010
pausa 7000
portb=%01000010
pausa 3000
portb=%00100100
pausa 7000
portb=%00100100
pausa 3000

goto inicio
disable ' no se para que es


verde:

intcon=%10000000 ' desactivo la interrupción de rb.0 y borro la bandera del mismo para que no entre 2 veces al programa de interrupcion

if portb.4=0 then
prog:
if portb=%00101000 then
portb=%00100100
pausa 2000
portb=%10000010
pausa 15000
else
portb=%10000010
pausa 15000
endif
endif

PRIG:

IF PORTB=%01000110 THEN
PORTB=%00001000
PAUSE 2000
PORTB=%01001110
PAUSE 20000
ELSE
PORTB=%01001110
PAUSE 20000
ENDIF

intcon=%10010000
 
resumen



bueno esas son las modificaciones que le hice es mas fácil ya que en tu ejemplo activas la interrupción para saltar a otra subrutina y luego a otra es algo enredado

bueno espero y te funcione saludos

Desconectado joapi

  • PIC10
  • *
  • Mensajes: 4
Re: Problema en las interrupciones PBP Y MPLAB
« Respuesta #4 en: 26 de Octubre de 2013, 01:48:49 »
Si lo se soy medio desordenado para escribir los programas por lo general me acostumbro a hacerlo solo y me entiendo , los enable y disable (sin querer te mande un programa viejo ) porque en realidad va acompañado de interrupt es decir, "enable interrupt" desactiva el bit del flag y el disable interrupt es para activar el bit del flag de la interrupcion en ves de escribir el registro INTCON %10000000 ,las pruebas fisicas las hice (con un cristal de 20mhz y de 4mhz) si no que basic tarda mucho en activarme la interrupcion, y lo probe en proteus y me da el mismo error , de igual manera los pull-down los tengo puesto hasta es mas he agarrado ,entré en el registro de option y cambie el bit 6 (intedg) para ponerlo en 1 y hacerlo por flanco de bajada , y a rb0 le mande un pull-up con un transistor cosa de qe me venga un cero por el transistor y me saque al pull-down de todas maneras nos paso lo mismo en C y al final lo resolvi en assembler igual muchas gracias

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Problema en las interrupciones PBP Y MPLAB
« Respuesta #5 en: 27 de Octubre de 2013, 08:44:01 »
Te dejo un ejemplo para el Basic del Pic Simulator IDE que es muy parecido al Basic del Proton:

Código: [Seleccionar]
'PROGRAMA PARA PRACTICAR CON INTERRUPCIONES EXTERIORES DEL PIN RB0
'PIC16F88
'On Interrupt - Interrupts in BASIC
'Turn LED on.  Interrupt on PORTB.0 (INTE) turns LED off.
'Program waits .5 seconds and turns LED back on.
'-------------------------------------------------------------------
Define CONFIG = 0x2f50
Define CONFIG2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'-------------------------------------------------------------------
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los Waitms
'-------------------------------------------------------------------
AllDigital  'Ansel = %00000000  'los pin I/O digitales
CMCON = 0x07  'Comparador a Off
OSCCON = 0x7e  'Se usara reloj interno a 8Mhz
TRISA = 0x00  'Output
TRISB = 0x00  'Output
'TRISB.7 = 0  'portb.7 como salida
TRISB.0 = 1  'portb.0 como entrada
OPTION_REG = 0x7f  'Enable PORTB pullups
INTCON.INTE = 1  'Enable interrupciones por RB0
INTCON.PEIE = 1  'Enable interrupciones de perifericos
Enable  'INTCON.GIE  Activa las interrupciones globales
'-------------------------------------------------------------------
Symbol led = PORTB.7  'Asigna nombre al portb.7
'-------------------------------------------------------------------
main:
High led  'Turn LED on
Goto main  'Do it forever
End                                              
'Interrupt handler
On Interrupt  'Define interrupt handler, disable interrupt
If INTCON.INTF = 1 Then  'Gestiona interrupcones RB0
Low led  'Turn LED off
WaitMs 500  'Wait 0.5 Seconds
INTCON.INTF = 0  'Borra el flag de interrupción RB0
Endif
Resume  'Return to main program, enable interrupt
« Última modificación: 27 de Octubre de 2013, 08:53:03 por dogflu66 »
Saludos desde Granada, España.


 

anything