Curso de programación de PIC en PICBasic Pro

Hola. ¿Qué tal, Torres? A ver si puedo ayudar un poco con mi poco conocimiento que tengo.
Entiendo que en la primera línea de tu código:
Periodo = 600 / Frecuencia ; 10 mínimo - 30 máximo
En esta línea "Periodo" toma un valor como mínimo de 10 y un máximo de 30
Si es así entonces "Frecuencia" toma un valor comprendido entre 20 y 60
1- 20 para un periodo máximo igual a 30, ya que al dividir 600 / 20 = 30 máximo.
2- 60 para un periodo mínimo igual a 60. 600 / 60 = 10 mínimo.

Espero haber ayudado y que sea lo que pude comprender.
 

torres.electronico

Well-known-Alfil
Hola amigo, anteriormente comenté que tenia un error de tipografia; Nones 600, es 60. Vamos a otro concepto para entender mejor lo que se necesita calcular.
Interpretemos como periodo a la accion de Inhalar y Exhalar. La cantidad de sucesiones dentro de 60 segundos, la definiriamos como la frecuencia respiratoria. Hasta aqui seria todo facil, peronla mecanica respiratoria tiene otro punto mas a tener en cuenta: " el tiempo muerto", que basicamente es cuando completamos un periodo. Con esto podemos entonces definir que la inhalacion y exhalacion absorbe del tiempo total un 70% aproximadamente, y el 30% y un poco menos tambien, elntiempo muerto.
El calculo que se esta queriendobhacer, es para obtener los tiempos basicos (tiempo inhala - tiempo exhala - tiempo muerto) para determinada frecuencia respiratoria seleccionada. Esto seriabtan solo un pequeño avance en el proyecto, ya que esta señal despues iria con un sincronismo que lo ejerce el mismo cuerpo y se sensa con in sensor de presión. Te agradezco tu participación
Acá alguien implementa la misma formula
 
Última edición:
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.
 

torres.electronico

Well-known-Alfil
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: 2
  • 1589216903272.png
    1589216903272.png
    45.6 KB · Visitas: 1
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: 3
Ú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: 3
Ú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 :(
 
Arriba