Curso de programación de PIC en PICBasic Pro

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???
 
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.
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.
¿Y por qué no haces las rutinas para las funciones que requieres?
¿Ó cual es el problema?
 
mil gracias ferdy 575 he leido, te agradezco el aporte, voy a revisar las paginas anteriores para montarlo y seguir experimentando y concluyendo, quisiera por favor que me remitan a un proyecto que trate como ingresar datos en la eeprom del pic 16f628a, cuando desconecte la energia, la ultima cuenta permenezca hasta que nuevamente encienda, me parece muy util ahora que estoy aprendiendo sobre contadores. gracias por su ayuda amigos.
 
hola amigos, alguien tiene un ejemplo de como generar tonos por un pin del 16f628a en pbp?
he usado FREQOUT portb.0 2000,7200 con un buzzer pasivo, y funciona pero todo el problema es que el volumen es demasiado bajo, a pesar de combinar distintas frecuencias, como hacer para aumentar su volumen , algo parecido al pitido que genera mi pc al encender? lo necesito para implementarlo al temporizador y lo que pretendo es que suene duro sin importar el lugar que me encuentre, y he visto aparatos que con estos buzzer pasivos suenan bastante duro en estados de alarma, no quiero usar chicharras, su sonido no es agradable...espero puedan colaborarme
 
hay miles de maneras de hacerlo... con un amplificador operacional, con un transistor, etc etc... hay que ver aq qeu llamas buzzer pasivo... yo conozco solo un tipo de buzer... que impedancia tiene? para que tension es? son muchas las cuestiones y sin muchos datos / imagenes / diagramas, no se por done arrancar para orientarte
 
Buenas tardes hermanos del maravilloso mundo de los microcontroladores
acabo de adquirir un modulo bluetooth (JY-MCU V1.05).
bluetooth_03.jpg

trabaja por comunicación serial tipo serial-UART.
ya lo tengo funcionando con un Arduino UNO R3.
y funciona muy bien , el programa es sencillo cuando mando un "1" serial prende un led y cuando mando "2" se apaga el led.
ya sea comandado por la pc o por android.

el problema es cuando quiero usarlo con un PIC16F628A
cuando hago la comunicación de PIC a PIC el codigo funciona tanto en simulacion en proteus como fisicamente, pero cuando lo hago por medio del bluetooth ya no funciona.
el modulo funciona Default Baud Rate: 9600,8,1,n.
les agradesco, si me pudieran echar una manita gracias el Código es el siguiente:

Código:
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
@ device  pic16F628A, intrc_osc, pwrt_on, wdt_off, mclr_off, lvp_off, protect_off
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00000010
'*******************************************************************************
DEFINE HSER_BAUD 9600
DEFINE Hserial_RCSTA %10010000
DEFINE Hserial_TXSTA %00100100
DEFINE Hserial_Clear On
dato var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
inicio:
HSERIN 50,inicio,[Dato]

if dato = 1 then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = 2 then
PORTA.0 = 0
pause 500
goto inicio
endif
END

Adjunto simulacion Funcionando en proteus PIC a PIC.

Gracias y seguimos en contacto.
 

Adjuntos

  • USART-PIC16F628A.zip
    16.8 KB · Visitas: 121
Última edición:
acabo de adquirir un modulo bluetooth (JY-MCU V1.05).
trabaja por comunicación serial tipo serial-UART.
ya lo tengo funcionando con un Arduino UNO R3.
y funciona muy bien , el programa es sencillo cuando mando un "1" serial prende un led y cuando mando "2" se apaga el led.
ya sea comandado por la pc o por android.

el problema es cuando quiero usarlo con un PIC16F628A
cuando hago la comunicación de PIC a PIC el código funciona tanto en simulación en proteus como físicamente, pero cuando lo hago por medio del bluetooth ya no funciona.
el modulo funciona Default Baud Rate: 9600,8,1,n.
Al parecer esos módulos se comunican por medio de comandos AT.
Lee esta información, quizás te pueda servir: Setup JY-MCU BT BOARD v1.2

Suerte.
 
Buenas noches!!

Al parecer esos módulos se comunican por medio de comandos AT.
Lee esta información, quizás te pueda servir: Setup JY-MCU BT BOARD v1.2

Suerte.

Gracias D@rkbytes por la información.
no tengo problemas en la conexión ni en la configuración, como comento anteriormente lo estoy usando con un Arduino UNO R3 y Funciona de 10.
la conexión se establece ya sea por medio de un celular Android de bluetooth a bluetooth, o si lo quiero comandar de PC se conecta por el bluetooth de la PC.
bluetooth_04.jpg

Con arduino funciona muy bien.
Arduino_Bluetooth.jpg

