Autor Tema: Incognita con IF.. THEN  (Leído 2230 veces)

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

Desconectado jhonathanve

  • PIC12
  • **
  • Mensajes: 88
Incognita con IF.. THEN
« 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

Desconectado Stban

  • PIC12
  • **
  • Mensajes: 78
Re:Incognita con IF.. THEN
« Respuesta #1 en: 13 de Junio de 2016, 17:46:35 »
Hola,

Aportando un poco de idea, no será mejor usar interrupciones?

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Incognita con IF.. THEN
« Respuesta #2 en: 14 de Junio de 2016, 06:41:53 »
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.
« Última modificación: 14 de Junio de 2016, 06:45:30 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re:Incognita con IF.. THEN
« Respuesta #3 en: 14 de Junio de 2016, 07:23:29 »
Código: [Seleccionar]
'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.
« Última modificación: 14 de Junio de 2016, 07:32:38 por dogflu66 »
Saludos desde Granada, España.


 

anything