# Encendido de un led mediante pulsador pic basic pro



## isranator3 (Abr 18, 2012)

Hola tengo este programa para poder encender un led mediante un pulsador con el pic 16f886 pero no me funciona simulado en proteus y mucho menos físicamente, quisiera saber si alguien podría decirme que estoy haciendo mal. de antemano muchas gracias.

ADCON1=%00000110
trisb=%11111111
trisa=%00000000
porta=0
portb=0
inicio:
if portb.0 = 1 then
high porta.0
pause 1000
low porta.0
goto inicio
endif
end


----------



## D@rkbytes (Abr 18, 2012)

isranator3 dijo:


> Hola tengo este programa para poder encender un led mediante un pulsador con el pic 16f886 pero no me funciona simulado en proteus y mucho menos físicamente, quisiera saber si alguien podría decirme que estoy haciendo mal. de antemano muchas gracias.


Saludos.
Omite ADCON1=%00000110 y agrega...
ANSEL = 0
ANSELH = 0

Haz tus pruebas con esos cambios agregados.

PD. Si declaras el puerto B como entradas, no tiene caso que hagas PORTB = 0 "Son entradas"
Adjunto el ejemplo por si acaso, ya que incluye la configuración de los fuses,
comentarios agregados y la simulación.

Suerte y hasta luego.


----------



## isranator3 (Abr 18, 2012)

Hey compañero muchas gracias, era ese mi error te lo agradezco mucho de verdad, no sabia eso de los ansel y anselh me sirvió mucho



Mmmm y tengo otra duda ¿como podría hacer para que después de determinado numero de pulsaciones encienda el led? por ejemplo quiero que encienda después de 3 pulsaciones, ojala me pudieras ayudar...gracias


----------



## D@rkbytes (Abr 18, 2012)

isranator3 dijo:


> Hey compañero muchas gracias, era ese mi error te lo agradezco mucho de verdad, no sabia eso de los ansel y anselh me sirvió mucho
> 
> Mmmm y tengo otra duda ¿como podría hacer para que después de determinado numero de pulsaciones encienda el led? por ejemplo quiero que encienda después de 3 pulsaciones, ojala me pudieras ayudar...gracias


 Ok. Saludos
Que bien que te sirvió el ejemplo. Pero mira, ahora que te inicias en la programación en PBP
En este foro hay un curso de programación en PICBASIC PRO puedes ir leyéndolo para aprender más.
Lo que quieres realizar es bastante fácil, y se puede lograr de varias formas,
pero todo depende de la forma en que lo hagas, para ver los resultados finales.
Ya que pueden ocurrir resultados no esperados si no controlas el código correctamente.
Otra cosa que me gustaría que hicieras, sería que tu primero realizaras el código para que
intentes como podría ser, y así podrías aprender mejor. (Echando a perder se aprende) =)
Haz tu programa, y si no te funciona como lo esperabas, súbelo y entonces te ayudaremos.
Y te digo esto porque aquí existen reglas que te recomiendo que leas.
*Reglas generales de uso del foro (Extended Version)*

Bien pues, a seguir programando.

 PD. Yo ya realice el ejemplo, pero si me gustaría ver como lo harías tu. 


Suerte y hasta luego.


----------



## isranator3 (Abr 20, 2012)

Después de varios intentos creo que pude hacer que se prendiera después de 2 intentos y lo simule en proteus para ver si funcionaba y parece que si pero creo que no es muy exacto. Aquí esta mi código:

ANSEL = 0                   
ANSELH = 0                  
TRISA = 0					
TRISB = $FF					
PORTA = 0                   
UNO:
	IF PORTB.0 = 1 THEN
    HIGH PORTA.0
 	IF PORTB.0 = 1 THEN
	LOW PORTA.0
	ENDIF
	ENDIF
    GOTO UNO
    END
Ojala me pudieras decir como mejorar mi código o decirme en que estoy mal.
Gracias


----------



## D@rkbytes (Abr 20, 2012)

