desktop

Curso de programación de PIC en PICBasic Pro

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.
 
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: 3
  • 1589216903272.png
    1589216903272.png
    45.6 KB · Visitas: 2
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: 7
Ú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: 9
Ú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 :(
 
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 :(

Si el trabajo así se lo pide debe hacerlo así para cumplirlo pero no pretenda que lo que aplica a nivel de software para el circuito con un codificador binario a 7 segmentos sea idéntico al que no lo tiene.

Estoy refiriéndome a lo que subió en el adjunto Ciruito3.rar.

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 12/05/2020                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISB = 0
PORTB = 0

TRISC = 0
PORTC = 0
'DECLARACION DE VARIABLES
i VAR BYTE
a VAR BYTE
b VAR BYTE



un0 VAR a.0
un1 VAR a.1
un2 VAR a.2
un3 VAR a.3

de0 VAR b.0
de1 VAR b.1
de2 VAR b.2
de3 VAR b.3



INICIO:
FOR i=99 TO 0 STEP -1
b=i/10
a=i-b*10

PORTB.0=un0
PORTB.1=un1
PORTB.2=un2
PORTB.3=un3  

PORTC.0=de0
PORTC.1=de1
PORTC.2=de2
PORTC.3=de3


PAUSE 500
NEXT i
GOTO INICIO

Los archivos incluidos no corresponde el hex al pbp que contienen.

El archivo hex se ejecuta con la falla del dígito de la decena pero no se puede analizar o reformar nada por que no corresponde al archivo pbp que se encuentra allí(ver código subido).

Tal vez soy yo que no veo donde convierte de binario a 7 segmentos en dicho software y usted me lo puede indicar.

Tabla que contiene el codificador binario a 7 segmentos 7447 y que se debe implementar en el software si no se lo quiere usar.

Ca.JPG

Por cierto también es de buena practica realizar comentarios de que se esta haciendo en el programa para ayudar al otro a comprender que se esta realizando y en el futuro para uno mismo, ver de que forma lo hacia.

Simulacion

Captura.JPG

Donde se aprecian todas y cada una de las fallas que le advertí anteriormente(cristal, uso erróneo del puertoD cuando el software usa el C, etc).
 
Última edición:
Buenas noches.
soy nuevo en esto del PIC12F635, me podrian brindar una mano con alun ejemplo sencillo , como por ejemplo encender un led. por que la verdad no tengo idea de como configurar a sus pines de salida ni como cambiarles de nombre. Dicho sea de paso programo en Pic Basic Pro.

Pd:
Por experiencias en otros Pic se que para cambiar de nombre a un pin en especifico que quiero como salida,en este caso un led ,hago lo siguiente:
LED1 VAR PORTC.5 o SYMBOL LED1 = PORTC.5

En el PIC12f635 como llamaria a sus pines de salida.?!

Gracias de ante mano.
 
¿En el PIC12F635 cómo llamaría a sus pines de salida?
En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA
¿Me podrían brindar una mano con algún ejemplo sencillo, como por ejemplo; encender un LED?
High Pin para establecer un estado alto y Low Pin para establecer un estado bajo.

Ejemplos sobre LED con PIC en PICBasic existen muchos en el Foro.
 
Gracias por la respuesta D@rkbytes
Estuve averiguando por mi lado y efectivamente si coincide el Datasheet del PIC con lo que mencionas.

En los PIC con un solo puerto suelen llamarse PORTA o PORTB, en este caso: PORTA

Encontre tambien este programa: (otra manera de llamar a los pines del PIC)

Código:
X VAR BYTE              ;crea variable de 255
 
 trisio=%110111               ;todos los pines gpio son de salida

 INICIO:
    FOR x=1 TO 5     
    HIGH gpio.0            ;encender el led del pin gpio.1
    PAUSE 300     
    LOW gpio.0
    PAUSE 300
    NEXT X
        
    GOTO INICIO
    
 END
 
trisio=%110111 ;todos los pines gpio son de salida
No, ahí solo se está declarando que GPIO.3 sea salida.
Y aunque usas GPIO.0 que está declarado como entrada, la instrucción "High Pin" lo convierte en salida, por eso el programa funcionará.
Por lo tanto, quedó de sobra configurar los pines con TRISIO
Si hubieras escrito GPIO.0 = 1 el programa no funcionaría porque GPIO.0 está configurado como entrada.
Estuve averiguando por mi lado y efectivamente si coincide el Datasheet del PIC con lo que mencionas.
Claro, en la hoja de datos se encuentra esa información, algo que ahora muchos olvidan.
Port References.jpg
 
No, ahí solo se está declarando que GPIO.3 sea salida.
Y aunque usas GPIO.0 que está declarado como entrada, la instrucción "High Pin" lo convierte en salida, por eso el programa funcionará.
Por lo tanto, quedó de sobra configurar los pines con TRISIO
Si hubieras escrito GPIO.0 = 1 el programa no funcionaría porque GPIO.0 está configurado como entrada.

Claro, en la hoja de datos se encuentra esa información, algo que ahora muchos olvidan.
Si eso lo se, pero el GP3 es a la vez el MCLEAR es por eso que lo configuro así, bueno se me ocurrió eso para no tocar ese pin.
Ayudame a configurar bien esos pines y no tener problemas al momento de volver a regrabar el pic.
 
Por defecto en todos los PIC los pines están configurados como entradas.
Así que si todo un puerto se necesita como entrada, no tendrá caso escribir TRISA = %11111111 porque será redundante.
Si no se usan, no captan ruidos, ni afectan al programa como muchos piensan y por eso configuran como salidas los pines que no van a usar.
Un pin que no se usa no tiene porqué afectar al programa, puesto que su sistema lógico es independiente.
Como ejemplo: si un pin estuviera recibiendo datos seriales, no tiene porqué interferir con el resto.
Si eso lo se, pero el GP3 es a la vez el MCLEAR es por eso que lo configuro así, bueno se me ocurrió eso para no tocar ese pin.
Eso tampoco tiene sentido, ya que siendo el Master Clear o Reset, siempre será entrada, así que configurarlo como salida no tiene sentido.
Si no lo piensas tocar, simplemente no lo usas sabiendo que no se puede, a menos que pueda ser entrada digital como en algunos PIC.

Ayúdame a configurar bien esos pines y no tener problemas al momento de volver a regrabar el PIC
Eso no requiere ayuda, simplemente configuras lo que requieras que sea salida y entrada y posteriormente les asignas un estado.
El uso del registro TRISIO es cuando piensas darle un estado al pin directamente sin el uso de las instrucciones "High Pin", "Low Pin" o "Toggle Pin"
Esas instrucciones como mencioné anteriormente configuran el pin como salida haciendo uso de los registros TRISx
O sea que si voy a escribir "GPIO.2 = 1" entonces sí se debe usar el registro TRISIO y configurar GP2 como salida.
TRISIO = %11111011 o TRISIO.2 = 0
 
Estimado D@rkbytes, buenas noches.
¿Có
mo podría yo configurar el PIC para que por más que esté encendido no ejecute el programa hasta después de unos minutos, o quizás agregarle una especie de tiempo de retardo?

Esto lo hago por protección en caso de apagones.
Código:
SYMBOL  LED1       = PORTB.0
SYMBOL  MOTOR      = PORTB.1
TRISB=0

Motor_1:
    high MOTOR          
    pause 8000      
    low MOTOR            
    pause 2000        
    GOTO Motor_1
   
END
 
Atrás
Arriba