desktop

Encendido de un led mediante pulsador pic basic pro

buenas gente del foro
antes que nada esto es lo que tiene que realizar el programa
se tienen 4 pulsadores conectados en el puerto a
y 4 salidas del puerto b listas para ejecutar diferentes acciones
el programa debe leer los pulsadores y ejecutar funciones en el puerto b
pulsador 1 = 1
pulsador 2 = 1
funcion 1 y funcion 2 se activan
si pulsadro 1 = 1
funcion 1 se activa
si pulsador 1 y 4 = 1
funcion 1 y 4 se activan
y asi sucesivamente con todas las formas posibles con 4 pulsadores solo deben activarse las funciones leidas en los pulsadores
si pulsador 1= 1
funcion 1 =1
funcion 2=0
funcion 3 = 0
funcion 4 = 0

y esto es lo que tengo
Código:
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz

bot1 var porta.0 ;arriba
bot2 var porta.1 ;abajo
bot3 var porta.2 ;derecha
bot4 var porta.3 ;izquierda
sal1 var portb.0
sal2 var portb.1
sal3 var portb.2
sal4 var portb.3

inicio
if (bot1=1) and (bot2=0) then arriba

if (bot1=0) and (bot2=1) then abajo

if (bot1=1) and (bot2=1) then doble1 ; arriba abajo

if (bot3=1) and (bot4=0) then derecha

if (bot3=1) and (bot4=1) then doble2 ;derecha izquierda

if (bot3=0) and (bot4=1) then izquierda

if (bot1=1) and (bot3=1) then doble3  ;arriba derecha

if (bot2=1) and (bot3=1) then doble4  ;abajo derecha

if (bot4=1) and (bot2=1) then doble5  ;izquierda abajo

if (bot4=1) and (bot1=1) then doble6  ;arriba izquierda

low sal1
low sal2
low sal3
low sal4

goto inicio


doble3
high sal1
high sal3
low sal2
low sal1
goto inicio

doble4
high sal2
high sal3
low sal1
low sal4
goto inicio

doble5 
high sal4
high sal2
low sal1
low sal3
goto inicio

doble6
high sal4
high sal1
low sal2
low sal3
goto inicio
 
arriba
HIGH SAL1
low sal2
low sal3
low sal4
goto Inicio

abajo
high sal2
low sal1
low sal3
low sal4
goto inicio

derecha
high sal3
low  sal1
low  sal2
low  sal4
goto inicio

izquierda
high sal4
low sal1
low sal2
low sal3
goto inicio

doble1
high sal1
high sal2
low  sal3
low sal4
goto inicio

doble2
high sal3
high sal4
low sal1
low sal2
goto inicio

end



al momento de pasarlo al pic y probarlo no me andan las diferentes aplicaciones tampoco logro hacer que se activen mas de dos pulsadores alguien me ayuda?
 
Última edición por un moderador:
lo logre en asm

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A ; Procesador utilizado.
INCLUDE <P16F84A.INC> ; Definición de algunos operandos utilizados.

Constante EQU d'74' ; En sistema decimal se pone así.

; ZONA DE CÓDIGOS *******************************************************************

ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B configuradas como salidas.
movlw b'00011111' ; Las 5 líneas del Puerto A configuradas como entradas.
movwf TRISA
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
movf PORTA,W ; Carga el registro de datos del Puerto A en (W).
movwf PORTB ; El contenido de W se deposita en el puerto de salida.
goto Principal ; Crea un bucle cerrado e infinito.

END ; Fin del programa.


asi en asm pff pero como se logra hacer esto en picbasic pro?
 
lo logre en asm

Código:
Principal
    movf     PORTA,W            ; Carga el registro de datos del Puerto A en (W).
        movwf    PORTB    ; El contenido de W se deposita en el puerto de salida.
    goto     Principal        ; Crea un bucle cerrado e infinito.

    END                ; Fin del programa.
así en asm pero como se logra hacer esto en picbasic pro?

Algo tarde la respuesta, hasta puedo suponer que ya sabrás como hacerlo. ;)
En PICBasic es muy fácil...
PORTB = PORTA