isranator3 dijo:


> Después de varios intentos creo que pude hacer que se prendiera después de 2 intentos y lo simule en proteus para ver si funcionaba y parece que si pero creo que no es muy exacto. Aquí esta mi código:
> 
> ANSEL = 0
> ANSELH = 0
> ...


OK. Saludos. 
 Quedamos en que al hacer tres pulsaciones en RB0 se encendiera un LED en RA0.
Bien, Para esto necesitamos una variable que se incremente en 1 cada pulsación.
Los programas son secuenciales, ejecutan una tarea, y pasan a la siguiente,
por lo tanto y como no hay retardos en el programa que hiciste, no alcanzarías a ver los cambios.
Y el LED se encendería desde la primera pulsación, se apagaría nuevamente y así por siempre,
mientras se mantenga pulsado RB0.
Te dejo aquí el código que realice para el propósito de encender un LED después de tres pulsaciones.
Analízalo y espero te sirva. Suerte y hasta luego.


----------



## isranator3 (Abr 20, 2012)

Hey muchas gracias, con el contador es mucho mas exacto. También observe lo de las variables, son de mucha ayuda en programas como estos.
Ademas busque información sobre la instrucción BUTTON que utilizaste, y encontré que sirve para anti-rebote y auto-repetición de entrada en un pin, pero aun no comprendí muy bien para que utilizaste estos números y la variable B0 (0,1,255,255,B0,0,MainLoop).
Pero muchas gracias por ayudarme con esto, me pondré a revisar mas instrucciones para aprender mas.


----------



## D@rkbytes (Abr 20, 2012)

isranator3 dijo:


> Hey muchas gracias, con el contador es mucho mas exacto. También observe lo de las variables, son de mucha ayuda en programas como estos.
> Ademas busque información sobre la instrucción BUTTON que utilizaste, y encontré que sirve para anti-rebote y auto-repetición de entrada en un pin, pero aun no comprendí muy bien para que utilizaste estos números y la variable B0 (0,1,255,255,B0,0,MainLoop).
> Pero muchas gracias por ayudarme con esto, me pondré a revisar mas instrucciones para aprender mas.


Saludos. 
El porque use esos números esta descrito en el manual de PBP.
Dice así:

*BUTTON*  Pin, Down, Delay, Rate, Bvar, Action, Etiqueta 

Lee Pin y opcionalmente ejecuta anti-rebote y auto-repetición. 
Pin automáticamente se toma como entrada.
Pin debe ser una constante, 0 - 15, o una variable que contenga un número 0 - 15 (p.ej. B0)
ó un número de pin (p.ej. PORTA.0) 

*Down*  Estado del pin cuando se oprime el pulsador (0-1)

*Delay*  Contador de ciclos antes de que comience la auto-repetición (0-255).
Si es 0, no se efectua anti-rebote ni auto-repetición. Si es 255 se eliminan rebotes, pero no auto-repetición.

*Rate*  Valor de auto-repetición (0-255)

*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.

*Action*  Estado del pulsador al ser actuado.

*Etiqueta*  La ejecución comienza en esta etiqueta si es cierto Action.

OK. Esto viene en el manual de PICBASIC PRO en español. Buscalo te lo recomiendo.


----------



## isranator3 (Abr 26, 2012)

Estoy utilizando lo que me enseñaste con los pulsadores y ahora estoy tratando de hacer funcionar 2 pulsadores a la vez pero solo me funciona el primero (el que esta en PORTB.0). Aqui esta el código que estoy realizando:

ANSEL = 0                  
ANSELH = 0                 
TRISA = %00000000			
TRISB = $FF				
; Variables
COUNTER VAR BYTE
COUNTER1 VAR BYTE           
B0 VAR BYTE
B1 VAR BYTE                  
PORTA = 0                   


