desktop

Curso de programación de PIC en PICBasic Pro

Saludo cordial a todos los foreros, hoy solicito amablemente su colaboracion y es que se me presento el siguiente inconveniente con el temporizador de mi horno de secado UV, simplemente dejo de trabajar, cuando lo destape, era uno de esos temporizadores cuyo micro es de tipo gota, como quien dice...murio su sistema de temporizacion, por lo que me puse en la tarea de reemplazarlo y como no domino muy bien la programacion en pbp, use el buscador del foro y encontre que reyvilla y darkbytes, ya habian tratado el tema, incluso postearon unos programas con simulacion y todo y aunque no pude entender su programa, andan muy bien en proteus y seguramente tambien lo haran en fisico, especialmente el temporizador regresivo de darkbytes, esta bien completo y valga la oportunidad de agradecerles ya que personas como ellos me han dado su valiosa colaboracion en otras oportunidades y me han sacado de multiples dudas.
La cuestion es que quisiera realizar algo similar a los temporizadores regresivos de estos expertos, pero en lugar de emplear un lcd para indicar el tiempo que falta para terminar la temporizacion, habia pensado en emplear dos display de 7 segmentos de catodo comun, ya que proveen buna visualizacion en cualquier ambiente de luz y seguro que entendere como generar un algoritmo o una base de tiempo para lograr que el programa realize el conteo regresivo, que para mi caso me gustaria que comienze en 15 minutos y finalice en cero minutos, no es necesario que indique segundos, solo que vaya descendiendo minuto a minuto, tampoco sera necesario ningun ajuste, tan solo el boton de reset y el de start, este ultimo no deberia funcionar hasta tanto el contador llegue al final,esto con el proposito de no incrementar o desajustar el conteo accidentalmente.

Podria ser que el conteo quede almacenado en la eeprom del pic, por si el fluido de energia llegara a fallar y retorne instantes despues, aunque no es imprescindible, si me gustaria entender como se almacena dicho dato, porque no lo tengo claro.

En resumen lo que me propongo es: al presionar START (RA4) comienza la cuenta regresiva de los 15 minutos, el puerto b gestionaria el encendido de los display de catodo comun, (escogi estos para mayor comprension del programa, ya que se activan con high), RB7 se encarga de avisar cuando el tiempo de conteo ha llegado al final enviando puede ser un tono intermitente durante unos 3 segundos a un buzer, RA0 y RA1 polarizan un par de transistores para crear el efecto de la vision persistente (multiplexado), RA3 maneja un led de forma intermitente mientras el conteo se este efectuando, cuando llega a cero, este se apaga, RA2 maneja otro led que se mantiene encendido de manera fija mientras el conteo se efectua cuando llega a cero, se apaga (aqui debo colocar la etapa de potencia), por ultimo, el RESET me permite setear el programa a cero en cualquier momento del conteo
Al terminar el conteo debe permanecer el display en 00 hasta que la cuenta inicie con START y de ser posible guardar el conteo si se interrumpe el flujo de energia. START no debera funcionar de ningun modo mientras se realiza el conteo.
Como ven muchas de las prestaciones del hardware son tomadas del m,odelo de darkbytes.

No se como comenzar a realizar el programa en PBP, salvo la declaracion de algunas variable que sospecho no esten completas, mucho menos crear un algoritmo que me permita crear una base de tiempo para que funcione, no he realizado ningun ejercicio en el que involucre bases de tiempo que se vean reflejadas en 7 segmentos, tan solo algunos contadores que funcionan a base de pulsos de entrada, lo basico. Espero puedan darme luz sobre este ejercicio/proyecto que me propongo desarrollar para llegar a buen termino, mi intencion es entender y aprender ya que si solo quisiera reparar mi maquina, me habria bastado con montar el temporizador de reylilla o darkbytes o cualquier otro, que al ser de LCD se ven mucho mejor presentados y con mayores prestaciones y hacen la funcion que se necesita, pero quiero algo que pueda analizar y entender, no he encontardo este proyecto con 7 segmentos por ningun lado, seguro que mas de uno tiene interes en como se encara este programa.
Adjunto una simulacion de como deberian gestionarse los puertos. mil gracias por su tiempo
 

Adjuntos

  • timer 15m 7 segmentos.rar
    14.2 KB · Visitas: 141
