Curso de programación de PIC en PICBasic Pro

Buenas amigos tenia tiempo que no pasaba por el foro, hace unos días me puse a recordar un poco de picbasic ya que me la paso mas metido con programación Arduino. El caso es que estoy haciendo un monitor cardíaco para medir las pulsaciones, estaba pensando usar el comando COUNT pero no conseguía los datos correctos en el manejo de dicha sentencia, así que me dispuse a hacer un sistema como flanco.

Voy a empezar por pasos en la programacion:

Código:
DEFINE OSC 4                      ;DEFINCION OSCILADOR
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB       ;DEFINICION DE LOS PINES DEL PIC AL LCD
DEFINE LCD_EBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3

TRISB = 0     ;PUERTO B COMO SALIDA
PORTB = 0    ;INICIA EL PUERTO B EN CERO

DATOS VAR PORTB.0    ;PIN CON EL NOMBRE DATO, POR DONDE SE LEERÁN LOS PULSOS
PULSOS VAR BYTE       ;VARIABLE DONDE SE GUARDARAN LOS PULSOS OBTENIDOS

LCDOUT $FE,1          ;LIMPIAR LCD
PAUSE 500              ;RETARDO


INICIO:                                                ;LOOP CON NOMBRE INICIO
LCDOUT $FE,2,"PULSOS = ",DEC2 PULSOS   ;MOSTRAR RESULTADO EN LA LCD
IF DATOS = 1 THEN                                ;SI DATOS ENTRA EN ESTADO 1 ENTONCES
LCDOUT $FE,1,"PULSOS = ",DEC2 PULSOS   ;MOSTRAR RESULTADO EN LA LCD 
PULSOS = PULSOS + 1                            ;SUMA "1" A LA VARIABLE PULSOS
ESPACIO:                                             ;LOOP CON NOMBRE ESPACIO
IF DATOS = 1 THEN ESPACIO     ;SI EL PIN DATOS PERMANECE EN UNO, NO HACE NADA
ENDIF                                    ;FINALIZAR SI
GOTO INICIO                           ;IR A INICIO

END                       ;FIN DEL PROGRAMA


Bueno como puede ver la lógica del programa se basa en, que al cambiar a estado 1 el pin dato se suma la variable pulsos y esta no seguirá sumando hasta no volver a 0 y luego iniciar otra vez, así conseguí leer la entrada de pulsos en tiempo real sin importar la velocidad con que llegan los pulsos al pin DATOS.

El problema es que quiero que, a medida que se cuente los pulsos por el pin DATOS, se pueda mostrar en la LCD un conteo de 60 segundos al mismo tiempo, que sea independiente uno del otro, he intentado que el programa me trate de realizar ambas funciones al mismo tiempo y no puedo, tiene retardos o se cuelga, ¿hay que usar interrupciones? he intentado con el manual pbp que aparece unos ejemplos y no me da tampoco.

Les voy a dejar el diagrama que detecta los pulsos y el diagrama de proteus con el archivo HEX, ojala me puedan ayudar y me haya hecho explicar bien.
 

Adjuntos

  • MONITOR CARDIACO.rar
    7.9 KB · Visitas: 68
  • Monitor Cardiaco.jpg
    Monitor Cardiaco.jpg
    33.2 KB · Visitas: 47
Última edición por un moderador:
Hola a todos.
De nuevo ando por estos lados molestándolos a ver sí me pueden ayudar.
He estado haciendo pruebas de matrices de leds y tengo un pequeño problema con un código para una de 8x24 no se por que no logro que los registros 74hc164 colocados en cascada funcionen como debe ser pues en lugar de ir añadiendo las letras que siguen atrasan la información un bit por cada registro y en cada 8 columnas se ve lo mismo aquí les subo los archivos para que vean lo que quiero decir, y a ver sí me pueden ayudar a corregir los errores que tenga en el código, además en el puerto a3 me sale un dato invertido y tuve que poner un inversor que quiero quitar pero no se como invertir este dato en el código les agradezco de antemano su colaboración, muchas gracias por su paciecia
 