TUPATUPA:
    BUTTON PORTB.0,1,255,255,B0,0,TUPATUPA
    COUNTER = COUNTER + 1   
    IF COUNTER = 3 THEN     
    PORTA.0 = 1             
    PAUSE 1000              
    PORTA.0 = 0             
    COUNTER = 0
	ENDIF
	GOTO TUPATUPA

OINKOINK:
    BUTTON PORTB.1,1,255,255,B1,0,OINKOINK
    COUNTER1 = COUNTER1 + 1   
    IF COUNTER1 = 3 THEN     
    PORTA.0 = 1             
    PAUSE 1000              
    PORTA.0 = 0             
    COUNTER1 = 0             
    ENDIF          
    GOTO OINKOINK

No entiendo que es lo que no funciona, ojala pudieras darme una idea para corregirlo y continuar con mi proyecto...Gracias


----------



## D@rkbytes (Abr 26, 2012)

isranator3 dijo:


> Estoy utilizando lo que me enseñaste con los pulsadores y ahora estoy tratando de hacer funcionar 2 pulsadores a la vez pero solo me funciona el primero (el que esta en PORTB.0)
> 
> No entiendo que es lo que no funciona, ojala pudieras darme una idea para corregirlo y continuar con mi proyecto...Gracias


Saludos nuevamente isranator3
OK. Ahora verifica el código que adjunto para ver si es lo que deseabas hacer.
Hice algunos cambios y le cambie el nombre a esas etiquetas tan originales. 

Suerte y hasta luego.


----------



## isranator3 (Abr 26, 2012)

Si, eso era lo que quería saber.
Si vi mi error, solo era cuestión de acomodar bien las etiquetas en la instrucción BUTTON. 
Ahora ya esta funcionando, muchas gracias. 
Te pregunto todo esto porque estoy tratando de hacer una especie de "caja fuerte" sencilla. Y el led que enciende es una "alarma" y con esto que me dijiste seguro queda bien.
De nuevo gracias Darkbytes


----------



## D@rkbytes (Abr 26, 2012)

isranator3 dijo:


> Si, eso era lo que quería saber.
> Si vi mi error, solo era cuestión de acomodar bien las etiquetas en la instrucción BUTTON.
> Ahora ya esta funcionando.
> 
> De nuevo gracias Darkbytes


OK. De nada.
Bueno, aparte de acomodar las etiquetas, el principal error estaba en...

```
TUPATUPA:
    BUTTON PORTB.0,1,255,255,B0,0,TUPATUPA
    COUNTER = COUNTER + 1   
    IF COUNTER = 3 THEN     
    PORTA.0 = 1             
    PAUSE 1000              
    PORTA.0 = 0             
    COUNTER = 0
    ENDIF
    GOTO TUPATUPA ; <-- Este era el principal error.
; Al estar este GOTO ya no permitias que se ejecutara la siguiente parte del código.
 
OINKOINK:
    BUTTON PORTB.1,1,255,255,B1,0,OINKOINK
    COUNTER1 = COUNTER1 + 1   
    IF COUNTER1 = 3 THEN     
    PORTA.0 = 1             
    PAUSE 1000              
    PORTA.0 = 0             
    COUNTER1 = 0             
    ENDIF          
    GOTO OINKOINK
```
Suerte y hasta luego.


----------



## isranator3 (Abr 30, 2012)

Ok, muchas gracias...
Y perdón por molestarte de nuevo pero... ahora estoy tratando de parar un motor con un pulsador, pero este no se detiene. Este es mi código en pbp:

```
'motor
ANSEL=0
ANSELH=0
TRISC=%11111111
TRISB=%00000000
PORTB=0
	HIGH PORTB.0
	IF PORTC.0 = 0 THEN
	LOW PORTB.0
	ENDIF
	END
```
Según yo, esto es todo lo que necesito para poder detener el motor pero aun no logro que funcione... y gracias por tu interés y tu ayuda



En el programa anterior el PORTB.0 controla el motorreductor y el PORTC.0 es el push botton que hara que se detenga


----------



## lpnavy (Abr 30, 2012)

isranator3 dijo:


