TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: joapi 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!
-
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
-
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!
-
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
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
-
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
-
Te dejo un ejemplo para el Basic del Pic Simulator IDE que es muy parecido al Basic del Proton:
'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