Adjuntos

  • prueba matriz 8x24 16f88.rar
    25.7 KB · Visitas: 76
Última edición:
Hola a todos.
De nuevo ando por estos lados molestándolos a ver sí me pueden ayudar.
He estado haciendo pruebas de matrices de leds y tengo un pequeño problema con un código para una de 8x24 no se por que no logro que los registros 74hc164 colocados en cascada funcionen como debe ser pues en lugar de ir añadiendo las letras que siguen atrasan la información un bit por cada registro y en cada 8 columnas se ve lo mismo aquí les subo los archivos para que vean lo que quiero decir, y a ver sí me pueden ayudar a corregir los errores que tenga en el código, además en el puerto a3 me sale un dato invertido y tuve que poner un inversor que quiero quitar pero no se como invertir este dato en el código les agradezco de antemano su colaboración, muchas gracias por su paciecia

Hola compañero rápidamente noto que estas programando el pic a 4Mhz y lo estas simulando a 20Mhz no revise de momento otra cosa prueba ajustando eso primero y me avisas saludos
 
Hola compañero rápidamente noto que estas programando el pic a 4Mhz y lo estas simulando a 20Mhz no revise de momento otra cosa prueba ajustando eso primero y me avisas saludos

Hola Reyvilla. Gracias por mirar mi proyecto.
Si tienes razón esto lo hice a propósito para ver pasar más rápido el mensaje pues no se como alterar la velocidad en el programa y al simularlo o en el protoboard a 4 MHz corre lentisimo y como dije antes no se por que no funcionan bien los registros y en protoboard sucede exactamente lo mismo agradezco muchísimo sí me puedes ayudar:apreton:
 
Última edición:
Hola Reyvilla. Gracias por mirar mi proyecto.
Si tienes razón esto lo hice a propósito para ver pasar más rápido el mensaje pues no se como alterar la velocidad en el programa y al simularlo o en el protoboard a 4 MHz corre lentisimo y como dije antes no se por que no funcionan bien los registros y en protoboard sucede exactamente lo mismo agradezco muchísimo sí me puedes ayudar:apreton:

Hola de nuevo, revisando el codigo me doy cuenta que esta echo para una matrix e 8x8 por lo cual si tomas en cuenta que para una matriz de 24 puntos horizontales lo cuales vas a ir activando los led verticales según sea necesario para ir armando la imagen. Que sucede tu lo que haces en el código es un recorrido de 8 horizontales siempre por lo cual lo que sucede es que se va repitiendo en cada registro el mismo dato del registro anterior por lo cual se muestra la misma imagen en cada una de las matrices de 8x8. Ahora lo que se debe hacer es expandir esos 8 pulsos de reloj a 24. Tienes que tomar en cuenta lo siguiente:

Para tu primera duda lo de la compuerta inversora, lo que me encanta de los circuitos lógicos es eso mismo que hay que ser muy lógico en su funcionamiento para saber diseñar un circuito en tu caso lo conectaste en el clock. Lo cual si solo funciona con esa compuerta lo que te dice esa inversora es que inviertas la lógica del reloj en el código y listo.


Ahora lo de los tiempos y el bit de desplazamiento, te voy hacer una breve explicación general de como funciona toda la matriz.

Tenemos 24 columnas y 8 filas.
Las columnas están fijadas a los registros por ser mayoría y las filas a un puerto de pic.

Con estos datos puedes concluir lo siguiente viéndolo de modo programación lógica para que se sea mas fácil de entender.

En un esta matriz tienes un total de 24 tiempos o estados. Donde en cada estado podemos a su vez tener una combinación de 8 bits. Osea esto te dice que es casi inimaginable las
combinaciones que puedes tener allí entre filas y columnas.

