Curso de programación de PIC en PICBasic Pro

Hola amigos primero que todo quiero decirles que ya e intentado resolverlo por mi cuenta pero realmente no se como hacerlo lo que quiero saber es como puedo en un pic16f628a con un pulsador ejecutar barias tareas por ejemplo cuando lo pulso una ves ejecuta una tarea cuando lo pulso de nuevo ejecuta otra asi yo estube intentando con el comando on interupt pero no me funciono ojala que puedan ayudarme gracias de ante mano.
Puedes incrementar el valor de una variable y luego usar Select Case

Por ejemplo para 5 programas...
Código:
Programa VAR Byte

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
    ; Programa 1
    Case 2
    ; Programa 2
    Case 3
    ; Programa 3
    Case 4
    ; Programa 4
    Case 5
    ; Programa 5
    End Select
    Return
Suerte.
 
hermano te agradesco la ayuda pero lo que yo quiero hacer es mas o menos lo siguinte, yo quiero hacer una lampara que funciona con 3 led y lo que quiero es que cada ves que yo precione un boton yo pueda programar tareas como encender 1 y apagar otro o y cuendo precione de nuevo realizar otra tarea y asi no se si me entiendes mira a ver que puedes hacer por mi gracias
 
Así como te mencione anteriormente funciona para lo que quieres hacer.
Pero sube el código que tengas hecho, junto con algún diagrama, para entenderte mejor.
 
Saludos a todos!

Ya hace algun tiempo me compré un programador (el K150) me ha salido bien y todo, la tragedia fue a la hora de programar jaja.

Estoy jugando con PicBasic y el pic 12F629, simplemente me dije "bueno, con algo pequeño está bien" no necesito tantos puertos para los proyectitos que tengo en mente asi que me viene de perlas.

El problema es este: quiero hacer un contador de eventos usando siempre el 12F629, configuré todos los puertos como salidas (excepto el GP3/patita4, que sólo funciona como entrada o MCLR) y con oscilador interno, estoy usando este programa que saqué de un libro:

Trisio=0 ;hace todos los pines del puerto B como salidas
boton VAR gpio.3 ;asigna el nombre de botón al puerto A.1
num VAR BYTE ;crea la variable num con un tamaño de 255
num= 0 ;carga el valor inicial de 0 a la variable num

pulsar:

gpio=num ;indica sacar el valor de num a través del puerto B
IF boton=0 THEN contar ;pregunta si el botón ha sido presionado
GOTO pulsar ;ir a pulsar, mantiene encerrado

contar:
IF boton=0 THEN contar ;espera a que suelte el botón para continuar
PAUSE 200 ; espera de 200 mls para estabilizar el botón
num=num + 1 ;suma 1 a la variable num y el nuevo valor le guarda en num
GOTO pulsar ; volver al principio del programa

END ; fin de la programación

Como habran notado en los comentarios (que no modifiqué) el programa fue diseñado para un pic mas grande, lo que yo quiero y no se como hacer está en la sexta linea, donde asigna a gpio=num (originalmente era PORTB=num) dado que el 12F629 solo maneja 6 puertos, el conteo lo hace como si fueran 6 salidas (lo que no es asi).

Ya en concreto mi duda es: puedo asignarle a la variable "num" solo un rango de puertos y no en general? solo gp0, gp1 y gp2 (patitas 7, 6 y 5 respectivamente)

Gracias!
 
en concreto mi duda es: puedo asignarle a la variable "num" solo un rango de puertos y no en general? solo gp0, gp1 y gp2 (patitas 7, 6 y 5 respectivamente)
Una manera sencilla de hacerlo sería usando la instrucción LookUp
Adjunto un ejemplo para que te des una idea de como se haría.

Suerte.
 

Adjuntos

  • 12F629 LEDs con LookUp.rar
    8.2 KB · Visitas: 206
Saludos a todos!

Ya hace algun tiempo me compré un programador (el K150) me ha salido bien y todo, la tragedia fue a la hora de programar jaja.

Estoy jugando con PicBasic y el pic 12F629, simplemente me dije "bueno, con algo pequeño está bien" no necesito tantos puertos para los proyectitos que tengo en mente asi que me viene de perlas.

El problema es este: quiero hacer un contador de eventos usando siempre el 12F629, configuré todos los puertos como salidas (excepto el GP3/patita4, que sólo funciona como entrada o MCLR) y con oscilador interno, estoy usando este programa que saqué de un libro:

Trisio=0 ;hace todos los pines del puerto B como salidas
boton VAR gpio.3 ;asigna el nombre de botón al puerto A.1
num VAR BYTE ;crea la variable num con un tamaño de 255
num= 0 ;carga el valor inicial de 0 a la variable num

pulsar:

gpio=num ;indica sacar el valor de num a través del puerto B
IF boton=0 THEN contar ;pregunta si el botón ha sido presionado
GOTO pulsar ;ir a pulsar, mantiene encerrado

contar:
IF boton=0 THEN contar ;espera a que suelte el botón para continuar
PAUSE 200 ; espera de 200 mls para estabilizar el botón
num=num + 1 ;suma 1 a la variable num y el nuevo valor le guarda en num
GOTO pulsar ; volver al principio del programa

END ; fin de la programación

Como habran notado en los comentarios (que no modifiqué) el programa fue diseñado para un pic mas grande, lo que yo quiero y no se como hacer está en la sexta linea, donde asigna a gpio=num (originalmente era PORTB=num) dado que el 12F629 solo maneja 6 puertos, el conteo lo hace como si fueran 6 salidas (lo que no es asi).

Ya en concreto mi duda es: puedo asignarle a la variable "num" solo un rango de puertos y no en general? solo gp0, gp1 y gp2 (patitas 7, 6 y 5 respectivamente)

Gracias!

Hola...define los fusibles , oscilador y frecuencia del mismo, así como si vas a usar Gpio.3 como entrada y 0,1,2 como salidas al hacer Trisio debes darle el valor = %1000 o sea en decimal 8(GP.3 como entrada y GP.2,GP.1,GP.0 como salida) limita después de incrementar la variable el valor a representar a decimal 7(%111) que es el máximo valor a representar ya que no dispones mas que de 3 pines. Puede ser mediante una comparación
Código:
IF num = 8 then num = 0
Saludos

Ric.
 
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?
 
Atrás
Arriba