TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: jhonathanve en 13 de Junio de 2016, 15:14:24
-
Saludos amigos, hace mucho tiempo que no me paso por aka, deje el hobby de la programacion, estaba practicando, para hacer un semaforo inteligente. que tienen paso peatonal y al pulsar ellos esperan un determinado tiempo y colocan en rojo el semaforo para que las personas puedan pasar la incognita es que tengo un enorme retardo en el pulsador, a veces mi funciona y otras no!
pulsador var porta.0
verde var portb.0
amarillo var portb.1
rojo var portb.2
paso var portb.7
PORTB = $00
Inicio:
high verde
gosub tiempo
low verde
high amarillo
gosub tiempo2
low amarillo
high rojo
gosub tiempo3
low rojo
gosub tiempo3
If pulsador = 1 Then peaton
goto inicio
tiempo:
pause 2500
returb
tiempo2:
pause 700
return
tiempo3:
pause 1800
return
peaton:
high paso
pause 500
low paso
pause 500
goto inicio
-
Hola,
Aportando un poco de idea, no será mejor usar interrupciones?
-
Se que hay compiladores que pueden programar los pin como I/O de forma automática, pero siempre es conveniente especificarlo en el programa.
AllDigital 'Pin I/O
TRISA = $00 'Como salidas
TRISB = $00 'Como salidas
TRISA.0 = 1 'Como entrada
TRISB.7 = 1 'Como entrada
'Asigna nombres a pin
pulsador var PORTA.0
verde var PORTB.0
amarillo var PORTB.1
rojo var PORTB.2
paso var PORTB.7
PORTB = $00
inicio:
High verde
Gosub tiempo
Low verde
High amarillo
Gosub tiempo2
Low amarillo
High rojo
Gosub tiempo3
Low rojo
Gosub tiempo3
If pulsador = 1 Then Gosub peaton
Goto inicio
End
tiempo:
pause 2500
Return
tiempo2:
pause 700
Return
tiempo3:
pause 1800
Return
peaton:
High paso
pause 500
Low paso
pause 500
Return
Si usa PBP no soluciona el problema usando interrupciones porque el manejador de interrupciones del compilador salta al vector de interrupciones, cuando a terminado de procesar el comando basic en proceso, no instrucción maquina. La generación de interrupciones verdaderas en PBP no es nada fácil, porque hay que insertar un código maquina que tome el control sobre el gestor de interrupciones interno, que yo sepa esto sigue siendo de esta forma a día de hoy.
-
'Ejemplo con WAITMS (PAUSE) mejorado
'*****************************************
'Define SIMULATION_WAITMS_VALUE = 1 'Hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------
AllDigital 'Pin I/O
TRISA = $00 'Como salidas
TRISB = $00 'Como salidas
TRISA.0 = 1 'Como entrada
TRISB.7 = 1 'Como entrada
'Asigna nombres a pin
Symbol pulsador = PORTA.0 'pulsador As PORTA.0
Symbol verde = PORTB.0 'verde As PORTB.0
Symbol amarillo = PORTB.1 'amarillo As PORTB.1
Symbol rojo = PORTB.2 'rojo As PORTB.2
Symbol paso = PORTB.7 'paso As PORTB.7
PORTB = $00
inicio:
High verde
Gosub tiempo
Low verde
High amarillo
Gosub tiempo2
Low amarillo
High rojo
Gosub tiempo3
Low rojo
Gosub tiempo3
If pulsador = 1 Then Gosub peaton
Goto inicio
End
tiempo:
Dim c_tiempo As Word 'c_tiempo As Word
c_tiempo = 0
While pulsador = 0 And c_tiempo < 2500
WaitMs 1 'pause 1
c_tiempo = c_tiempo + 1
Wend
Return
tiempo2:
Dim c_tiempo2 As Word 'c_tiempo2 As Word
c_tiempo2 = 0
While pulsador = 0 And c_tiempo2 < 700
WaitMs 1 'pause 1
c_tiempo2 = c_tiempo2 + 1
Wend
Return
tiempo3:
Dim c_tiempo3 As Word 'c_tiempo3 As Word
c_tiempo3 = 0
While pulsador = 0 And c_tiempo3 < 1800
WaitMs 1 'pause 1
c_tiempo3 = c_tiempo3 + 1
Wend
Return
peaton:
High paso
WaitMs 500 'pause 500
Low paso
WaitMs 500 'pause 500
Return
Este tipo de algoritmo puede sustituir la mayoría de las veces al Pause tradicional:
tiempo:
Dim c_tiempo As Word 'c_tiempo As Word
c_tiempo = 0
While pulsador = 0 And c_tiempo < 2500
WaitMs 1 'pause 1
c_tiempo = c_tiempo + 1
Wend
Return
Este tipo de algoritmo puede sustituir la mayoría de las veces al Pause tradicional:
tiempo:
Dim c_tiempo As Word 'c_tiempo As Word
c_tiempo = 0
While pulsador = 0 And c_tiempo < 2500
WaitMs 1 'pause 1
c_tiempo = c_tiempo + 1
Wend
Return
Al pulsar una tecla se fuerza la terminación del nuevo algoritmo de pausa, por lo que se acelera muchísimo el código.
En While pulsador = 0 and tecla1=0 and tecla2=0 and C_tiempo <2500 puedes añadir todas las teclas que necesites.
Al igual que el salto Goto no se utiliza en programación de lenguajes de alto nivel, fue sustituido por los saltos tipo Gusub/Return.
Los Pause no se utilizan en programación tampoco, lo que ocurre es que su eliminación es mucho más complicada,
y la mayoría de libros para Basic simplemente eluden este tema.
Nota: Se ha dejado como obvio, pero la mayoría de los problemas que tiene tu programa los provoca el comando PAUSE.