Ahora bien sabiendo esto como es tiene que ser la arquitectura o algoritmo del código para que podamos usar cualquier combinación.

Primero determinar los tiempos, los voy llamar tiempo de led fila "TLF" y tiempo de led columna "TLC" mas el tiempo de desplazamiento o clock "Tclock" de los registros.
Adicional a eso como los datos que estamos enviando a los registros duran muy poco
no tendríamos tiempo de ver nada en la matriz ya que pasaría muy rápido. entonces para eso vamos a utilizar un repetidor que voy a llamar tiempo de repetición "TR". Ahora jugando con estos tiempos podemos aprender y lograr desplazar una imagen y poder verla como queramos.

Entonces tenemos:
tiempo de led fila "TLF"
tiempo de led columna "TLC"
tiempo de desplazamiento o clock "Tclock"
tiempo de repetición "TR"

Ahora tiempo de ejecución:
Tiempo1:
Y activar la columna 1.
Y en este punto aplicas TLC

Tiempo2:
Enviar la combinación de los 8 bits por el puerto del pic.
Y en este punto aplicas "TLF"

Tiempo12: Aquí se determina cuantas veces se va a mostrar el mismo dato para poder verlo.
Y en este punto aplicas "TR"

Tiempo3: Para desplazar dato.
Y en este punto aplicas "Tclock"

Y vas desplazando los bit del dato y repitiendo el mismo proceso. Ahora pareciera que TLC Y TLF son dos tiempos de retardos distintos, en realidad es uno solo tiempo ya que para encender el del deben combinarse ambas activaciones tanto horizontal como vertical.

En resumen:
Cargas el dato en los registros con Tclock y activas los 8 bit en los pines del pic
esperas con TLC y TLF.

Repites n veces esto hasta sincronizarlo que puedas verlo bien.
Luego cargas el siguiente dato y empiezas de nuevo.

Datos:
Invierte la logica del clock
Trabaja a 20Mhz
Y regula los tiempos
Avísame cualquier cosa yo igual voy a estar chequeando que otra cosa puede haber en el código saludoss
 
Me estoy iniciando en Programación P.B.P.
Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.



Estoy Practicando con el libro de microcontroladores 16f628a y el pic16f877a.
También no puedo convertir la salida del puerto A, hago el ejemplo del libro y no funcionan algunas luces del puerto A, se mantiene encendido.
Todo en lenguaje PICBasic Pro.
 
Última edición por un moderador:
Me estoy iniciando en Programación P.B.P.
Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.



Estoy Practicando con el libro de microcontroladores 16f628a y el pic16f877a.
También no puedo convertir la salida del puerto A, hago el ejemplo del libro y no funcionan algunas luces del puerto A, se mantiene encendido.
Todo en lenguaje PICBasic Pro.

hola compañero si colocas tu código y un diagrama si es en proteus mejor, puedo ayudarte saudos
 
Me estoy iniciando en Programación P.B.P.
Necesito ayuda con la instrucción SELECT CASE, información más detallada que en los libros y ejemplos fáciles de entender.



Estoy Practicando con el libro de microcontroladores 16f628a y el pic16f877a.
También no puedo convertir la salida del puerto A, hago el ejemplo del libro y no funcionan algunas luces del puerto A, se mantiene encendido.
Todo en lenguaje PICBasic Pro.
Usa la opción de Buscar en este Tema o la Búsqueda Avanzada para encontrar posts que contengan ejemplos.
Te podría sugerir que uses el Manual de PicBasic Pro en Castellano, pero no aparece ayuda para SELECT CASE
Es que en realidad es muy sencillo su uso y no deberías tener complicación para aplicarla.

En la ayuda de MicroCode Studio viene explicado el uso de SELECT CASE

Saludos.
 