al presionar una vez sw1 y una vez sw2 el led enciende una vez, al presionar 2 veces sw1 y una vez sw2 el led se enciende 3 veces

A ver si esto es lo que quieres que realice tu programa.
Código:
B0 VAR Byte
Counter VAR Byte
led = 0
Clear

Program:
    if sw1=0 and sw2=0 then Prender1
;if sw1=0 and sw1=0 and sw2=0 then Prender2
    If Counter = 2 And sw2 = 0 Then
    Counter = 0
    GoTo Prender2
    EndIf
    Button sw1,0,255,20,B0,0,Program
    Counter = Counter + 1
    If Counter >= 3 Then Counter = 0
    goto Program
lo simulo en proteus y no me hace nada de nada.

Recuerda configurar los puertos y los fuses del PIC
Código:
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
;*******************************************************************************
DEFINE OSC 4                ; Definir que se trabajará con 4MHz.

;CMCON = 7                    ; Comparadores analógicos OFF
;TRISA = $FF                    ; Puerto A = b'11111111' (255)
TRISB = $FB                    ; Puerto B = b'11111011' (251)
Saludos y suerte.
 
Última edición:
amigo d@rkbytes, perdón por la demora, pero tuve una calamidad familiar, y solamente hasta hoy puedo volver a retomar todo. En cuanto a tu ayuda, hice cuanto me indicaste (según lo que he aprendido hasta ahora), pude compilar el programa, pero al simularlo en proteus, no me funciona como debe ser, adjunto los archivos (el del pbp, el hex y el diagrama en proteus) para que me ayudes y me indiques cual puede ser el problema y de haber alguno, indicarme por favor en que me he equivocado.
Estuve algo ocupado estos días y no pude contestar antes.
Veo que en el código que adjuntas cambiaste algo.
Pero adjunto un programa con un truco que suelo usar, para resolver algunos problemas de este tipo.
El programa posiblemente no haga exactamente lo que requieres, pero si te dará una idea de como hacerlo.

Suerte, y espero que lo que llamas calamidad familiar, no sea nada grave. :apreton:
 

Adjuntos

  • pulsador(2).zip
    19.2 KB · Visitas: 146
Hola a todos, encuentro unas rarezas en el comando button

coloco el compando Button PORTA.3,1,100,1,D,1,INICIO y funciona al pelo pero cuando quiero usar el mismo boton en cualquier parte del programa cambiando la etiqueta, me ejecuta tal cual estaba la primera vez. Es decir que no puedo usar el mismo boton para diferentes cosas, si lo use para encender un led primero, en cualquier parte del programa que use el mismo boton me enciende el led, por mas que cambie las instrucciones del mismo.

Mi pregunta es: esto es asi? una vez asignado un boton a una tarea solo realiza esa tarea el boton?

por ejemplo con un button enciendo un led y quiero con el mismo boton apagarlo pero me lo intenta encender de nuevo, claro que le digo que ponga a 0 la salida del led.

otra forma es en un IF fijarme si la entrada tiene un 0 o 1 pero a veces funciona y otras no, uso la familia de 16F873A / 16F877A / 16F876A y con todos me pasa lo mismo.

gracias
 
cuando quiero usar el mismo botón en cualquier parte del programa cambiando la etiqueta, me ejecuta tal cual estaba la primera vez.
Es decir que no puedo usar el mismo botón para diferentes cosas, si lo usé para encender un led primero, en cualquier parte del programa que use el mismo botón me enciende el led, por más que cambie las instrucciones del mismo.

Mi pregunta es: esto es asi? una vez asignado un boton a una tarea solo realiza esa tarea el boton?

por ejemplo con un button enciendo un led y quiero con el mismo boton apagarlo pero me lo intenta encender de nuevo, claro que le digo que ponga a 0 la salida del led.

Eso es normal y está explicado en la ayuda de PICBasic Pro.
Por cada instrucción Button que se usa dentro del programa, se le debe asignar una variable diferente. (Bvar)


La ayuda de PICBasic Pro dijo:
Bvar
Variable con tamaño de byte usada internamente para conteo de demoras y repeticiones.
Debe ser inicializada a 0 antes de ser usada y no ser usada en cualquier lugar del programa.

