Curso de programación de PIC en PICBasic Pro

Buenas noches amigos de Foros de electronica, si me estoy metiendo en un tema que ya se a tocado en esta pagina, por favor me disculpan y a la vez ruego que me deriven a ese tema, es que no se la verdad con que nombre encontrar el problema que quiero solucionar.

Estoy programando en pic basic pro y quiero darle RUN a un programa, que anteriormente eh configurado dos variables con tiempos diferentes, como por ejemplo:

tiempo 1 = 5min 10 seg
tiempo 2 = 10 min 20seg

y cuando le doy RUN, los tiempos empiezan a descernder, y cuando el tiempo1 llega a 0, el tiempo 2 continua hasta llegar a cero tambien.

eh hecho una pruebas y lo que me pasa es que cuando eñ primer timpo llega a cero el segundo tiempo sigue bajando y el primer tiempo baja a 59:59 y no se posiciona en 0.

espero no molestar con mi pregunta tonta.

gracias
 
Ya encontré la solución de el por que decrementa de 0 a 55,54,53 y no como debe ser: 0,59,58,57,:
es en una comparación :
minut=minut-1
if minut = 255 then mint = 59
en el 255 esta la clave. Gracias.
Ahora estoy en cómo hacer para que el primer tiempo cuando llega a cero se quede estático y el otro tiempo 2 Llegue hasta cero también.

Pude avanzar, pero no logro detener en cero el primer tiempo, donde estará mi error verdad?. Allí dejo el programa pbp e isis esquema. Gracias
 

Adjuntos

  • preguntas.rar
    8.8 KB · Visitas: 16
Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.

Nota: Por ser simulación, no usé resistencias para los displays.

En el ejemplo que envias, me esta dando problemas al momento de trasladar tu ejemplo a mi pic 18f2550.

Sobre todo por esta línea en negrita.

Display:
x Var Byte
Index Var Byte
Numero Var Byte

For x = 0 To 3
Index = R:LOL:ata[x] -48 ; Convertir el dato a número.
; Obtener el número correspondiente.
LookUp Index,[63,6,91,79,102,109,124,7,127,103], Numero
; Enviar cada número a los registros de desplazamiento
ShiftOut pin_Data, pin_Clock, MSBFIRST, [Numero]
Next x
 
No mencionas qué problema, pero supongo que todo se debe a las configuraciones del PIC18F2550.
Este PIC tiene algunos registros especiales que sin los conocimientos adecuados el programa no funcionará correctamente.
18F2550 y 4 CD4094.jpg
Adjunto el mismo programa pero modificado para el PIC18F2550 (FOsc = INTOSC @ 8 MHz.)
 

Adjuntos

  • 18F2550 CD4094 DSP 7 segs.rar
    23.5 KB · Visitas: 21
Hola, como andan? Tengo una consulta... Estoy haciendo unos calculos de frecuencia respiratoria y me estan fallando las pocas matematicas basica que me permite PBP...
La formula original es:

Enriquecido (Código BB):
;ie=Inhalacion y Exhalacion
;delay_i_e = retardo de inhalacion y exhalacion
;delay_pausa=Tiempo muerto entre periodo de Inhalacion y Exhalacion

periodo = 600/frecuencia   ; 10 minimo - 30 maximo
i_e = periodo *0,6   
delay_i_e=i_e * 1000/100 ; me entrega el valor en milisegundos
pausa=periodo *0, 4           
delay_pausa=pausa * 1000 / 100  ; me entrega el valor en milisegundos

Como no puedo trabajar directamente con esas lineas, opere multiplicando por 10 y luego dividiendo de esta forma:

Enriquecido (Código BB):
;ie=Inhalacion y Exhalacion
;delay_i_e = retardo de inhalacion y exhalacion
;delay_pausa=Tiempo muerto entre periodo de Inhalacion y Exhalacion

periodo = 600/frecuencia   ; 10 minimo - 30 maximo
i_e = periodo *6   
delay_i_e=i_e * 10000/1000 ; me entrega el valor en milisegundos
pausa=periodo *4           
delay_pausa=pausa * 10000 / 1000  ; me entrega el valor en milisegundos

El tema esta en que no me da un resultado estable para hacer los tiempos de los periodos... esta desbordando? Alguien ve el error aqui? se les ocurre aguna manera de hacerlo.

Tengo un error... Es 60/frecuencia....
Igual no me funciona
 
Última edición por un moderador:
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.
 
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:
Atrás
Arriba