Hola de nuevo, revisando el codigo me doy cuenta que esta echo para una matrix de 8x8 por lo cual si tomas en cuenta que para una matriz de 24 puntos horizontales lo cuales vas a ir activando los led verticales según sea necesario para ir armando la imagen.

hermano muchas muchas gracias eres un mago:aplauso:, seguí tus instrucciones y funciono perfectamente pero no logro que el mensaje se desplace más rápido por fa dime como lo acelero:apreton:
 

Adjuntos

  • prueba2 matriz 8x24 16f88.rar
    25.6 KB · Visitas: 84
Amigos buenas, tengo una pregunta que quisiera que me puedan ayudar, la verdad no se si estoy en el foro correcto, pido disculpas de antemano, si así fuese. Estaba realizando un proyecto y en el programa al compilarlo, me ha salido un error, el cual hace referencia que me he pasado de la o las paginas del pic (16F877A), e investigado y se que hay un registro llamado PCLATH; he leido ya mucha teoría referente a ese registro, pero no se como aplicarlo en el programa como tal. Por favor necesito su gran ayuda.
 
Amigos buenas, tengo una pregunta que quisiera que me puedan ayudar, la verdad no se si estoy en el foro correcto, pido disculpas de antemano, si así fuese. Estaba realizando un proyecto y en el programa al compilarlo, me ha salido un error, el cual hace referencia que me he pasado de la o las paginas del pic (16F877A), e investigado y se que hay un registro llamado PCLATH; he leido ya mucha teoría referente a ese registro, pero no se como aplicarlo en el programa como tal. Por favor necesito su gran ayuda.
Con PICBasic Pro, no debes preocuparte por ese mensaje, es una advertencia del compilador cuando el programa es muy grande y se ha cambiado de página, pero PBP se encarga de que todo marche bien.

En versiones del compilador PBP como la 2.60X no conozco forma de solucionar esta advertencia, pero en PBP3 si se puede suprimir usando @ errorlevel -306 para que el compilador no mande ese mensaje.

Saludos.
 
Con PICBasic Pro, no debes preocuparte por ese mensaje, es una advertencia del compilador cuando el programa es muy grande y se ha cambiado de página, pero PBP se encarga de que todo marche bien.

En versiones del compilador PBP como la 2.60X no conozco forma de solucionar esta advertencia, pero en PBP3 si se puede suprimir usando @ errorlevel -306 para que el compilador no mande ese mensaje.

Saludos.

Estimado amigo, muchas gracias por tu respuesta, pero la duda que tengo esque por este mensaje que sale al parecer no me deja modificar nada en el programa, ejem: si quiero agregar una nueva salida para que active un led, al momento de grabar en el pickit 2 no surge efecto, como digo al parecer no m deja hacer ninguna modificacion mientras aparezca este mensaje; con todo voy a probar con el fuse que me dejas para ver si por ahi es la solución.

saludos
 
Estimado amigo, muchas gracias por tu respuesta, pero la duda que tengo esque por este mensaje que sale al parecer no me deja modificar nada en el programa, ejem: si quiero agregar una nueva salida para que active un led, al momento de grabar en el pickit 2 no surge efecto, como digo al parecer no m deja hacer ninguna modificacion mientras aparezca este mensaje; con todo voy a probar con el fuse que me dejas para ver si por ahi es la solución.

saludos

Hola pienso que lo mejor es una imagen del error un print pant, así poder ver el error exacto ya que a mi me ha dado el mismo error y lo e solucionado de diferentes formas abecés no me deja hacer nada y es por una variable o un registro mal configurado y otras no pasa nada, lo otro seria que colocaras el código para probarlo en otros pc haber si es cuestión de software...saludosss
 
Una Sugerencia se deberia hacer un compilado de todos los proyectos con sus respectivos nombres y archivos rar.
Hacer una clase de Tutorial, hacerlo de acuerdo a la complejidad de los proyectos
 
TECLADO 6X6 CON DISPLAY DE 7 SEGMENTOS Y SUMADOR