Última edición:
Saludos amigos foreros, en mi busqueda sobre un temporizador regresivo de minutos que me muestre el tiempo en dos displays de 7 segmentos, me tope con el siguiente programa en basicpro para el pic 16f872 y entre las ventajas que plantea, esta la posibilidad de temporizar horas o minutos o segundos, con la simple combinacion de 2 jumper. El programa esta escrito en basicpro por lo que me fue comprensible y por lo que pude deducir que falta la inclusion de dos subrutinas para tene exito en la compilacion. pero me falta conocimientos para completar lo faltanteLo posteo para mirar la posibilidad de que alguien de ustedes me colabore, y mirar la forma de completar estas dos subrutinas faltantes ( visualiza display/ejecuta delay) , Como la explicacion del programa esta realizada en bloques en un archivo pdf y escrita en basic, me tome la libertad de organizarla segun mi poca experiencia en este lenguaje y almenos le veo logica en el ordenamiento que le di. Dejo a disposicion el programa y el esquematico ya que al no haber hecho la compilacion exitosa, no he diseñado la simulacion, pero eso no sera problema. Espero sus sugerencias...gracias muchachos
 

Adjuntos

  • TEMPO REGRESIVO.rar
    112.4 KB · Visitas: 182
Lo posteo para mirar la posibilidad de que alguien de ustedes me colabore, y mirar la forma de completar estas dos subrutinas faltantes ( visualiza display/ejecuta delay)... Espero sus sugerencias...gracias muchachos...

hola amigo inspector gadget, te cuento que hace un tiempo, yo hice un cronometro con un pic16f628A y 4 display de 7 segmentos utilizando la interrupcion por tmr0 y hasta el dia de hoy esta funcionando perfectamente... talvez te pueda servir la rutina de display que contiene mi codigo, podes verla aqui. https://www.forosdeelectronica.com/posts/573756/ saludos y espero te sea de utilidad ;)
 
hola hermano D@rkbytes te cuento que el programa que me diste me funciono.

Código:
Programa VAR Byte
led0 VAR portb.0
led1 VAR portb.1
led2 VAR portb.2
led3 VAR portb.3
led4 VAR portb.4

Inicio:
    If PORTA.0 = 0 Then
    Pause 250
    If Programa >4 Then Programa = 0
    Programa = Programa +1
    GoSub Programas
    EndIf
    GoTo Inicio

Programas:
    Select Case Programa
    Case 1
          HIGH led0
          pause 400
          low led0
          pause  400                                              ; Programa 1
    Case 2
         HIGH led1
          pause 400
          low led1
          pause  400                                                                 ; Programa 2
    Case 3
       HIGH led2
          pause 400
          low led2
          pause  400                                                        ; Programa 3
    Case 4
       HIGH led3
          pause 400
          low led3
          pause  400                                                                           ; Programa 4
    Case 5
         HIGH led4
          pause 400
          low led4
          pause  400                                                       ; Programa 5
    End Select
    Return

Pero ahora yo quiero que cada case se repita indefinidamente hasta que le de la nueva orden y cambie hacia el otro porque el problema es que cuando le pongo GOTO INICIO no me repite mas el case nada hermano dime si puedes ayudarme
 
Última edición por un moderador:
Sigo buascando como encarar el proyecto del temporizador regresivo de minutos con display de 7 segmentos. mil gracias por responder amigo Dario, mira, simule tu programa, pero tengo problemas ya que al cargar el hex, los displays encienden aleatoriamente y no puedo ingresar datos, no se a que se deba, ojala y puedas hecharle una revision y mirar que estoy haciendo mal, en verdad agradezco tu aporte.
 

Adjuntos

  • tempo dario.rar
    19.5 KB · Visitas: 107
hola hermano D@rkbytes te cuento que el programa que me diste me funciono.

Pero ahora yo quiero que cada case se repita indefinidamente hasta que le de la nueva orden y cambie hacia el otro porque el problema es que cuando le pongo GOTO INICIO no me repite mas el case nada hermano dime si puedes ayudarme
Mira si con este programa que adjunto consigues lo que quieres hacer.
Utilice interrupción por RB0 para hacer el conteo de selección del programa.

Suerte.
 

Adjuntos

  • Lamp_SCH.jpg
    Lamp_SCH.jpg
    51.3 KB · Visitas: 77
  • Lampara.rar
    9.6 KB · Visitas: 137
