Curso de programación de PIC en PICBasic Pro

hola lubeck aqui dejo la simulacion de envios serial via infrarojo con 16f628A, he probado en el protoboard pero no me da respuesta, si conecto directamente la salida del emisor con el receptor todo ok hasta logro configurar el receptor, pero al hacerlo con los ingrarojos nada que ver, si envia la señal el emisor y si la recibe el receptor pero creo que es por la frecuencia, la señal de trasmicion serial esta a T9600 voy a intentar hacerlo con T300 a ver que tal, pero mi duda seria que frecuencias serian aproximadamente la de salida si se trabaja a T9600 o T300? saludosss
 

Adjuntos

  • con dos 16f628A.rar
    309.1 KB · Visitas: 180
estoy buscando el código en picbasicpro para esta aplicacion, agradezco su colaboracion.
si te ayuda en algo mi consejo es que empieces con aplicaciones que esten bien sencillas y utilices un simulador como proteus como por ejemplo...
lo de menos es hacerte la aplicación o ayudarte a buscarla pero no creo que te sirva como material didáctico y siempre vas a estar en busca de lo ya echo...

ahora si ya tienes algo avanzado subelo y con gusto te echo una mano, con simulador es mucho mas facil... que solo con el codigo...

recuerda que mi opinion es sin saber que tanto sabes al respecto...:D

Rey

mira estuve indagando un poco el día de hoy y vi este link que nos podría servir de ayuda...sabia que íbamos
a tener problemas en la realidad... :D
no lo he analizado detalladamente...
http://pablob86.elapco.net/2010/05/transmisor-infrarrojo-ir-con-pic-16f87.html
 
Última edición:
Hola Lubeck, no me hechas una mano a mi?? :D
GoX F4yCk3r DB dijo:
Hola que tal, acabo de entrar a este rollo del PWM, es interesante, ya fabriique mis programa para la comunicacion en serie.
Lo que tengo que hacer es lo siguiente.
Aumentar o disminuir la velocidad del motor con el PWM, a traves de una comunicacion serial, es decir cuando el usuario mande la letra "A" la velocidad del motor debe aumentar y si mando la letra "D" la velocidad del motor disminuye.
Hoy lo realice en clase y lo unico que logre es que el motor gire a su velocidad maximan, no se porque, pero al momento de establecer la comunicacion y mandar la letra "A" un led prende y el motor empieza a girar a todo lo que da. Además de que si mando otra letra este ya no hace nada tengo que cortar la corriente para resetear el PIC.
Si no es mucha molestia aqui les dejo mis dos programasy haber si me puenden ayudar.
PD:Algun programa para simular la comunicacion serial? uso matlab y programo en Pbasic(microcode)
salu2
 

Adjuntos

  • Robotica.rar
    730 bytes · Visitas: 167
Última edición:
esta bien, bueno, lo que no capto mucho es el como hace, es decir yo envio un pwm por un pin del puerto con un ciclo de trabajo xxx%, y una cantidad de ciclos xxx por un tiempo xxxms, y luego envio un serout, seria algo asi?

hola @gox-f4yck3r-db que microcontrolador estas usando? te pregunto porque revise el programa y no lo tienes definido, tampoco el oxcilador si es a 4mhz o 20mhz, etc... Faltan muchas cosas en el programa que no veo.
 
Última edición:
podria decirse, lo que basicamente quiero hacer el regular la velocidad del motor, esto con la comunicacion en serie, si el usuario aprieta la tecla "X" el motor aumenta de velocidad, y si aprieta la tecla "Y" pues disminuye la velocidad, ya lo he estado probando y no jala, al momento presionar la tecla "X" el motor luego luego da todo el torque siendo que deberia pues empezar desde 0 e ir aumentando gradualmente su PWM

Uso un uC 16f877A, el cristal es de 4 mhz
 
bueno yo tuve el mismo problema con un minutero me daba 65000 minutos y era por que la variable era de tipo word, bueno lo solucione dandole el limite maximo y minimo al minutero, como era de 12 horas, maximo eran 720 minutos y minimo 0, entonces era algo asi:

if porta.x = 1 and minutos = 720 then
minutos = 0
endif
 
Entonces limitare mis variables, en este caso X que representa el numero de pulsos enviados (PWM)
por ejemplo
if x=0 and x<256 then
x=x+20
PWM portb.0,x,5000
return