Hola buenas tardes:

Ojala me pudieran ayudar he realizado con exito, al menos en la simulacion, un teclado de 6x6 con dos display de 7 segmentos y ademas vaya sumando el valor de cada tecla.
El unico problema que tengo es que quisiera que en lugar de que los switches del teclado fueran momentaneos, fueran permanentes , es decir, que si dejo presionado porejemplo la tecla 1 y despues sin soltar presiono la tecla 2, me de la suma de 3 sin necesidad de soltar la tecla 1.

Cabe mencionar que es para autoamizar un sistema de los juegos de canicas que existen en las ferias, donde la canica dejaria presionada cada tecla.
Anexo los archivos y agradeceria mucho su ayuda.

La distribucion y valor de lasteclas es el siguiente

1 2 3 4 5 6
6 5 4 3 2 1
1 2 3 4 5 6
6 5 4 3 2 1
1 2 3 4 5 6
6 5 4 3 2 1


Saludos

codigo:

Código:
'****************************************************************
trisb = %00111111
trisc = 0
trisd = 0
portb = 0
portc = 0
portd = 0
cuenta var byte
cuentabcd var byte
nu var byte
nu1 var byte
nu2 var byte
nu3 var byte
nu4 var byte
nu5 var byte
nu6 var byte
nu7 var byte
nu8 var byte
nu9 var byte
nu10 var byte
nu11 var byte
nu12 var byte
nu13 var byte
nu14 var byte
nu15 var byte
nu16 var byte
nu17 var byte
nu18 var byte
nu19 var byte
nu20 var byte
nu21 var byte
nu22 var byte
nu23 var byte
nu24 var byte
nu25 var byte
nu26 var byte
nu27 var byte
nu28 var byte
nu29 var byte
nu30 var byte
nu31 var byte
nu32 var byte
nu33 var byte
nu34 var byte
nu35 var byte
nu36 var byte

                           

inicio:

'primera fila
portd = %00000001
if portb = %00000000 then nu = 0
if portb = %00000001 then nu1 = 1
if portb = %00000010 then nu2 = 2
if portb = %00000100 then nu3 = 3
if portb = %00001000 then nu4 = 4
if portb = %00010000 then nu5 = 5
if portb = %00100000 then nu6 = 6

pause 10
'segunda fila
portd = %00000010
if portb = %00000001 then nu7 = 6
if portb = %00000010 then nu8 = 5
if portb = %00000100 then nu9 = 4
if portb = %00001000 then nu10 = 3
if portb = %00010000 then nu11 = 2
if portb = %00100000 then nu12 = 1
pause 10
'tercera fila
portd = %00000100
if portb = %00000001 then nu13 = 1
if portb = %00000010 then nu14 = 2
if portb = %00000100 then nu15 = 3
if portb = %00001000 then nu16 = 4
if portb = %00010000 then nu17 = 5
if portb = %00100000 then nu18 = 6
pause 10
'cuarta fila
portd = %00001000
if portb = %00000001 then nu19 = 6
if portb = %00000010 then nu20 = 5
if portb = %00000100 then nu21 = 4
if portb = %00001000 then nu22 = 3
if portb = %00010000 then nu23 = 2
if portb = %00100000 then nu24 = 1
pause 10
'quinta fila
portd = %00010000
if portb = %00000001 then nu25 = 1
if portb = %00000010 then nu26 = 2
if portb = %00000100 then nu27 = 3
if portb = %00001000 then nu28 = 4
if portb = %00010000 then nu29 = 5
if portb = %00100000 then nu30 = 6
pause 10
'sexta fila
portd = %00100000
if portb = %00000001 then nu31 = 6
if portb = %00000010 then nu32 = 5
if portb = %00000100 then nu33 = 4
if portb = %00001000 then nu34 = 3
if portb = %00010000 then nu35 = 2
if portb = %00100000 then nu36 = 1
pause 10