Saludos.
 
Eso es normal y está explicado en la ayuda de PICBasic Pro.
Por cada instrucción Button que se usa dentro del programa, se le debe asignar una variable diferente. (Bvar).

Entonces para usar el mismo boton para distintas tareas debo definir y usar otra variable por ejemplo A var byte para encender el led y usar una B var byte para apagarlo?

gracias
 
¿Entonces para usar el mismo botón para distintas tareas, debo definir y usar otra variable, por ejemplo; A var byte para encender el led y usar una B var byte para apagarlo?
Así es, cada instrucción Button debe tener una variable de conteo única.
Algo importante y a tener en cuenta, es realizar bien la escalera de etiquetas de retorno de cada instrucción.

Haz la prueba. :cool:
 
buenas tardes, una consulta amigos estoy haciendo un programita en basic pro para manejar los bit de puerto A del 16f628 como pulsadores y todos los del puerto B como salidas , el problema es que si mantengo presionado cambia de estado sucesivamente en la salida asignada, quisiera que se mantenga hasta la otra pulsación, les dejo el programa de antemano gracias por su apoyo :)

LED1 var portb.0 ;designamos LED1 al portb.0
LED2 VAR portb.1
pulsador1 var porta.1 ;designamos pulsador1 a porta.1
pulsador2 var porta.0

inicio:
If pulsador1 = 0 Then Encender1
pause 200
if pulsador2 = 0 then Encender2
GoTo inicio

Encender1:
PAUSE 200
Toggle LED1 ;cambia estado
GoTo inicio

Encender2:
pause 200
toggle led2
goto inicio
 
Edito porque me he equivocado, me he hecho un lío. Tienes 2 botones y 2 leds. Cada botón controla cada LED. Lo que necesitas es evitar que "rebote", para ello, coloca un while. No sé cómo es la sintaxis ahí pero sería algo como:

Encender1:
while pulsador1 = 0 (que no haga nada pero se quede atascado aquí, hasta soltar el botón)
...

Encender2:
while pulsador2 = 0 (lo mismo)
...
 
jmth dijo:
Edito porque me he equivocado, me he hecho un lío. Tienes 2 botones y 2 leds. Cada botón controla cada LED. Lo que necesitas es evitar que "rebote", para ello, coloca un while. No sé cómo es la sintaxis ahí pero sería algo como:

Encender1:
while pulsador1 = 0 (que no haga nada pero se quede atascado aquí, hasta soltar el botón)
...

Encender2:
while pulsador2 = 0 (lo mismo)
...

the falto cerrar el while, pero eso es bueno para que el interesado mire el manual basico del compilador y aprenda un poco mas sobre la funcion de while-wend

un videito que alimenta un poco el tema
 
no logro poder detener la salida , como es un bucle cambia como podria detenerlo


LED1 var portb.0 ;designamos LED1 al portb.0
pulsador1 var porta.1 ;designamos pulsador1 a porta.1


inicio:

WHILE pulsador1 =0 ; si se pulsa 0 se enciende
HIGH led1
WEND ;si es 1 apaga led
low led1
GOTO INICIO
END
 
no logro poder detener la salida , como es un bucle cambia como podria detenerlo


LED1 var portb.0 ;designamos LED1 al portb.0
pulsador1 var porta.1 ;designamos pulsador1 a porta.1


inicio:

WHILE pulsador1 =0 ; si se pulsa 0 se enciende
HIGH led1
WEND ;si es 1 apaga led
low led1
GOTO INICIO
END

:no:
Yo lo implementaria de esta manera:
IFpulsador1 = 0 THEN
WHILE pulsador1 = 0
PAUSE 200
WEND
HIGH led1
ENDIF


osea, con esto forzas un loop en la linea donde dice "WHILE pulsador1 = 0" y "WEND"... hasta que no cambie el estado del puerto, no va proseguir.... Supongamos que quieras cambiar el estado del puerto cada ves que pulsas "pulsador1"; En ese caso, reemplazamos la instruccion HIGH por TOGGLE
 