Sigo buascando como encarar el proyecto del temporizador regresivo de minutos con display de 7 segmentos. mil gracias por responder amigo Dario, mira, simule tu programa, pero tengo problemas ya que al cargar el hex, los displays encienden aleatoriamente y no puedo ingresar datos, no se a que se deba, ojala y puedas hecharle una revision y mirar que estoy haciendo mal, en verdad agradezco tu aporte.

hola amigo, lo que pasa es que en proteus no te va a funcionar... tenes que pasar directamente al diseño real. ami me hacia lo mismo en proteus, pero en la realidad funciona bien. a la rutina de visualizacion, la he utilizado en otros proyectos como el proyecto de visualizacion de los datos de un wii motion en el que me ayudo el amigo j2c juanka en este mismo thread un poco mas atras. aqui un video de ese proyecto... saludosss PD: (la variacion que ves en el ultimo digito de la derecha, es por la sensibilidad del giroscopo.)
 
Última edición:
Voy a montar tu cronometro inmediatamente Dario, ya te comentare como me fue y si tengo alguna duda sobre algun ajuste, espero puedas ayudarme para adaptarlo a mi necesidad personal, ya que tienes bastante experiencia con este lenguaje....mil gracias hombre!
 
hola amigos, verán estoy desarrollando un programa en pic basic y es para un pic16f877a para manejar un motor de paso a paso bipolar con pulsadores, (es para una maqueta de puerta de garaje) pero todo lo que logre hacer es uno automático y es este:


Código:
trisa=11111
trisb=0

izquierda:
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 100
   portb=%0001
  pause 100
   portb=%1000
  pause 100
   portb=%0010
  pause 100
   portb=%0100
  pause 5000
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 100
   portb=%0100
  pause 100
   portb=%0010
  pause 100
   portb=%1000
  pause 100
   portb=%0001
  pause 5000
 
goto izquierda:

end
este es automático y gira 4 vueltas hacia arriba y 4 vueltas hacia abajo, pero ahora me piden que le agregue pulsadores, uno de arranque y otro de regreso y uno de pause según en caso de error y otro de arranque para que vuelva a funcionar como . eso es todo lo que necesito para que maqueta de puerta de garaje funcione.

por favor espero puedan ayudarme.
 
Última edición por un moderador:
Buen día. Quiero saber si álguien me puede ayudar con un problema que tengo con la instrucción WRITE y READ en Pic Basic Pro.
Primeramente cargo valores en las direcciones de la EEPROM del del PIC 16F877A como sigue:

WRITE 00,"1"
WRITE 01,"2"
WRITE 02,"3"
WRITE 03,"4"

Posteriormente las cargo, en un arreglo de la variable X

READ 00,X[0]
READ 01,X[1]
READ 02,X[2]
READ 03,X[3]

Para por último, mostrarlas en un LCD 2x16

FOR CONTADOR=0 TO 3
LCDOUT X[CONTADOR]
NEXT CONTADOR

El problema es que me muestra los primeros tres valores correctamente (1,2,3), pero el cuarto digito (que debería ser un 4), me mustra un 3.

He tratado de muchas maneras por días y no obtengo nada. No se si a álguien le ha pasado algo similar.

Espero me puedan ayudar o direccionar a algún apartado del foro. Muchas gracias
 
Escribe este programa y ve los resultados...
Código:
Posc    VAR Byte
B0      VAR Byte
Datos   VAR Byte[3]

MainProgram:
    For B0 = 1 To 4
    Posc = B0-1
    Write Posc,B0
    Pause 10
    Next B0
    
    For B0 = 0 To 3
    Posc = B0
    Read Posc,Datos[B0]
    Pause 10
    Next B0
    
    LCDOut $FE,1," Lectura EEPROM"
    LCDOut $FE,$C0,#Datos[0],#Datos[1],#Datos[2],#Datos[3]
Saludos.
 
Última edición:
Muchas gracias D@rkbytes
El código que me muestras funciona perfecto. Ahora analizaré, qué es lo que pasa con mi código, tal vez el problema radique en la pausa que das despues de cada write/read.
Lo singular del problema que comento, es que en algunas ocasiones el programa funciona como lo mostré, y en otras no.
Compararé para estudiar que es lo que pasa.
Mil gracias.
 
