Curso de programación de PIC en PICBasic Pro

Solo tú sabes lo que estás haciendo, porque el enlace al que haces referencia es al ejemplo que subí.
Aunque si de TRIAC se trata, podría ser por ruido, lo cual ya se ha tratado en el Foro.
 
Hola. Estoy haciendo un control de luces con pulsadores pero no sé cómo hacer para que me funcione sin tener en cuenta que he presionado un pulsador X.
E
s decir, si presiono (pulsador) y (pulsador1) necesito que el programa me encienda los led asociados a cada pulsador sin importar cuál se presionó primero.
N
ecesito que sea libre, que obedezca al pulsador o los pulsadores presionados indistintamente.
¿Alguien me puede decir cómo lo hago?
Como lo tengo solo me obedece a uno por vez, no encuentro la forma de hacerlo en MicroCode Studio.
De antemano, gracias por su ayuda.

Pongo parte del programa:
Código:
inicio:                   ; inicio de la linea de programa       
if (pulsador=1) then gosub secuencia
pause 100       
if (pulsador1=1) then gosub secuencia1
  pause 100       
if (pulsador2=1) then gosub secuencia3
pause 100
goto inicio       

secuencia:
            HIGH portb.0   
           PAUSE 10000
           LOW portb.0     
            goto inicio           
secuencia1:         
            HIGH portc.0   
           PAUSE 10000
           LOW portc.0     
            goto inicio
secuencia3:           
           HIGH porta.0   
           PAUSE 100
           LOW porta.0     
            goto inicio

end                    ; fin del programa
 
No lo tomes a mal pero te sugiero que borres y comiences de nuevo.

