Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

24/05/2012 #21


Hey! Darkbytes si me sirvió tu ejemplo voy a seguir practicando para intentar otros programas.
Muchas gracias
12/06/2012 #22

Avatar de fife89

problema con programa en picbasic uso de 4 pulsadores
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?
12/06/2012 #23

Avatar de fife89

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?
05/09/2012 #24

Avatar de kiyero

Problema al programar pulsador con picbasic
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:

Código:
------------------------------------------------------------------------------------------
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
06/09/2012 #25
Moderador

Avatar de D@rkbytes

fife89 dijo: Ver Mensaje
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

kiyero dijo: Ver Mensaje
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
kiyero dijo: Ver Mensaje
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.
09/09/2012 #26

Avatar de kiyero

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
Archivos Adjuntos
Tipo de Archivo: zip pulsador.zip (14,8 KB (Kilobytes), 83 visitas)
12/09/2012 #27
Moderador

Avatar de D@rkbytes

kiyero dijo: Ver Mensaje
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.
Archivos Adjuntos
Tipo de Archivo: zip pulsador(2).zip (19,2 KB (Kilobytes), 124 visitas)
12/09/2012 #28

Avatar de kiyero

D@rkbytes dijo: Ver Mensaje
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.
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
20/05/2014 #29


Rarezas del comando button
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
20/05/2014 #30
Moderador

Avatar de D@rkbytes

Bertub dijo: Ver Mensaje
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.
20/05/2014 #31


D@rkbytes dijo: Ver Mensaje
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
20/05/2014 #32
Moderador

Avatar de D@rkbytes

Bertub dijo: Ver Mensaje
¿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.
21/08/2014 #33


Encendido de un led mediante pulsador pic basic pro
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
21/08/2014 #34

Avatar de jmth

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)
...
21/08/2014 #35

Avatar de torres.electronico

jmth dijo: Ver Mensaje
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
21/08/2014 #36


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
21/08/2014 #37

Avatar de torres.electronico

davo81 dijo: Ver Mensaje
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

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
21/08/2014 #38
Moderador

Avatar de D@rkbytes

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.
21/08/2014 #39

Avatar de torres.electronico

ni me fije la config de los fuses; Se me chispoteo algo tan basico e importante
21/08/2014 #40


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
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.