> Ok, muchas gracias...
> Y perdón por molestarte de nuevo pero... ahora estoy tratando de parar un motor con un pulsador, pero este no se detiene. Este es mi código en pbp:
> 
> ```
> ...




el codigo esta incompleto, usa la instruccion IF ELSE, goto y  veras que funciona


----------



## D@rkbytes (Abr 30, 2012)

isranator3 dijo:


> Ok, muchas gracias...
> Y perdón por molestarte de nuevo pero... ahora estoy tratando de parar un motor con un pulsador, pero este no se detiene.
> 
> Según yo, esto es todo lo que necesito para poder detener el motor pero aun no logro que funcione... y gracias por tu interés y tu ayuda
> ...


Saludos.
Lo que hace falta aparte del Else, es una Etiqueta de control.
Recuerda que los programas son consecutivos.

Aqui adjunto el código.

Suerte.


----------



## isranator3 (Abr 30, 2012)

Gracias por su ayuda a los dos, ya me funciono.
Después de observar que no me quedaba con IF lo intente con la instrucción WHILE y de igual manera funciono
Aquí dejo el codigo:

```
'motor
ANSEL=0
ANSELH=0
TRISC=%11111111
TRISB=%00000000
PORTB=0
INICIO:
	WHILE PORTC.0 = 1
	HIGH PORTB.0
	WEND
	LOW PORTB.0
	GOTO INICIO
	END
```
Gracias por su auda Darkbytes e Ipnavy


----------



## gerardo35 (May 21, 2012)

hola amigos ante todo saludos desde venezuela
quisiera que me ayudaran con un star/stop quiero encender algo con un pulsador y con ese mismo pulsador apagarlo, la idea es controlar un arranque de motor de un carro, de verdad espero que me ayuden...


----------



## D@rkbytes (May 22, 2012)

gerardo35 dijo:


> hola amigos ante todo saludos desde venezuela
> quisiera que me ayudaran con un star/stop quiero encender algo con un pulsador y con ese mismo pulsador apagarlo, la idea es controlar un arranque de motor de un carro, de verdad espero que me ayuden...


Saludos gerardo35
Date una vuelta por este post. _Instrucciones TOGGLE y BUTTON en PBP_
Recientemente tratamos sobre eso que quieres. Ya lo he tratado en otras ocasiones,
pero ese post esta dentro del tema Curso de programación de PIC en PICBASIC PRO

Suerte y hasta luego.


----------



## isranator3 (May 23, 2012)

Hola a todo de nuevo, y disculpen pero vengo otra vez con una duda.
Estoy tratando ahora de apagar un led después de accionar 3 veces un pulsador, pero no logro hacer que funcione y no entiendo porque, según yo solo es cambiar el estado del puerto después de que se cuenten las 3 veces. Ojala me puedan ayudar a corregir mi error. Dejo el código.

```
ANSEL = 0                   
ANSELH = 0                  
TRISC = %11111111			
TRISB = %00000000				
Counter VAR BYTE            
C0 VAR BYTE             
PORTB = 0                                    

INICIO:
    BUTTON PORTC.0,0,255,255,C0,1,INICIO
    Counter = Counter + 1   
    IF Counter = 3 THEN     
    PORTB.0 = 0             
    ELSE      
    PORTB.0 = 1           
    Counter = 0            
    ENDIF
    GOTO INICIO           
    END
```


----------



## D@rkbytes (May 23, 2012)

isranator3 dijo:


> Hola a todo de nuevo, y disculpen pero vengo otra vez con una duda.
> Estoy tratando ahora de apagar un led después de accionar 3 veces un pulsador, pero no logro hacer que funcione y no entiendo porque, según yo solo es cambiar el estado del puerto después de que se cuenten las 3 veces. Ojala me puedan ayudar a corregir mi error.


Saludos nuevamente isranator3
Prueba con este código ahora.

```
ANSEL = 0                   
ANSELH = 0                  
TRISC = $FF            
TRISB = 0                
Counter VAR BYTE            
C0 VAR BYTE             
PORTB = 1
Counter = 1                                   