La Instrucción GOSUB es para derivar el programa a una subrutina que comienza en una etiqueta y termina con RETURN(no existe tal cosa en tu programa .
De la ayuda del MicroCode
cap1.JPG


Si usas retardos de 10seg(PAUSE 10000, tu programa estará allí esperando que se cumpla el tiempo y recién luego retornara para ver que hiciste con los pulsadores, etc. etc.

SI necesitas estar atento a los pulsador tienes que encontrar la forma de no "matar" durante todo ese tiempo al microcontrolador para que este pueda revisar lo que tú haces con ellos.
 
No lo tomes a mal pero te sugiero que borres y comiences de nuevo.

La Instrucción GOSUB es para derivar el programa a una subrutina que comienza en una etiqueta y termina con RETURN(no existe tal cosa en tu programa .
De la ayuda del MicroCode
Ver el archivo adjunto 190079


Si usas retardos de 10seg(PAUSE 10000, tu programa estará allí esperando que se cumpla el tiempo y recién luego retornara para ver que hiciste con los pulsadores, etc. etc.

SI necesitas estar atento a los pulsador tienes que encontrar la forma de no "matar" durante todo ese tiempo al microcontrolador para que este pueda revisar lo que tú haces con ellos.

Hola, ricbevi. Pues lo he intentado de muchas formas pero no lo logro hacer y antes de usar el gosub usaba el goto, el else y cambiando el programa en varias formas pero nada.
A
hora más o menos entiendo lo que me explicas, lo voy a intentar nuevamente.
¿Si me podes dar una mano al menos con una linea para tener una idea clara?

Gracias de antemano.
 
Puede ser porque no te pones tú en el lugar del microcontrolador y el trabajo que según tus instrucciones debe realizar.

Recuerda y grabate que el microcontrolador solo hace una cosa a la vez pero el truco es que lo hace muy rápido para nosotros y así como una película de video es una sucesión de "fotos"a una velocidad rápida, tú puedes implementar un sistema similar en el programa.

Para qué quieres esperar sin hacer nada mas si debes prender algo durante x tiempo y luego apagarlo?

Hay varias formas de resolver esto según la precisión que amerite la situación.

Puedes realizar un contador con una variable que se incremente cada determinado tiempo(muy corto...ejemplo 50ms) y cada vez que la incrementas revisas los otros pulsadores y haces según tú antojo lo que debas y cuando llegas al tiempo según la suma de estos pequeños retardos apagas lo que has prendido.

La de mayor precisión sería usando interrupciones pero sospecho, por como vas con la programación en general, que lo dejes para más adelante.
 
Última edición:
Puede ser porque no te pones tú en el lugar del microcontrolador y el trabajo que según tus instrucciones debe realizar.

Recuerda y grabate que el microcontrolador solo hace una cosa a la vez pero el truco es que lo hace muy rápido para nosotros y así como una película de video es una sucesión de "fotos"a una velocidad rápida, tú puedes implementar un sistema similar en el programa.

Para qué quieres esperar sin hacer nada mas si debes prender algo durante x tiempo y luego apagarlo?

Hay varias formas de resolver esto según la precisión que amerite la situación.

Puedes realizar un contador con una variable que se incremente cada determinado tiempo(muy corto...ejemplo 50ms) y cada vez que la incrementas revisas los otros pulsadores y haces según tú antojo lo que debas y cuando llegas al tiempo según la suma de estos pequeños retardos apagas lo que has prendido.

La de mayor precisión sería usando interrupciones pero sospecho, por como vas con la programación en general, que lo dejes para más adelante.

Hola, ricbevi, soy un novato en esto pero ya entiendo lo que me dices, muchas gracias por tu aclaracion.
 
Coincido con ricbevi; No funciona por que el problema esta entre el computador/teclado y el asiento :ROFLMAO:
Fuera de broma, se me ocurrio una manera simple de hacerlo. El comandobtoggle invierte el estado del puerto seleccionado. Para que funcione, necesitamos dos cosas:
_Saber el estado inicial del puerto (por eso pongo en estado bajobal inicio para tener una referencia)
_tener un antirebote (con el comando while-wend podemos hacerlo)
_ejemplo:

Low portb.0
Low portb.1

inicio:
if pulsador1=1 then
While pulsador1=1 : wend
Toggle portb.0
Endif
if pulsador2=1 then
While pulsador2=1 : wend ;Antirebote
Toggle portb.1 ;invierte el estado del puerto
Endif
goto inicio
 
Sin Toggle también es posible
haciendo:
portb.1 = ~portb.1

Código:
Low portb.0
Low portb.1

inicio:
if pulsador1=1 then
While pulsador1=1 : wend
portb.0=~portb.0
Endif
if pulsador2=1 then
While pulsador2=1 : wend ;Antirebote
portb.1=~portb.1 ;invierte el estado del pin del puerto
Endif
goto inicio
 
Última edición:
Hola que tal me podrían ayudar con unos Contadores con PIC16F877A Y PICF1684A y un codificador 7447

Bueno en el caso del PIC16F84A se realizaba en el display numeros de 9 a 0 (adjunto captura de la simulacion)
1589216866177.png1589217006335.png1589217034613.pngEste es el circuito mas el codigo en Microcode el cual si sale el conte de 9 a 0.

Pero al momento de pasar a utilizar el decodificador no se como poder generar el código para MICROCODE STUDIO en el que el display debe de visualizar los números del 9 al 0.

1589216959943.png1589217170422.png


Y el ultimo seria utilizando esta misma simulacion (si es que esta mal hecha podrían decirme en donde) pero ahora se deben de utilizar dos displays y dos CI 7447 yl contador debe de ser de 99 a 0
 

Adjuntos

  • 1589216902322.png
    1589216902322.png
    45.6 KB · Visitas: 3
  • 1589216903272.png
    1589216903272.png
    45.6 KB · Visitas: 2
Le sugiero y para facilitar el análisis y posibles respuestas, hace un archivo con simulación y código y súbalo como adjunto.

Como se dara cuenta hay mil formas o poco menos de hacer esto.

Para mi el error es el tipo de display con el controlador que no es el que corresponde.
 

Adjuntos

  • Puerto.rar
    13.7 KB · Visitas: 7
Última edición:
Le sugiero y para facilitar el análisis y posibles respuestas, hace un archivo con simulación y código y súbalo como adjunto.

Como se dara cuenta hay mil formas o poco menos de hacer esto.

Para mi el error es el tipo de display con el controlador que no es el que corresponde.

Si, cambie el display y ahí ya hizo el counter correctamente, al igual cambie algo del código y me funciono por ahora :D
 
Me olvide incluir el código de mi simulación pero es lo que apreciaba en la imagen de lo aportado en la consulta más pequeños agregados sin el cual a veces las cosas no funcionan.

Código:
'****************************************************************
'*  Name    : Puerto.BAS                                        *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [RicBevi ] :)                  *
'*          : All Rights Reserved                               *
'*  Date    : 11/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC 16F628A + decodificador 7447 y 4511 conectados*
'*          : a B.0...B.3 con display de 7 segmentos AC y CC    *
'*          : respectivamente                                  *
'****************************************************************
' fusible de programación del pic
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
' uso el oscilador interno y los pines son digitales, sin wdt,mclr, protección de código, programación de bajo voltaje

DEFINE  OSC  4  ' velocidad de trabajo del oscilador

cmcon = 7 ' apago comparadores analógicos

trisb = 0 ' puerto B es salida
portb = 0 ' limpio puerto a estado bajo

i var byte ' defino variable


inicio: ' inicio de la rutina/programa

for i = 0 to 9    ' Para el valor de i entre 0 y 9
portb = i         ' el puerto toma el valor de i
pause 500         ' espero medio segundo
next i            ' incremento i hasta el valor de 9

goto inicio       ' voy a iniciar todo de nuevo

end  ' fin del programa

Por cierto en sus esquemas dejas pines libres o flotantes(sin ninguna referencias o a GND o a Power) en los IC decodificadores y eso puede traer problemas en la simulación o en la práctica por lo que es una buena práctica no hacerlo.
 
[/CODE]

Por cierto en sus esquemas dejas pines libres o flotantes(sin ninguna referencias o a GND o a Power) en los IC decodificadores y eso puede traer problemas en la simulación o en la práctica por lo que es una buena práctica no hacerlo.
[/QUOTE]
Me olvide incluir el código de mi simulación pero es lo que apreciaba en la imagen de lo aportado en la consulta más pequeños agregados sin el cual a veces las cosas no funcionan.

Código:
'****************************************************************
'*  Name    : Puerto.BAS                                        *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [RicBevi ] :)                  *
'*          : All Rights Reserved                               *
'*  Date    : 11/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC 16F628A + decodificador 7447 y 4511 conectados*
'*          : a B.0...B.3 con display de 7 segmentos AC y CC    *
'*          : respectivamente                                  *
'****************************************************************
' fusible de programación del pic
_intrc_osc_pwrt_on_wdt_off_mclr_off_lvp_off_protect_off
' uso el oscilador interno y los pines son digitales, sin wdt,mclr, protección de código, programación de bajo voltaje

DEFINE  OSC  4  ' velocidad de trabajo del oscilador

cmcon = 7 ' apago comparadores analógicos

trisb = 0 ' puerto B es salida
portb = 0 ' limpio puerto a estado bajo

i var byte ' defino variable


inicio: ' inicio de la rutina/programa

for i = 0 to 9    ' Para el valor de i entre 0 y 9
portb = i         ' el puerto toma el valor de i
pause 500         ' espero medio segundo
next i            ' incremento i hasta el valor de 9

goto inicio       ' voy a iniciar todo de nuevo

end  ' fin del programa

Por cierto en sus esquemas dejas pines libres o flotantes(sin ninguna referencias o a GND o a Power) en los IC decodificadores y eso puede traer problemas en la simulación o en la práctica por lo que es una buena práctica no hacerlo.
Gracias, en caso de querer conectar dos contadores pero sin decodificador en un PIC16F877A solo me funciona bien el primer contador que esta conectado en el puerto b
este sería el codigo que llevo por ahora
 

Adjuntos

  • Circuito 3.rar
    22.7 KB · Visitas: 9
Última edición:
Al menos a mi me pasa que el archivo pbp no corresponde al hex adjuntado.

Declaras y limpias el puerto B y C en el programa y usas el display conectado al B y al D en la simulación, el cristal de esa forma (en cortocircuito los pines del oscilador) jamas funcionara en la realidad...¿para que esta al igual que los capacitores de 22pF? no son necesarios para la simulación.

Por otro lado si no declaras la velocidad creo que el PBP toma como que sera 4MHz por defecto pero en las propiedades del pic lo declaras a 1MHz.

Esto es importante porque el compilador calcula los retardos de tiempo en función a dicho cristal declarado.

Te aclaro que el PBP lo manejo muy por arriba ya que hace mas de 10 años que migre al Proton Basic por las limitaciones que tiene dicho compilador.

Debes trabajar y mucho ya que esto es horas y horas de silla delante del compilador y simulador pero debes basarte en como son las cosas realmente.

No puedes poner un display de led sin decodificador en un puerto, si no haces tú en el programa el trabajo de pasar el numero a lo que se debe mostrar en los dígitos mediante el prendido de los segmentos.

Subiste un ejemplo con LookUp a eso me refiero y eso es lo que necesitas o alguno otra forma pero no la que adjuntaste en cuanto a programación.
 
Al menos a mi me pasa que el archivo pbp no corresponde al hex adjuntado.

Declaras y limpias el puerto B y C en el programa y usas el display conectado al B y al D en la simulación, el cristal de esa forma (en cortocircuito los pines del oscilador) jamas funcionara en la realidad...¿para que esta al igual que los capacitores de 22pF? no son necesarios para la simulación.

Por otro lado si no declaras la velocidad creo que el PBP toma como que sera 4MHz por defecto pero en las propiedades del pic lo declaras a 1MHz.

Esto es importante porque el compilador calcula los retardos de tiempo en función a dicho cristal declarado.

Te aclaro que el PBP lo manejo muy por arriba ya que hace mas de 10 años que migre al Proton Basic por las limitaciones que tiene dicho compilador.

Debes trabajar y mucho ya que esto es horas y horas de silla delante del compilador y simulador pero debes basarte en como son las cosas realmente.

No puedes poner un display de led sin decodificador en un puerto, si no haces tú en el programa el trabajo de pasar el numero a lo que se debe mostrar en los dígitos mediante el prendido de los segmentos.

Subiste un ejemplo con LookUp a eso me refiero y eso es lo que necesitas o alguno otra forma pero no la que adjuntaste en cuanto a programación.
No estan adjuntados los que subi? bueno no los ejecuta?
Bueno la cosa esque en mi trabajo así me lo pide, conectar los dos display sin el decodificador :(
 
No estan adjuntados los que subi? bueno no los ejecuta?
Bueno la cosa esque en mi trabajo así me lo pide, conectar los dos display sin el decodificador :(

Si el trabajo así se lo pide debe hacerlo así para cumplirlo pero no pretenda que lo que aplica a nivel de software para el circuito con un codificador binario a 7 segmentos sea idéntico al que no lo tiene.

Estoy refiriéndome a lo que subió en el adjunto Ciruito3.rar.

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISB = 0
PORTB = 0

TRISC = 0
PORTC = 0
'DECLARACION DE VARIABLES
i VAR BYTE
a VAR BYTE
b VAR BYTE



un0 VAR a.0
un1 VAR a.1
un2 VAR a.2
un3 VAR a.3

de0 VAR b.0
de1 VAR b.1
de2 VAR b.2
de3 VAR b.3



INICIO:
FOR i=99 TO 0 STEP -1
b=i/10
a=i-b*10

PORTB.0=un0
PORTB.1=un1
PORTB.2=un2
PORTB.3=un3  

PORTC.0=de0
PORTC.1=de1
PORTC.2=de2
PORTC.3=de3


PAUSE 500
NEXT i
GOTO INICIO

Los archivos incluidos no corresponde el hex al pbp que contienen.

El archivo hex se ejecuta con la falla del dígito de la decena pero no se puede analizar o reformar nada por que no corresponde al archivo pbp que se encuentra allí(ver código subido).

Tal vez soy yo que no veo donde convierte de binario a 7 segmentos en dicho software y usted me lo puede indicar.

Tabla que contiene el codificador binario a 7 segmentos 7447 y que se debe implementar en el software si no se lo quiere usar.

Ca.JPG

Por cierto también es de buena practica realizar comentarios de que se esta haciendo en el programa para ayudar al otro a comprender que se esta realizando y en el futuro para uno mismo, ver de que forma lo hacia.

Simulacion

Captura.JPG

Donde se aprecian todas y cada una de las fallas que le advertí anteriormente(cristal, uso erróneo del puertoD cuando el software usa el C, etc).
 
Última edición:
Buenas noches.
soy nuevo en esto del PIC12F635, me podrian brindar una mano con alun ejemplo sencillo , como por ejemplo encender un led. por que la verdad no tengo idea de como configurar a sus pines de salida ni como cambiarles de nombre. Dicho sea de paso programo en Pic Basic Pro.

Pd:
Por experiencias en otros Pic se que para cambiar de nombre a un pin en especifico que quiero como salida,en este caso un led ,hago lo siguiente:
LED1 VAR PORTC.5 o SYMBOL LED1 = PORTC.5

En el PIC12f635 como llamaria a sus pines de salida.?!

Gracias de ante mano.
 
¿En el PIC12F635 cómo llamaría a sus pines de salida?
En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA
¿Me podrían brindar una mano con algún ejemplo sencillo, como por ejemplo; encender un LED?
High Pin para establecer un estado alto y Low Pin para establecer un estado bajo.

Ejemplos sobre LED con PIC en PICBasic existen muchos en el Foro.
 
Atrás
Arriba