saludos amigos, agradezco la colaboracion de Dario, he sacado muchas conclusiones sobre como realizar mi proyecto sobre un temporizador regresivo de 15 minutos a cero, junto con los post de otros foreros ya voy entendiendo muchisimo, si bien para muchos en este foro este proyecto seria facil,para uno como aprendiz cada que obtiene un resultado positivo, es motivo de satisfaccion, vamos dando un paso a la vez. Cualquier duda que se me presente espero me puedan colaborar, a proposito me podrian comentar sobre un libro que mecatrodatos pensaba publicar sobre pbp? Esto lo lei muchisimas paginas atras, quisiera que me pudieran informar, muchas gracias de nuevo.
 
El nombre del puerto en los PIC12 se llama GPIO
GPIO.0
GPIO.1
GPIO.2
Etc.
Ó GPIO = Valor ; (%Binario, Decimal y $Hexadecimal)
Para la configuración de entradas y salidas, es TRISIO
TRISIO.0
TRISIO.1
TRISIO.2
Etc.
Ó TRISIO = Valor ; (%Binario, Decimal y $Hexadecimal)

En Proteus te sirve igual el 12C509A, la letra F (Flash) significa que el PIC es reprogramable.
Los PIC con letra C, son PIC's OTP (One Time Programmable) solo los puedes grabar una vez.

Suerte.

Y siquiera realizar un proyecto cual me recomendarias?
 
Y si quisiera realizar un proyecto cual me recomendarías?
Si quieres hacer un proyecto con el 12F508/9, tiene que ser algo muy sencillo.
Ese PIC tiene poca RAM, pocos pines, no tiene ADC y no cuenta con EEPROM.
Podrías hacer PWM sobre un LED, algún estrobo, un circuito musical, generar DTM, ó comunicación serial.

No sé, proyectos que no requieran el uso de varios pines y que usen poca RAM.
Tu creatividad e imaginación son las que te guiaran.

Suerte.
 
saludos amigos, agradezco la colaboración de D@rio, he sacado muchas conclusiones sobre como realizar mi proyecto sobre un temporizador regresivo de 15 minutos a cero, junto con los post de otros foreros ya voy entendiendo muchísimo, si bien para muchos en este foro este proyecto seria fácil,para uno como aprendiz cada que obtiene un resultado positivo, es motivo de satisfacción, vamos dando un paso a la vez. Cualquier duda que se me presente espero me puedan colaborar, a propósito me podrían comentar sobre un libro que mecatrodatos pensaba publicar sobre pbp? Esto lo leí muchísimas paginas atrás, quisiera que me pudieran informar, muchas gracias de nuevo.

hola.
aquí te pongo un ejemplo de un temporizador que hice hace algún tiempo con la ayuda de todos en este foro y funciono muy bien, este es el código:

Código:
;********************************** 
;teporizador en minutos y segundos             
;con pic 16f84a                                       
;**********************************
;CONFIGURACIÓN PIC
@ DEVICE pic16F84A
@ DEVICE WDT_ON              
@ DEVICE PWRT_ON                   
@ DEVICE PROTECT_OFF      
@ DEVICE xt_osc  
define osc 4 
;REGISTROS LCD
Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

Symbol Minutos = PORTA.1    ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2   ; AJUSTE SEGUNDOS
symbol Out = PORTB.7        ; SALIDA CONTROL 
symbol START = PORTA.3      ; INICIO CONTEO
SYMBOL STOP_ = PORTB.6      ; DETIENE CONTEO

;VARIABLES
Pulsos VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte
CLEAR
 
TRISB = %01000000 
TRISA = %00011111 

PAUSE 500 

Mts = 03 'aquí cuadramos el tiempo en que iniciara
Sds = 00
pulsos = 0

OPTION_REG = %00000101 ; prescaler = 64
On INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRAMA
LOOP:
;BOTÓN START
IF START = 0 THEN ; si el boton start es presionado ejecuta lo siguiente
TMR0 = 0 ;Inicializa registro TMR0 
INTCON = $A0 ;habilita el  timer interrupt
Disp = 1 ; habilita  display
Gosub Retardo
ENDIF 

;BOTÓN STOP
IF STOP_ = 0 THEN ; si el boton stop es presionado ejecuta lo siguiente
INTCON = 0 ;desabilita el  timer 
Disp = 1 ; habilita  display
Gosub Retardo
ENDIF 

;BOTÓN PROGRAMAR LOS MINUTOS
IF Minutos = 0 THEN
Mts = Mts - 1
Gosub retardo
ENDIF