pero con el pic nop =(

Saludos y seguimos en contacto
 
hay miles de maneras de hacerlo... con un amplificador operacional, con un transistor, etc etc... hay que ver aq qeu llamas buzzer pasivo... yo conozco solo un tipo de buzer... que impedancia tiene? para que tension es? son muchas las cuestiones y sin muchos datos / imagenes / diagramas, no se por done arrancar para orientarte

gracias por responder amigo torres electronico, ya lo solucione y simplemente era que en el sitio donde lo compre me habian vendido un buzzer de mayor voltaje al que requería, lo cambie y listo. Me podrian orientar como es la configuracion de los fuses para un pic 16f877a en pic basic? quiero migrar el codigo de un temporizador que realice con un 16f628a este chip, mejor dicho quiero relizar el programa para 4 temporizadores de minutos en un solo chip pero con funciones totalmente independientes uno del otro, osea serian 8 displays de 7 segmentos, mas reset para cada temporizador y ortos aditamentos, y por el numero de puertos que requiero, he mirado este chip para usarlo. he visto contadores de 4 digitos usando un solo 7447 para manejar los 4 display y 4 transistores para la multiplexacion, quiere decir esto que puedo usar 4 pines de un puerto para manejar las entradas de un solo 7447 y otro puerto con 8 pines para los 8 transistores de la multiplexacion y crear los 4 temporizadores que necesito, usando en total para los 8 display solo 12 pines? ojala me puedan colaborar con estas respuestas y remitirme a algunos ejemplos sobre manejo de 16f877 y multiplexacion para displays ya que el tema no lo entiendo mucho. espero su colaboracion y ya posteare mis inicios para que me colaboren con la adaptacion del codigo al nuevo chip. mil gracias por su tiempo muchachos.
 
Última edición:
Saludos hermanos del maravillosa mundo de los microcontroladores!!

Gracias D@rkbytes por la información.
no tengo problemas en la conexión ni en la configuración, como comento anteriormente lo estoy usando con un Arduino UNO R3 y Funciona de 10.
la conexión se establece ya sea por medio de un celular Android de bluetooth a bluetooth, o si lo quiero comandar de PC se conecta por el bluetooth de la PC.

Final mente de hacer pruebas y consultando manuales de Pic Basic Pro, Dí con el problema de la comunicación del modulo bluetooth y el PIC16F628A. :D
El problema era que yo estaba guiado de un manual para programación en Proton IDE y no todas las funciones de Proton IDE son compatibles para Pic basic pro.
en el Código que publique anterior en la parte de :
Código:
'*******************************************************************************
DEFINE HSER_BAUD 9600
DEFINE Hserial_RCSTA %10010000
DEFINE Hserial_TXSTA %00100100
DEFINE Hserial_Clear On
Resulta que esas declaraciones son mas que nada para Proton IDE y en vez de usar DEFINE se usa Declare.
pero en pic basic pro se usan :
Código:
'*******************************************************************************
' INICIALIZANDO USART
SPBRG = 25
RCSTA = %10010000
TXSTA = %00100100
'*******************************************************************************
el cual configura el pin de TX y RX y los 9600 Baudios asignado. Comunicación Uart
otra cosa que modifique fue en la recepción de datos en la parte :
Código:
if dato = 1 then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = 2 then
PORTA.0 = 0
pause 500
goto inicio
endif
en los if cuando definimos el valor para el primer caso que es 1 debe de usar comillas para que detecte como caracter y gual en el caso 2 en el numero 2 debe usar comillas y se sustituyo por :
Código:
if dato = "1" then
PORTA.0 = 1
pause 500
goto inicio
endif
if dato = "2" then
PORTA.0 = 0
pause 500
goto inicio
endif

Finalmente ya estoy trabajando con el modulo Bluetooth Funcionando.
Gracias a todos ustedes.
Adjunto archivo funcionando.

Saludos y seguimos en contacto.
 

Adjuntos

  • Receptor-UART.zip
    967 bytes · Visitas: 137
hola a todos.
les cuento que revisando el sistema de los mouse ópticos encontré que el componente que va en la rueda hace dos pulsos en secuencia así: 0-0, 1-0, 1-1, 0-1, 0-0, en un sentido y en el otro sentido la secuencia es contraria así: 0-0, 0-1, 1-1, 1-0, 0-0 y pensé sera que no se podrá controlar un servo con este sistema en lugar de un potenciometro? y escribí este código pero no funciona obviamente a primera vista se ve que tiene errores de sintaxis sera que alguien entiende lo que quiero hacer y puede ayudarme a ver como se corrigen estos errores?:unsure:
Este es el código:
Código:
'**********************************************************************
' control servo con pulsador rotativo
@ device pic16F628A,intrc_osc,pwrt_on,wdt_off,mclr_off,lvp_off,protect_off
DEFINE OSC 4
'**********************************************************************
CMCON = 7                              
TRISB = 0
PORTB = 0
'**********************************************************************
pulso1 var porta.0
pulso2 var porta.1
servo1 var portb.0
x var byte

x = 150

inicio:
pulsout servo1,x
gosub timer
goto inicio

timer: 
if            ; aquí sería sí primero pulso1 y luego pulso2 entonces ir a "mas"
pulso1 = 0 
pause 10 
pulso2 = 0 
pause 10 
then gosub mas 
endif
return

if            ; aquí sería sí primero pulso2 y luego pulso1 entonces ir a "menos"
pulso2 = 0 
pause 10
pulso2
pause 10
then gosub menos
endif
return

mas:
pause 10
x=x+1
if x > 250 then x = 250
return

menos:
pause 10
x=x-1
if x < 50 then x = 50
return
end
agradezco su colaboración
 
Última edición:
hola a todos.
les cuento que revisando el sistema de los mouse ópticos encontré que el componente que va en la rueda hace dos pulsos en secuencia así: 0-0, 1-0, 1-1, 0-1, 0-0, en un sentido y en el otro sentido la secuencia es contraria así: 0-0, 0-1, 1-1, 1-0, 0-0 y pensé sera que no se podrá controlar un servo con este sistema en lugar de un potenciometro? y escribí este código pero no funciona obviamente a primera vista se ve que tiene errores de sintaxis sera que alguien entiende lo que quiero hacer y puede ayudarme a ver como se corrigen estos errores?:unsure:
Este es el código............

Hola ferdy... :unsure: eso es un encoder y obviamente se podria implementar para tu proposito (yo diria que es lo ideal (y) )...

Fijate que vos describis justamente los pulsos :
count_up_downENCODER.GIF
Solo tienes que tener en cuenta que el registro donde va a estar la variable para que sepa cual es la posicion (ida o venida), tiene que ser un espacio de memoria que no se borre o vea afectado por nada, ya que ahi esta el corazon del proyecto...
Buscate la hoja de datos de ese enconder por que los hay de distintos tipos, asi te doy una mano ;)
 