cuenta = nu+nu1+nu2+nu3+nu4+nu5+nu6+nu7+nu8+nu9+nu10+nu11+nu12+nu13+nu14+nu15+nu16+nu17+nu18+nu19+nu20+nu21+nu22+nu23+nu24+nu25+nu26+nu27+nu28+nu29+nu30+nu31+nu32+nu33+nu34+nu35+nu36

cuentabcd = ((cuenta / 10) << 4) + (cuenta // 10)

portc = cuentabcd

Ya por ultimo me podrian dar la configuracion de este pic ya que al momento de programarlo en el MASTER PROG me sale esta leyenda
AVISO FALTAN LOS BITS DE CONFIGURACION EN EL ARCHIVO HEX
 

Adjuntos

  • TECLADO MAT 6X6.rar
    80.5 KB · Visitas: 73
Última edición:
hola a todos
de nuevo por aquí molestandoles a ver sí alguien me puede decir de donde me sale este mensaje en el programador es primera vez que me aparece y no logro hacer lo que me pide, reformando la configuración en el programa en el microcode tampoco hay cambio en el pickit, aquí les dejo 2 imágenes para que vean de que estoy hablando, les agradezco mucho su ayuda y su paciencia:apreton:
 

Adjuntos

  • pickit2.jpg
    pickit2.jpg
    141.1 KB · Visitas: 62
  • pickit2 2.jpg
    pickit2 2.jpg
    140.9 KB · Visitas: 48
El formato para la palabra de configuración en el PIC16F88 es de esta forma...

;*******************************************************************************
@ DEVICE PIC16F88
@ DEVICE HS_OSC, WDT_OFF, PWRT_ON, MCLR_ON, BOD_OFF, LVP_OFF
@ DEVICE2 IESO_OFF, FCMEN_OFF

;*******************************************************************************
DEFINE OSC 20
;*******************************************************************************

Prueba incluyendo de esta forma la palabra de configuración en tu programa.

Saludos.
 
La forma en que yo lo hago es copiando directamente del archivo .INC los fuses correspondientes al pic y luego lo voy modificando según sea lo que necesite. En este caso de la matrix yo lo coloque así.

@ DEVICE PIC16F88
@ DEVICE XT_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE WRT_OFF
@ DEVICE DEBUG_OFF
@ DEVICE CCPMX_OFF
@ DEVICE PROTECT_OFF
 
La forma en que yo lo hago es copiando directamente del archivo .INC los fuses correspondientes al pic y luego lo voy modificando según sea lo que necesite. En este caso de la matrix yo lo coloque así.

@ DEVICE PIC16F88
@ DEVICE XT_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE WRT_OFF
@ DEVICE DEBUG_OFF
@ DEVICE CCPMX_OFF
@ DEVICE PROTECT_OFF
Este PIC tiene dos direcciones para la palabra de configuración: 0x2007 y 0x2008
En la dirección 0x2007 (CONFIG1) se establecen los fuses que muestras, pero en 0x2008 se establecen estos otros:
CONFIG2:
FCMEN = Fail-Safe Clock Monitor Enable bit
IESO = Internal External Switchover bit

Solo se establecen los primeros 2 bits (0 y 1) de los 13 bits del registro CONFIG2.
Por eso los incluí usando @ DEVICE2

No ocurrirá problema en nuestro programa si estos bits al no ser configurados quedan activos, mientras no falle el oscilador principal, pero si llegara a fallar se activaría el oscilador interno a la frecuencia que haya sido configurado en el registro OSCCON que por default será de 4MHz.
Y esto podría prestarse a confusiones sobre los tiempos de trabajo en el programa si se usa otra frecuencia.

Por aquí expuse unos ejemplos demostrando el funcionamiento del sistema "Fail-Safe Clock Monitor"

Saludos.
 
Última edición:
Atrás
Arriba