;BOTÓN PROGRAMAR LOS SEGUNDOS
if Segundos = 0 then
Sds = Sds - 1
Gosub retardo
ENDIF

'******************************
IF Mts = 60 AND Sds = 60 THEN'* 
out = 1                      '*
gosub MENSAJE_FIN            '*
else                         '*
out = 0                      '*
ENDIF                        '*
'******************************
IF Disp = 1 THEN
LCDOUT $FE, 1
LCDOUT $FE, 2
Lcdout "Tiempo de espera "  
LCDOUT $FE,$C4,DEC2 Mts, ":",DEC2 Sds
LcdOut $fe,$C16, 0
LCDOUT $fe,$40,$00,$0A,$0A,$00,$04,$11,$0E,$00 'aqui tenemos la carita feliz :)
Disp = 0
ENDIF 
                         
GOTO LOOP

;ANTIRREBOTE
Retardo:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN

;EJECUCION DE UN SEGUNDO
DISABLE
ISR:
IF Mts < 0 OR Sds > 0 THEN 'OJO sí se cambia esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif

;TIEMPO
Retro:
pulsos = 0

IF Sds = 0 AND Mts => 0 then
Mts = Mts - 1
Sds = 61
endif
if mts > 60 then mts = 60       
if mts = 0 then mts = 0


'ALARMA
IF Mts = 60 AND Sds = 60 THEN
pulsos = pulsos
INTCON = 0 ;desabilita el  timer 
else
TMR0 = 0 ;Inicializa registro TMR0 
INTCON = $A0 ;habilita el  timer interrupt
Disp = 1 ; habilita  display 
Sds = Sds - 1
endif                                                
return

mensaje_fin:
LCDOUT $FE, 2
Lcdout        " <<FINALIZADO>> "  
LCDOUT $FE,$C1," PULSE  CLEAR"
return

NoUpdate:
INTCON.2 = 0 
Resume                                                                              
ENABLE 
END
espero te sirva, sí observas el inicio esta cuadrado para iniciar en 3 minutos puedes cuadrarlo como quieras y sí pulsas varias veces el botón de minutos puedes programar hasta una hora, suerte con tu proyecto:apreton:
posdata me gustan más los LCD que los display de led ahí me disculpas...
 
Última edición por un moderador:
Hola amigos una consulta puedo hacer un juego de luces con el pic 16f628A, utilizando sus 2 puertos A y B osea todos sus pines (16), lo he hecho con el puerto B, pero al utilizar los 2 puertos me da problemas en la simulacion en proteus, estoy apagando el boden, el oscilador, el reset etc....
Saludos
 
Hola amigos una consulta puedo hacer un juego de luces con el pic 16f628A, utilizando sus 2 puertos A y B osea todos sus pines (16), lo he hecho con el puerto B, pero al utilizar los 2 puertos me da problemas en la simulación en proteus, estoy apagando el boden, el oscilador, el reset etc....
Saludos
Tienes que leer la hoja de datos para que te dés cuenta porqué no te funciona bien cuando usas el puerto A.
El BODEN (Ahora BOREN ó Brown-Out Reset) solo es para generar un reset por bajo voltaje de alimentación.
Si no utilizas el oscilador interno, pierdes los pines RA6 y RA7.
El pin RA4 es Open Drain (Drenador abierto).
Y el pin RA5 (MCLR/Vpp) solo funciona como entrada. ¿Ahora comprendes por qué no te funciona?

Saludos.
 
Tienes que leer la hoja de datos para que te dés cuenta porqué no te funciona bien cuando usas el puerto A.
El BODEN (Ahora BOREN ó Brown-Out Reset) solo es para generar un reset por bajo voltaje de alimentación.
Si no utilizas el oscilador interno, pierdes los pines RA6 y RA7.
El pin RA4 es Open Drain (Drenador abierto).
Y el pin RA5 (MCLR/Vpp) solo funciona como entrada. ¿Ahora comprendes por qué no te funciona?

Saludos.

Gracias por responder, ok a lo que te entendi solo puedo usar 15 de los 16 pines para salida, pq el RA5 es solo entrada, estoy utilizando el oscilador interno por lo que los pines RA6 y RA7, deberian funcionar sin embargo no lo hacen, (El pin RA4 le coloque una R pull up para que funcione).
como le hago???
 
Atrás
Arriba