Última edición:
Hola ferdy... :unsure: eso es un encoder y obviamente se podria implementar para tu proposito (yo diria que es lo ideal (y) )...

Fijate que vos describis justamente los pulsos :
Solo tienes que tener en cuenta que el registro donde va a estar la variable para que sepa cual es la posicion (ida o venida), tiene que ser un espacio de memoria que no se borre o vea afectado por nada, ya que ahi esta el corazon del proyecto...
Buscate la hoja de datos de ese encoder por que los hay de distintos tipos, asi te doy una mano ;)

hola Torres, gracias por responderme te cuento que estuve dando muchas vueltas en Internet y el componente encoder rotativo más parecido que halle fue este: el 288 Rotary encoder aquí te pongo la hoja de datos aunque físicamente es un poco diferente electricamente se comporta igual solo que siempre va hacia adelante, agradezco tu colaboración
 

Adjuntos

  • 288 Rotary Encoder.pdf
    1.7 MB · Visitas: 89
Última edición:
hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, asi tambien no encuentro la configuracion de fuses para este chip. muchas gracias y ojala me puedan ayudar
 

Adjuntos

  • 16f877a.rar
    9.7 KB · Visitas: 86
hola expertos, solicito su ayuda referente a como debo enlazar 2 contadores iguales en su estructura, pero ubicados en diferentes puertos del pic 16f877a, el uno cuenta de 0 a 9 ubicado en portb y el otro cuenta de 9 a cero y esta en portd y no logro que funcionen al mismo tiempo, quisiera que con el mismo programa me indiquen que hace falta para poder entender como se hace este enlace, así también no encuentro la configuración de fuses para este chip. muchas gracias y ojala me puedan ayudar
Así como tienes el programa no funcionará el contador del puerto D.
Y recuerda que los programas son secuenciales, primero verás el conteo de 0 a 9 en el puerto B,
y luego comenzara el conteo de 9 a 0 en el puerto D, y se repite el ciclo.
Para que funcione el contador del puerto D, solo tenías que hacerlo así...
Código:
inicio:
       for i = 0 to 9
       portb = i
       pause 100
       next i
              
       for i2 = 9 to 0 [B]step - 1[/B]
       portd = i2
       pause 100
       next i2
       goto inicio
La palabra de configuración que utilicé fue ésta:
@ DEVICE HS_OSC, PWRT_ON, WDT_OFF, BOD_OFF

Para que te ahorres los dos decodificadores y trabajes los displays directamente, adjunto un ejemplo.

Suerte.
 

Adjuntos

  • 16F877A Contadores.rar
    11.9 KB · Visitas: 123
Última edición:
Atrás
Arriba