Problema con programa en basic

#1
Buenos días.
Soy nuevo en esto de la programación y necesito crear un programa cuyo funcionamiento sea el siguiente:
Cuando pulsas una vez se enciende el primer LED 2 segundos y se apaga.
Cuando vuelves a pulsar se enciende 2 segundos el segundo LED.
El LED se apaga volviendo otra vez a repetirse la acción.

Estoy usando un PIC16F84A.
Éste es el programa que yo he hecho, seguramente se podrá hacer más fácil y que funcione.
Código:
trisb=%11111111
 
boton var portA.1 
boton2 var portA.2
portb.0=0
portb.1=0
portb.2 =0

pulsar
if boton=1 + boton2=0   then led1

goto pulsar

 led1
if boton=1  + boton2=0 then led1
pause 500
high portb.0                  
pause 2000
low portb.0
pause 3000
high portb.2
goto led2

led2
if boton=boton=1 + boton2=1   then led2
goto pulsar
end
if boton=boton=1 + boton2=1   then led2
pause 500
high portb.1 
pause 2000
low portb.1 
pause 3000
low portb.2
goto pulsar
Gracias.



Hola.
Adjunto esquema por si ayuda.

Gracias.
 

Adjuntos

Última edición por un moderador:
#2
¿No cerraste ningún if con el endif?
Sólo prueba con ponerlos así, por ejemplo:

botones:
if boton1=1 then
led1
end if

if boton2=1 then
led2
end if

goto botones

Así el ciclo es infinito. Saludos.
 
Última edición por un moderador:
#3
No se pone así:
if boton=1 + boton2=0 then led1

Se pone así:
if boton=1 and boton2=0 then led1

Y si pones la sentencia del THEN en la misma línea, no es necesario el ENDIF

El flujo está medio chistoso pero ese no lo revisé XD. (Hay un END a mitad del código que creo está mal.)
 
Última edición por un moderador:
#4
Hola...Debes indicar que compilador Basic usas(hay varios y la sintaxis no es igual para todos).
Aqui una de las mil maneras de hacer lo que pretendías en Proton Basic

PHP:
'****************************************************************
'*  Name    : Boton.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28/09/2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 16F84A ' Tipo de Microcontrolador
Config  OSC_XT, WDT_OFF, CP_OFF, PWRTE_ON ' Fusibles usados
Declare Xtal = 4  ' Frecuencia del Oscilador
'********** Declaracion de simbolos a usar************* 
Symbol Pulsador = PORTA.1 ' Pulsador
Symbol Indicador1 = PORTB.0  ' Led 1
Symbol Indicador2 = PORTB.1 ' Led 2
Dim Contador As Bit ' Variable del estado de encendido de los indicadores
Contador = 0  ' Limpio la variable
'**********Definicion de las entradas/salidas**********
TRISB = 0  'Puerto B como salida
TRISA = 255 ' Puerto A como entrada

PORTB = 0 'Limpio el puerto B

Ciclo: 'Programa principal
        
       If Pulsador = 0 Then  ' Si el pulsador es pulsado
            If Contador = 0 Then  ' Si el contador esta en 0
                Contador = 1    ' Cambio el estado de contador para saber que indicador prender
                High Indicador1  ' Enciendo el Indicador1
                DelayMS 2000   ' Espero 2 segundos
                Low Indicador1  ' Apago el Indicado1
            Else    ' Si el contador ya fue incrementado
                Contador = 0 ' Cambio el estado del contador para saber que indicador prender
                High Indicador2  ' Enciendo el segundo Indicador2
                DelayMS 2000     ' Espero 2 segundos
                Low Indicador2   ' Apago el Indicadr2
           EndIf ' Fin de la comparacion
       EndIf   ' Fin de logica encendido
       DelayMS 100  ' espero 100 mili segundos
       GoTo Ciclo  ' Comienzo todo nuevamente
       
 End  ' Fin!!!!!
Adjunto la simulación y el archivo de Proteus(cosa que también deberías incluir al hacer una consulta).
Saludos.

Ric.
 

Adjuntos

Última edición:
#5
Buenas tardes.

Primero, gracias a todos los que habéis contribuido.
Como he comentado, no tengo experiencia en este campo, por lo que hay detalles que se me escapan.
Siempre vienen bien las puntualizaciones.

Uso MicroCode Studio Plus.

Un Saludo.
 

Adjuntos

Última edición por un moderador:
#6
Si es cómo yo lo entendí, lo haría de ésta manera:
PHP:
;*******************************************************************************
@ Device PIC16F84A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device XT_OSC,WDT_OFF,PWRT_ON
;*******************************************************************************
Define OSC 4                ; Definir que se trabajará con 4MHz.

; Declaración de variables:
Pulsado Var Bit             ; Bandera de estado

Inicio:
    TRISB = %11111100       ; RB1 y RB0 como salidas.
    PORTB = TRISB           ; RB1 y RB0 en 0 al iniciar.

    Pulsado = 0

Programa:
    If PORTA.1 = 1 And Pulsado = 0 Then
        Pulsado = 1
        PORTB.1 = 1
        Pause 2000
        PORTB.1 = 0
        While PORTA.1 = 1: Wend ; Esperar hasta que se suelte el pulsador.
    ElseIf PORTA.1 = 1 And Pulsado = 1 Then
        Pulsado = 0
        PORTB.0 = 1
        Pause 2000
        PORTB.0 = 0
        While PORTA.1 = 1: Wend ; Esperar hasta que se suelte el pulsador.
    EndIf
 
    GoTo Programa

    End
 
#7
gracias lo he intentado compilar y me da error linea ElseIf PORTA.1 = 1 And Pulsado = 1 Then
el que mando ricbevi funciona aunque agradezco los aportes dan a mi entender distintas versiones de como hacer un mismo programa y siempre ayuda pues pruebas si funcionan y tantosi lo hacen como si no
intentas comprenderlos
¿en linea a la que me refiero antes el fallo puede estar en PORTA.1?
Gracias a todos
 
#8
Entonces debe ser por la versión de PICBasic del compilador que usas.
Yo lo escribí con MicroCode Studio Plus versión: 3.0.0.5 y PICBasic Pro versión 2.60C

Puedes corregir ese error eliminando el ElseIf, de esta forma:
PHP:
Programa:
    If PORTA.1 = 1 And Pulsado = 0 Then
        Pulsado = 1
        PORTB.1 = 1
        Pause 2000
        PORTB.1 = 0
        While PORTA.1 = 1: Wend ; Esperar hasta que se suelte el pulsador.
    Else
        If PORTA.1 = 1 And Pulsado = 1 Then
            Pulsado = 0
            PORTB.0 = 1
            Pause 2000
            PORTB.0 = 0
            While PORTA.1 = 1: Wend ; Esperar hasta que se suelte el pulsador.
        EndIf
    EndIf
 
    GoTo Programa
 
Última edición:
Arriba