Curso de programación de PIC en PICBasic Pro

hola, quisiera compartir un pequeño circuito para el control de un motor dc de un mini-dremel el cual fue compradro por ventas por tv, mi intencion es ver si me pueden echar una mano para controlar la velocidad del motor a traves de un pic12c/f509 y un uln2803. La idea principal es colocar 3 velocidades al motor las cuales pueden ser seleccionadas precionando un unico boton, al ser precionado una vez empieza en la velocidad mas baja al volver a precionar eleva la velocidad al segundo nivel y asi hasta el tercer y ultimo nivel luego al precionar por cuarta vez se apaga y queda en espera.Aqui les anexo la simulacion en proteus y el programa en basic. El problema que tengo es que no llego a obtener las 3 velocidades bien diferenciadas, o por lo menos es lo que observo en la simulacion.
 

Adjuntos

  • motor dc.rar
    30.4 KB · Visitas: 344
  • motor dc.txt
    1 KB · Visitas: 228
Tienes que darle un tiempo de espera en cada una de las rutinas del giro del motor para que el pic detecte a que condicion va ,para que la respectiva salida sea la corespondiente por el comando PWM que utilizas.
 
este seria mi aporte en como realizar las rutinas para el tiempo de respuesta del pic cuando de pulsa la tecla
'*******************************************************************************
PULSADOR var PORTA.5 'Pulsador en el PORTA.5
TMP_VEL var byte 'Nombre de la variable
TMP_VEL = 50 'Tiempo de espera para el scroll de ondas
TMP_PUL var byte 'Nombre de la variable
TMP_PUL = 250 'Tiempo de espera tras pulsar
'*******************************************************************************
Velocidad1:
; Aqui rutina de velocidad 1
GOSUB PULSADOR1
GOTO Velocidad1
'*******************************************************************************
Velodidad2:
; Aqui rutina de velocidad 2
GOSUB PULSADOR2
GOTO Velocidad2
'*******************************************************************************
velocidad3:
; Aqui rutina de velocidad 3
GOSUB PULSADOR3
GOTO velocidad3
'*******************************************************************************
PULSADOR1:
PAUSE TMP_VEL 'Tiempo de espera para el PWM
IF PULSADOR = 1 THEN : PAUSE TMP_PUL : GOTO TRIANGULAR 'Pulsador en espera
RETURN 'Regresa al GOSUB
'*******************************************************************************
PULSADOR2:
PAUSE TMP_VEL 'Tiempo de espera para de PWM
IF PULSADOR = 1 THEN : PAUSE TMP_PUL : GOTO SENOIDAL 'Pulsador en espera
RETURN 'Regresa al GOSUB
'*******************************************************************************
PULSADOR3:
PAUSE TMP_VEL 'Tiempo de espera para el PWM
IF PULSADOR = 1 THEN : PAUSE TMP_PUL : GOTO CUADRADA 'Pulsador en espera
RETURN 'Regresa al GOSUB
'*******************************************************************************
END

El Interruptor en PORTA.5 lo coloco como ejemplo

en esto seria asi :
GOTO TRIANGULAR =GOTO velocidad1
GOTO SENOIDAL=GOTO velocidad2
GOTO CUADRADA GOTO velocidad3
 
Última edición:
si te das cuenta en el programa es un mismo pulsador lo que hice fue crear rutinas para las tres pulsaciones que comentabas para las tres velocidades del motor al subirlo se me olvido correguir esto:

GOTO TRIANGULAR =GOTO velocidad1
GOTO SENOIDAL=GOTO velocidad2
GOTO CUADRADA GOTO velocidad3

porque era uno que habia diseñado para un frcuenciometro.
 
BIen para no olvidar el tema y proyecto de nuestro amigo Cheyo la primera parte para el desarrollo del REloj digital con se explica el multiplexado y coneccion de display al PIC 16f628A como progrmas en Basic para activar los pines de I/O del PIC.
 

Adjuntos

  • Multiplexado Parte 1.pdf
    72.1 KB · Visitas: 427
Hola amigos una prgunta como debo activar las resistencias pull up para el pic 16f877a en microcode se los agradeceria si me hechan una mano en eso por favor
 
Hola Mecatrodatos
Espero tenga forma de ayudarme con esto, antes usaba el pic 16f648a y mandaba las entradas del puerto a a analogicas con la instruccion
CMCON = 7
Mi problema es ahora quiero programar lo mismo pero en el pic 16f886 y no me funcionan los puertos que son de entrada analogica , la pregunta seria ¿como declaro que los puertos sean digitales y no analogicos en este pic?
 
Busca en el Data Sheet los registros:[/COLOR]
ANSELH REGISTER para configurar el PORTB del PIC.
ANSEL REGISTER para configurar el PORTA del PIC.

si no entendes te explicare como se realiza
 
buenas mira estoy haciendo un contador de pulsos que cada ves que detecte un cero me lo cuente estoy trabajando con el pin RB0 de un 16f876a, mi pregunta es como hago para que el me cuente pero dependiendo del flanco?, por que he visto que si coloco que cuente cada ves que el pin sea cero si esta pata queda mucho tiempo cero el sumara muchas veces. entonces quiero saber como cuento pero dependiendo del flanco he visto que utilizan el registro OPTION_REG pero quiero saber tambien como se habilita esto y ademas si eligiendo este modo todos los pines detectaran solo cambios por flanco?