esto es lo que se me ocurre, no se que tan factible sea
ahora el problema que tengo es que no aumenta, se supone que inicialice la variable en x=0 por lo que el motor no prende al momento de aplicarle voltaje, ahora cuando el usario presione la tecla "X" enviara la señal y se metera a la subrutina , evaluara la variable y mandara un PWM de 20 (asi es como tengo entendido que lo debe dehacer), el problema es que al momento de mandar la señal "X" el motor empieza a girar a su maximo torque :(
 
Última edición:
asi es en este caso la pera verde es X la cual es mi variable que manda el numero de pulsos que el PWM tendrá, pero si escede los 256 bits que el pwm tiene entonces ya no aumenta, si se cumple esta condicion y partiendo que X=0 entonces has que el motor gire 20% de su torque total :)
asi le entendi
 
pongamoslo asi: el valor maximo de x = 255 y el minimo es x = 0 entonces

si dato = "a" y x = 255 entonces reinicio x y aplico pwm con el valor de x
y
si dato = "d" y x = 0 entonces llevo al valor maximo a x osea 255 y aplico pwm con el valor de x

luego si ningunas de las condiciones anteriores aplica decimos

si dato = "A" entonces x = x+20 y aplico pwm con el valor de x
si dato = "b" entonces x = x-20 y aplico pwm con el valor de x

en este orden por que el programa va encontrarlo asi cuando lo este leyendo si colocamos las dos ultimas instrucciones en el comienzo va incrementar x y despues si x es mayor a 255 es que lo va a llevar a cero lo cual no va servir porque ya mando la ejecucion.

tienes de casualidad proteus para simularlo?
 
Última edición:
si te ayuda en algo mi consejo es que empieces con aplicaciones que esten bien sencillas y utilices un simulador como proteus como por ejemplo...
lo de menos es hacerte la aplicación o ayudarte a buscarla pero no creo que te sirva como material didáctico y siempre vas a estar en busca de lo ya echo...

ahora si ya tienes algo avanzado subelo y con gusto te echo una mano, con simulador es mucho mas facil... que solo con el codigo...

recuerda que mi opinion es sin saber que tanto sabes al respecto...:D


HOLA lubeck.

ya tengo programadas las 8 secuencias pero no se de que forma hacer cambie de secuencia cada que oprima el pulsador,


este el codigo que hasta el momento llevo.

Código:
CMCON = 7  'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
PORTB=0     ' PONE LAS SALIDAS EN CERO PARA ARRANCAR
PORTA=0

'SALIDAS
LED1 VAR PORTB.0 'Defino RB0 como LED1
LED2 VAR PORTB.1
LED3 VAR PORTB.2
LED4 VAR PORTB.3
LED5 VAR PORTB.4
LED6 VAR PORTB.5
LED7 VAR PORTB.6
LED8 VAR PORTB.7
'ENTRADAS
PULSADOR VAR PORTA.0

TRISB = 0 ' selecciono los pines de PORTB como salidas
TRISA=1   ' selecciono los pines de PORTA como ENTRADAS

CAMBIOSECUENCIA:
if pulSADOR=1 then GOTO INICIO
GOTO CAMBIOSECUENCIA

        
 

'SECUENCIA 1 (SE PRENDEN Y SE APAGAN UNO POR UNO)
INICIO:  
   
PAUSE 2000
LED1=1 
PAUSE 500
LED1=0
LED2 = 1 
PAUSE 500
LED2=0
LED3 = 1 
PAUSE 500
LED3=0
LED4 = 1 
PAUSE 500
LED4=0
LED5 = 1 
PAUSE 500
LED5=0
LED6 = 1 
PAUSE 500
LED6=0
LED7 = 1 
PAUSE 500
LED7=0
LED8 = 1 
PAUSE 500
LED8=0
PAUSE 2000
GOTO INICIO



SECUENCIA2: '(SE PRENDEN Y SE APAGAN DE DOS EN DOS)

LED1=1 : LED2 = 1 ' PRENDE  LED 1 Y 2