INICIO:
    BUTTON PORTC.0,1,255,255,C0,0,INICIO  
    IF Counter = 3 THEN     
    PORTB.0 = 0
    Counter = 0             
    ELSE      
    PORTB.0 = 1
    Counter = Counter + 1                       
    ENDIF
    GOTO INICIO           
    END
```
Suerte.


----------



## isranator3 (May 24, 2012)

Hey! Darkbytes si me sirvió tu ejemplo voy a seguir practicando para intentar otros programas.
Muchas gracias


----------



## fife89 (Jun 12, 2012)

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 

```
@ 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?


----------



## fife89 (Jun 12, 2012)

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?


----------



## kiyero (Sep 5, 2012)

Hola a todos, solicito su ayuda en lo siguiente:

Estoy estudiando la programación de pics a través del pic basic pro y microcode studio, mis inicios han ido muy bien, pero al entrar a la parte de pulsadores, me he encontrado con un dilema y es el siguiente en el cual solicito su valiosa ayuda:
estoy probando con dos interruptores encender un led (sw1 y sw2), de la siguiente forma: 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, he elaborado el programa según el manual (y como lo he entendido), lo simulo en proteus y no me hace nada de nada. A continuación el programa como lo he hecho y simulado en Proteus:​

```
------------------------------------------------------------------------------------------
sw1 var portb.0                                                   
sw2 var portb.1                                                   
led var portb.2                                                   
ky var byte                                                   

Program:
if sw1=0 and sw2=0 then Prender1                                  
if sw1=0 and sw1=0 and sw2=0 then Prender2                   
goto Program                                                      

Prender1:
high led                                                          
pause 500                                                       
low led                                                           
goto program

Prender2:
for ky=1 to 3                                                 
high led                                                          
pause 250                                                       
low led                                                           
pause 250                                                      
next ky                                                       
goto program

END                         
------------------------------------------------------------------------------------------
```
El pic que utilizo para esto el  16f628A. De antemano, mil gracias por su ayuda


----------



## D@rkbytes (Sep 6, 2012)

fife89 dijo:


> lo logre en asm
> 
> 
> ```
> ...



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



kiyero dijo:


> 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.

```
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
```



kiyero dijo:


> lo simulo en proteus y no me hace nada de nada.



Recuerda configurar los puertos y los fuses del PIC

```
@ 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.


----------



## kiyero (Sep 9, 2012)

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.

Muchas gracias


----------



## D@rkbytes (Sep 12, 2012)

kiyero dijo:


> 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.


----------



## kiyero (Sep 12, 2012)

D@rkbytes dijo:


> 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.
> ...



D@rkbytes, excelente es prácticamente lo que quiero hacer, aunque usaste instrucciones que aún desconozco, (estoy arrancando con el aprendizaje), pero me vá dando ideas, voy adelantando de a poco, muchas gracias por tu tiempo y ayuda, lo de la calamidad fué la muerte de mi abuelo, no fué tan duro ya que venía sufriendo de una penosa enfermedad, pero bueno, seguimos adelante, de seguro en algún futuro volveré a solicitar tu ayuda, gracias


----------



## Bertub (May 20, 2014)

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


----------



## D@rkbytes (May 20, 2014)

Bertub dijo:


> *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?
> ...



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.


----------



## Bertub (May 20, 2014)

D@rkbytes dijo:


> 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


----------



## D@rkbytes (May 20, 2014)

Bertub dijo:


> ¿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.


----------



## davo81 (Ago 21, 2014)

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


----------



## jmth (Ago 21, 2014)

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)
...


----------



## torres.electronico (Ago 21, 2014)

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)
> ...



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


----------



## davo81 (Ago 21, 2014)

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


----------



## torres.electronico (Ago 21, 2014)

davo81 dijo:


> no logro poder detener la salida , como es un bucle cambia como podria detenerlo
> 
> 
> LED1       var    portb.0        ;designamos LED1 al portb.0
> ...




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


----------



## D@rkbytes (Ago 21, 2014)

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.


----------



## torres.electronico (Ago 21, 2014)

hno: ni me fije la config de los fuses; Se me chispoteo algo tan basico e importante


----------



## davo81 (Ago 21, 2014)

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


```
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
```


----------



## NEON USA (Ago 8, 2016)

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.

```
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
```


----------



## D@rkbytes (Ago 8, 2016)

Si es que entendí el planteamiento, el siguiente programa debe hacer lo que deseas:

```
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.


----------



## NEON USA (Ago 9, 2016)

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


----------



## D@rkbytes (Ago 9, 2016)

Si es posible, ya tienes la base de cómo se puede hacer.
Nada más elige bien tus comparaciones y haz que reaccione ante lo que procede.


----------



## NEON USA (Ago 9, 2016)

Gracias. Si, ya me dí cuenta de la falla,  muchas gracias.



Disculpen otra vez mi molestia. Estoy haciendo un cronometro, ya lo tengo casi listo pero necesito poner pausa con un pulsador y al volver a pulsarlo que empiece a contar otra vez y la verdad que no sé cómo.

Disculpen mi curiosidad, pero esto de los pic se pone más interesante cada vez.

Aquí está mi programa:

```
unid VAR BYTE ;variable unidades
dece VAR BYTE ;variable decenas
cent VAR BYTE ;variable centenas
mile VAR BYTE ;variable miles
actual var byte
cuenta var byte
chicha VAR porta.0 ;pin de la chicharra
pulsoreloj VAR porta.2 ;pulso segundos
resetear VAR porta.1 ;regresa a cero
activar VAR BIT ;bandera para la tecla contar
trisb=0 ;todo el puerto b es de salida
cmcon=7 ;Todo el puerto A en modo digital
pito:
high chicha
pause 200
low chicha

encerar:
 


unid=0 ;carga la variable unid con cero
dece=0 ;carga la variable dece con cero
cent=0 ;carga la variable cent con cero
mile=0 ;carga la variable mile con cero
actual=1
cuenta=0







;setea TMR0 de interrupción cada 32768 microsegundos
OPTION_REG = %1010110 ;setea TMR0 configurando y habilita PORTB pullups
INTCON = %10100000 ;hablilita TMR0 interrupción interna
ON INTERRUPT GOTO interrup
     
     
     

display:

portb= 224+unid ;224 %11100000, activa las unidades
PAUSE 3
portb= 208+dece ;208 %11010000, activa las decenas
PAUSE 3
portb= 176+cent ;176 %10110000, activa las centenas
PAUSE 3
portb= 112+mile ;112 %01110000, activa los miles
PAUSE 3
gosub interrup

GOTO display





;************** Handler de interrupciones para incrementar contador ***************
DISABLE ;deshabilita interrupciones durante el proceso
interrup:
if resetear=0 then pito 
high pulsoreloj
cuenta = cuenta + 1 ;cuenta las interrupciones del TMR0

TMR0=4 ;resta 4 al contador de 256 del TMR0
IF cuenta < 31 THEN reset ;31 cuentas (32256ms = 999936uS)
cuenta = 0
low pulsoreloj




unid = unid + 1
IF unid >= 10 THEN
unid = 0

dece = dece + 1
IF dece >= 6 THEN
dece = 0
cent = cent + 1
IF cent>= 10 THEN
cent = 0
mile = mile + 1
IF mile>= 6 THEN
cent = 0
ENDIF
ENDIF
ENDIF
endif
reset:


INTCON.2 = 0 ;resetea la bandera de interrupción del TMR0

RESUME
```


----------



## D@rkbytes (Ago 9, 2016)

Mira por aquí: *Cronometro dual con pausa*


----------



## NEON USA (Ago 10, 2016)

gracias
voy a echar una chequeada a ver como me va...... gracias


----------