el programa que estaba haciendo es este:

Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 2
Define LCD_EREG PORTB
Define LCD_EBIT 3
TRISB = %00000011 ' en el puerto B coloco el pin 0 y el 1 como entradas y el resto como salidas
contador var byte ' Create adval to store result
contador = 0
Pause 500 ' Wait .5 second
loop:

Lcdout $fe, 1 ' Clear LCD
IF PORTB.0 = 0 THEN
Contador = CONTADOR + 1
ENDIF
pause 50
Lcdout "sumatoria: ", DEC contador ' Display the decimal value
Pause 100 ' Wait .1 secon
Goto loop ' Do it forever
End
 
Última edición:
buenas mira estoy haciendo un contador de pulsos que cada ves que detecte un cero me lo cuente estoy trabajando con el pin RB0 de un 16f876a, mi pregunta es como hago para que el me cuente pero dependiendo del flanco?, por que he visto que si coloco que cuente cada ves que el pin sea cero si esta pata queda mucho tiempo cero el sumara muchas veces. entonces quiero saber como cuento pero dependiendo del flanco he visto que utilizan el registro OPTION_REG pero quiero saber tambien como se habilita esto y ademas si eligiendo este modo todos los pines detectaran solo cambios por flanco?


el programa que estaba haciendo es este:

Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 2
Define LCD_EREG PORTB
Define LCD_EBIT 3
TRISB = %00000011 ' en el puerto B coloco el pin 0 y el 1 como entradas y el resto como salidas
contador var byte ' Create adval to store result
contador = 0
Pause 500 ' Wait .5 second
loop:

Lcdout $fe, 1 ' Clear LCD
IF PORTB.0 = 0 THEN
Contador = CONTADOR + 1
ENDIF
pause 50
Lcdout "sumatoria: ", DEC contador ' Display the decimal value
Pause 100 ' Wait .1 secon
Goto loop ' Do it forever
End

Puedes intentar realizando esta variación:

lcdout $fe, 1 :limpia la LCD en el arranque

loop:
IF PORTB.0 = 0 THEN contar
GOTO loop

contar:
IF PORTB.0 = 0 THEN contar ;espera a que cambie el estado del PIN B0
PAUSE 200 ;retardo para evitar el rebote electrico
contador = contador + 1
pause 50
Lcdout "sumatoria: ", DEC contador
Pause 100
Goto loop
End
 
Estimados compañeros del foro:
Estoy construyendo un TinyProjector, la parte mecánica ya está resuelta, pero de programación se muy poco, con decirles que apenas hice funcionar un led intermitente.
En la web encontré el PDF del proyecto que estoy construyendo, tiene su código fuente en C, pero ese lenguaje nunca me gusto, así que acudo a los expertos de este tema para que me den una mano en traducir el código de esta página para pasarlo al bsic pro, estaba usando mikrobasic pero decidí usar bsic pro porque es mas sencillo.
De antemano muchísimas gracias y disculpen por colarme al tema de esta manera.
Página 30 y 43 de…
http://web.media.mit.edu/~stefanm/TinyProjector/TinyProjector.pdf
Espacialmente la página 108 y 113.
 
hola chicos. yo por aqui de nuevo. bueno, primero le queria dar las gracias a mecatrodatos por ayudarme con lo del servo casero pero, no pude hacer que funcione... tal ves sea que no se como adaptar el programa a mi circuito... en fin... gracias de todas formas;) en este caso, les queria dejar un control remoto serie proporcional de pic a pic que diseñe. es de un solo canal pero con algunas modificaciones al programa se pueden lograr varios canales. lo que tiene de bueno este circuito, es que a diferencia del que postie anteriormente, cuando el receptor deja de recibir señal, los servos de sus salidas vuelven a cero. espero les sea de utilidad.
saludosss.
 

Adjuntos

  • control Serie.rar
    62.6 KB · Visitas: 420
alguien por fa como seria en picbasic pro esta rutina que es originalmente en PIC SIMULATOR IDE :
'Subrutina que llena el registro de dezplazamiento
escribo:
For col = 1 To 16
If aux.15 = 0 Then
data = 1
WaitUs 2 (supongo que es pause 200)
clock = 0
WaitUs 2
clock = 1
WaitUs 2
Else
data = 0
WaitUs 2
clock = 0
WaitUs 2
clock = 1
WaitUs 2
Endif
----> aux = ShiftLeft(aux, 1) <---- esta parte
Next col
Return
gracias de antemano
:unsure: interesante proyecto mushito ,lastima que no pueda ayudarte :(
 
Yager

Para: ----> aux = ShiftLeft(aux, 1) <---- esta parte

proba asi: ===> aux = aux << 1

La información respectiva de ayuda la encontraras dentro de Help ... Help Topics ... PICBASICPRO Basics ... Math Operators ... SHIFT

y para: ----> WaitUs 2 (supongo que es pause 200)

lo correcto seria: ===> PAUSEUS 2

Pero no lo tengo muy claro debido a que presenta restricciones de tiempos de pausa minimos según la frecuencia del Oscilador a Cristal. Solo te puedo confirmar que WaitUs 2 en el PicSimIde se refiere a una espera de 2 microSegundos.

Espero haber sido de ayuda. Saludos. JuanKa.-
 
Atrás
Arriba