No funciona declaracion WHILE en PIC16F628A en Proteus 8

Buenos dias, es mi primera vez en el foro y no se donde colocar este tema.

Estoy haciendo un proyecto de puente levadizo, se nos requirió ponerle un paro en caso de emergencia.
Lo quise hacer con un WHILE de manera que al activarse un push se deje de cumplir la condición "WHILE Wrng=0", pero se presiona el push y el programa sigue corriendo.

No sé si estoy mal colocando el WHILE o si existe un limite en el número de declaraciones entre el WHILE-WEND.
Lo estoy simulando en Proteus 8


Aquí está mi código.

Código:
'****************************************************************
'*  Name    : Puente levadizo                                   *
'*  Date    : 02/07/2014                                        *
'*  Notes   : Proyecto 3er cuatrimestre mecatrónica             *
'****************************************************************
@ DEVICE pic16F628A, MCLR_OFF           ;Master Clear (Internal)
@ DEVICE pic16F628A, WDT_ON             ;Watch Dog Timer
                  
OSC4
CMCON=7
OPTION_REG.7=0

trisa=%11111111
trisb=%00000000
portb=0

S1 var porta.0                        ;S1, S2 y S3, Entradas preparadas para los sensores infrarrojos
S2 var porta.1                                
Rst var porta.2                  ;Boton preparado para el reinicio del sistema despues de un paro de emergencia
H1U var porta.3                       ;H1U y H1D, Entradas preparadas para los sensores indicadores de posicion de la hoja 1
H1D var porta.4                            
H2U var porta.5                       ;H2U y H2D, Entradas preparadas para los sensores indicadores de posicion de la hoja 2
H2D var porta.6                       
Wrng var porta.7                   ;Paro de emergencia

K1U Var portb.0                       ;K's 1 salidas que controlan los relevadores del puente h de la hoja 1 
K1D var portb.1
K2U var portb.2                       ;K's 2 salidas que controlan los relevadores del puente h de la hoja 2
K2D var portb.3
Green var portb.4                     ;Controla el led "Verde"
Yell var portb.5                      ;Controla el led "Amarillo"
Red Var portb.6                       ;Controla el led "Rojo"


Conteo var byte
Conteo=0

While wrng=0
 Inicio:
  low k1u:low k2u
   high k1d:high k2d:high red
  

   Acomodar:                         ;Programa de inicio que baja las hojas del puente
    high yell
    pause 250
    if h1d=1 then low k1d
    if h2d=1 then low k2d
    low yell
    pause 250
    if h1d=1 and h2d=1 then goto libre
    goto acomodar



  
  Libre:                               ;Mantiene el paso de vehiculos mientras no se encuentre una embarcacion en paso
  low red:high yell
  pause 1000
  low yell
   Libre2:
   high green
   If S1=0 then call LadoA             
   If S2=0 then call LadoB             ;Rutina ejecutable en caso de que una embarcacion se acerque desde el lado del sensor 2
   goto libre2
  
   
   

 LadoA:                                ;Rutina ejecutable en caso de que una embarcacion se acerque desde el lado del sensor 1
  high yell
  pause 250
  low yell
  pause 250
  high yell
  pause 250
  low yell:low green
  pause 500
  
  high red
   pause 1000                         ;Se empieza a abrir el puente
   high k1u:high k2u

    
    

 Abrir:                               ;Secuencia que permanece activa mientras el puente se esta abriendo, una vez abierto es finalizada
    High yell
    pause 300
    if h1u=1 then Low k1u
    if h2u=1 then low k2u
    low yell
    pause 300
    if s2=0 and s1=1  and h1u=1 and h2u=1 then goto inicio
    goto abrir

    


 LadoB:                                ;Rutina ejecutable en caso de que una embarcacion se acerque desde el lado del sensor 2
  high yell
  pause 250
  low yell
  pause 250
  high yell
  pause 250
  low yell:low green
  pause 500
  
  high red
   pause 1000                         ;Se empieza a abrir el puente
   high k1u:high k2u

      
      
 Abrir2:                              ;Secuencia que permanece activa mientras el puente se esta abriendo, una vez abierto es finalizada
    High yell
    pause 300
    if h1u=1 then Low k1u
    if h2u=1 then low k2u
    low yell
    pause 300
    if s1=0 and s2=1 and h1u=1 and h2u=1 then goto inicio
    goto abrir2
    
  wend  
 
                                  
 Paro:                                ;Se activa en caso de necesitar un paro de emergencia del sistema
  Portb=%01000000
   goto paro 
     
     goto inicio
    
 
End
 

Adjuntos

  • Puente levadizo.rar
    57 KB · Visitas: 7
Última edición por un moderador:
no entiendo mucho de basic pero por que no pruebas poniendo un if en la rutina donde se esta abriendo el puente.

if wrng=1 then
goto paro de emergencia

paro de emergencia:
mientras no se presione el boton de reinicio se quede enclavado
if Rst = 1 then
goto arranque.

algo asi, no le entiendo mucho al basic pero la rutina esa del while solo se ejecuta al principio y despues no se vuelve a comparar ya que usas puros goto.
 
Por que no pruebas con cambiar el "goto" que tienes despues del then, por un "gosub" (llamado a sub-rutina en pbasic).
Por que tienes activo el perro guardian?
 
Estoy haciendo un proyecto de puente levadizo, se nos requirió ponerle un paro en caso de emergencia.
Lo quise hacer con un WHILE de manera que al activarse un push se deje de cumplir la condición "WHILE Wrng=0", pero se presiona el push y el programa sigue corriendo.

No sé si estoy mal colocando el WHILE o si existe un limite en el número de declaraciones entre el WHILE-WEND.
Lo estoy simulando en Proteus 8
Para lo que requieres es más conveniente usar interrupciones en vez de usar ese bucle while.

Mira las modificaciones que realicé a tu programa y al diseño para que funcione por interrupción.
También corregí la palabra de configuración porque con la que tenías no hubiera funcionado físicamente.

Suerte.
 

Adjuntos

  • Puente levadizo.rar
    30.3 KB · Visitas: 4
Atrás
Arriba