PAUSE 500 ' ESPERA 0,5 SEGUNDOS
LED1= 0
LED2 = 0 ' LED 1 2 SE APAGAN
LED3=1
LED4 =1 
PAUSE 500
LED3=0
LED4 =0
LED5=1
LED6=1
PAUSE 500
LED5=0
LED6=0
LED7=1
LED8=1
PAUSE 500
LED7=0
LED8=0 
GOTO SECUENCIA2 
'SECUENCIA3: (SE PRENDEN Y SE APAGAN DE TRES EN TRES)
PAUSE 2000
LED1=1
LED2=1
LED3=1
PAUSE 500
LED1=0
LED2=0
LED3=0
PAUSE 500
LED4=1
LED5=1
LED6=1
PAUSE 500
LED4=0
LED5=0
LED6=0
PAUSE 500
LED7=1
LED8=1
PAUSE 500
LED7=0
LED8=0
PAUSE 2000
'SECUENCIA 4 (SE PRENDEN Y SE APAGAN DE CUATRO EN CUATRO)
PORTB=%00001111  'METODO ABREVIADO PARA PONER LAS CUATO PRIMERAS SALIDAS A 1
PAUSE 500
PORTB=%11110000
PAUSE 500
PORTB=%00000000
PAUSE 2000
'SECUENCIA 5 (SE PRENDEN Y SE APAGAN DE UNO EN  UNO DEL 8 AL 1)
LED8=1 
PAUSE 500
LED8=0
LED7 = 1 
PAUSE 500
LED7=0
LED6 = 1 
PAUSE 500
LED6=0
LED5 = 1 
PAUSE 500
LED5=0
LED4 = 1 
PAUSE 500
LED4=0
LED3 = 1 
PAUSE 500
LED3=0
LED2 = 1 
PAUSE 500
LED2=0
LED1 = 1 
PAUSE 500
LED1=0
PAUSE 2000
'SECUENCIA 6 (SE PRENDEN Y SE APAGAN DE DOS EN DOS DEL 8 AL 1)
LED8=1 : LED7 = 1 ' PRENDE  LED 1 Y 2
PAUSE 500 ' ESPERA 0,5 SEGUNDOS
LED8= 0 : LED7 = 0 ' LED 1 2 SE APAGAN
LED6=1: LED5 =1 
PAUSE 500
LED6=0
LED5 =0
LED4=1
LED3=1
PAUSE 500
LED4=0
LED3=0
LED2=1
LED1=1
PAUSE 500
LED2=0
LED1=0 
PAUSE 2000
'SECUENCIA 7(SE PRENDEN Y SE APAGAN DE TRES EN TRES DEL 8 AL 1)
LED8=1
LED7=1
LED6=1
PAUSE 500
LED8=0
LED7=0
LED6=0
PAUSE 500
LED5=1
LED4=1
LED3=1
PAUSE 500
LED5=0
LED4=0
LED3=0
PAUSE 500
LED2=1
LED1=1
PAUSE 500
LED2=0
LED1=0
PAUSE 2000

'SECUENCIA 7(SE PRENDEN Y SE APAGAN DE CUATRO EN CUATRO DEL 8 AL 1)
LED8=1
LED7=1
LED6=1
LED5=1
PAUSE 500
LED8=0
LED7=0
LED6=0
LED5=0
PAUSE 500
LED4=1
LED3=1
LED2=1
LED1=1
PAUSE 500
LED4=0
LED3=0
LED2=0
LED1=0
        
 GOTO INICIO' SE REPITE
END 'FIN DEL PROGRAMA
 

Adjuntos

  • SECUENCIA1.rar
    12.6 KB · Visitas: 144
  • 8 SECUENCIAS AUTOMATICAS CON PULSADOR.rar
    758 bytes · Visitas: 180
hola @tecnicoelectronico29 fijate en el programa que estamos haciendo mas arriba, se trata de modificar la velocidad de un motor a travez del pwm, lo que hace es incrementar una variable y a traves de esa variable cambiar la pwm, en tu caso puede ser igual, para cambiar de una secuencia a otra utiliza una varible x,y,x el nombre que desees cololarque y le colocas la condicion de auto suma cuando sea precionado el boton y segun el valor de esa variable sea la secuencia.
 
oie tengo unas dudas en las condiciones
se supone que si X=255 entonces el motor tiene que estar en su torque maximo, pero no entiendo porque reseteas X.
y si X=0 entonces el motor debe permanecer apagado.
lo que no comprendo es pq reinicias X o con que fin.
Si si tengo proteus pero no c como simularlo con la comunicacion serie.
 