Última edición:
Yo lo que veo, es que no se ha definido que el PIC trabaje en modo Digital/IO.
Se debe configurar el registro CMCON. (CMCON = 7) para poder comparar los cambios lógicos de estado.

De otra forma, por muchos códigos que propongan, no van a funcionar correctamente.

Saludos.
 
Ya está, funcionó así.
Muchas gracias amigo torres por su apoyo y refrescarme la memoria.
Esto es para el control de 4 canales. :)

Código:
LED1       var portb.0        ;designamos LED1 al portb.0
LED2       var portb.1
LED3       VAR portb.2
LED4       VAR portb.3
pulsador1  var porta.0        ;designamos pulsador1  a porta.0
pulsador2  Var porta.1
pulsador3  var porta.2        
pulsador4  Var porta.3 
 
IF pulsador1 = 0 THEN
WHILE pulsador1 = 0 
PAUSE 200
WEND
toggle led1
ENDIF
 
IF pulsador2 = 0 THEN
WHILE pulsador2 = 0 
PAUSE 200
WEND
toggle led2
ENDIF
    
IF pulsador3 = 0 THEN
WHILE pulsador3 = 0 
PAUSE 200
WEND
toggle led3
ENDIF

IF pulsador4 = 0 THEN
WHILE pulsador4 = 0 
PAUSE 200
WEND
toggle led4
ENDIF
 
Última edición por un moderador:
Tengo este programa, pero quiero hacer que cuando pul=0 e int=0, prenda el led, pero sigo presionado y después de unos segundos se apague el led, y si siguen presionados los dos pulsadores que no se vuelva a encender hasta volver a soltar y presionar otra vez los dos pulsadores.
Algo me hace este programa que hice, pero se detiene y no se vuelve activar mas, hay que quitarle el voltaje y conectarlo para que vuelva a funcionar.
Código:
symbol int=portb.0
symbol pul=portb.1
symbol led=portb.2
symbol led1=portb.3
trisb.0=1
trisb.1=1
trisb.2=0
trisb.3=0


 led=0
 led1=0
 
 
inicio:
if int=0 and pul=0 then
toggle led
pause 1000
high led





else
low led
high led1
pause 100
low led1
pause 100
endif

goto inicio
 
Si es que entendí el planteamiento, el siguiente programa debe hacer lo que deseas:
PHP:
inicio:
    Symbol  pulsador1   = PORTB.0
    Symbol  pulsador2   = PORTB.1
    Symbol  led         = PORTB.2
    
    contador    Var Word

    OPTION_REG.7 = 0
    TRISB = %11110011
    PORTB = 0
    
programa:
    If pulsador1 = 0 And pulsador2 = 0 Then
        High led
        
        While pulsador1 = 0 And pulsador2 = 0
        
            contador = contador + 1
        
            Pause 1
        
            If contador > 2000 Then
                
                Low led
                
                While pulsador1 = 0 And pulsador2 = 0
                    @ NOP
                Wend
            EndIf
        Wend

        Low led
        
        contador = 0
        
    EndIf
    
    GoTo programa
    
    End
Saludos.
 
Última edición:
gracias por su repuesta pero lo probe y no funiona.. aver explico mejor...

cuando pulsador1=0 and pulsador2=0 enciende el led por 1 segundo y se apaga pero sin dejar de aplastar los p1 y p2, cuando suelte los pulsadores no haga nada asta volver aplastar y se vuelva a encerder el led por 1 seg



perdon si hace lo que quiero muchas gracias de verdad

y a eso hay como adicionar si p1=0 y p1=1 prenda el led por 1 segundo y se apague y vuelva a funcionar con el p1= y p2=0 gracias por tu ayuda de verdad que no sabia como salir de este rollo ...



perdon me hice bola
a ver explico mejor

si p1=0 and p2=0 prenda el led por 1 segundo
si p1=1 and p2=1 prenda el leds por 1 segundo
y esto repita siempre ahora si me explique bien gracias por su ayuda



si pasa esto p1=0 and p2=1 no enciende nada
si p1=1 and p2=0 no enciende nada


sera posible hacerlo
 
Última edición:
Atrás
Arriba