bueno de echo el reset deberia ser un numero mayor tomando en cuenta el 255 seria 256 donde debe reiniciarse.
el porque si a estas alturas no lo comprendes es porque o me explique mas o no prestaste atencion.
te dije un poco mas arriba que pasa si x es 65000? si tu sumas de 20 en 20 a x va a llegar un momento en el cual va a sobre parar el 255 si no lo reinicias a 0 el continua sumandose de 20 en 20
y lo contraio si x vale 0 y decrementas si no lo llevas a un valor determinado como maximo pues se la a colocar en la posicion mas alta de la variable en el caso de word creo que algo asi mas o menos 6500000.

edito: el tamaño real de word que consegui va desde 0 a 65535.
 
Última edición:
ok entendido y se me fue lo de que X sobrepasaria el valor maximo deseado y seguiria contando entonces

if dato="A" and X>255 then
(reinicio la variable X)
(PWM, portb.0, 255,5000)
endif

if dato="D" and X<0 then
(pongo a x en 0)
(PWM,portb.0,0,5000)
endif

si estas condiciones no se cumplen entonces es cuando entra a las subrutinas y empieza a aumentar x o decrementar.
por cierto una pregunta como reinicio una variable???
existe alguna forma de simular la comunicacion en serie??
 
exacto te corrijo por si acaso:

if dato="A" and X=>256 then
x = 0
PWM, portb.0, X,5000
goto inicio
endif

if dato="D" and X<0 then
X = 255
PWM,portb.0,X,5000
goto inicio
endif

aqui las secuencias normales que tenias.

por cierto un detalle mas que vi en tu programa el comando

serin portc.7,T9600,dato

debes colocarlo despues del inicio para que despues de leer el dato y hacer la secuencia al volver al inicio este se mantenga esperando el otro dato de otra manera solo va recibir el primer dato y va obviar los demas.

por otro lado no esta bien el comando no es
serin portc.7,T9600,dato

seria

SERIN portc.7,T9600,[" "],DATO 'lo que va entre comilla es el primer dato que va a recibir, es como una señalizacion.
el comando dice que esta esperando el dato entre comillas y apenas lo reciba va a guardar el segundo en dato.
 
Última edición:
hola @tecnicoelectronico29 fijate en el programa que estamos haciendo mas arriba, se trata de modificar la velocidad de un motor a travez del pwm, lo que hace es incrementar una variable y a traves de esa variable cambiar la pwm, en tu caso puede ser igual, para cambiar de una secuencia a otra utiliza una varible x,y,x el nombre que desees cololarque y le colocas la condicion de auto suma cuando sea precionado el boton y segun el valor de esa variable sea la secuencia.


Lo siento pero no me entero aun mucho de este tema .
tengo la lógica pero no se como escribir el código..

yo diria que primero declaro una variable por ejemplo:

cambio VAR BYTE
Pulsador VAR porta.0

como hago que el pulsador incremente la variable cambio?

para utilizar esta variable para la condicion de cambio de secuencia.

estas son las lineas que estoy utilizando

inicio:
if pulsador = 1 then aumentar
goto inicio

aumentar:
cambio= cambio+1
if cambio=1 then secuencia1
if cambio=2 then secuencia2 '(por ejemplo)
goto aumentar

secuencia1:
led1=1
pause 200
Led1=0
led2=1
pause 200
led2=0
goto secuencia1
end

y lo mismo con todas las secuencias, por favor colaboremen con este problemilla,
o si tienen algun programa en picbasicpro que haga esto o simirar porfa , enviarmelo...
 
te voy a dar la primera linea y de alli te guias igual que como hicimos con el programa anterior.

if ó si se preciona el pulsador o lo que es lo mismo si el pulsador es = 1 entonces ó then
incremento la variable y me voy a la sub-rutina de seleccion.

variable = variable + 1
gosub sub-rutina de seleccion

sub-rutina de seleccion
si ò if la variable es = 1 entonces o then me voy a la primrera secuencia
gosub secuencia1 ó secuencia_1 no puede separarse las letras osea secuencia 1 no lo toma el pbp.

todos los sub-programas el nombre debe ser pegado si lleva numero entonces lo pegas con _1 y terminan con dos puntos : pegados de la ultima letra si no el programa no los toma.

si ò if la variable es = 2 entonces o then me voy a la segunda secuencia
gosub secuencia2

y asi sucesivamente...
 
Última edición:
Atrás
Arriba