Curso de programación de PIC en PICBasic Pro

mmmm

bueno mi conclucion a tu duda, es que tienes dos posibilidades de enviar un dato a un pic....

1.-una es mandar una cadena de caracteres y recibirlos en un arreglo como se ha mencionado antes o con el codigo del amigo arturouc u cualquier otro algoritmo que cumpla con el fin...
y utilizando los if then necesarios o un select case... para prender bit por bit como lo estas haciendo...

2.- la otra es mandar un solo caracter y prender los bits nesesarios... y para esto prepare este video...

 
Que tal amigos quiero compartir un proyecto de efecto de luces como las que se presentan para la fecha dicembrina he aqui el codigo:


Código:
LD1 Con 1
LD2 Con 2
LD3 Con 4
LD4 Con 8
LD5 Con 16
LD6 Con 32
LD7 Con 64
LD8 Con 128

PB_Up   var PortA.0 
PB_Dn   var PortA.1 
PB_Auto var PortA.2 

Up_Dn   var bit
Mode    var byte 
ModeOld var byte
PBData  var byte
Cnt1    var byte 
Cnt2    var word 

TrisA = %11111 
TrisB = %00000000
PortA = 0
PortB = 0

modeOld = 0
Up_Dn  = 1   
Cnt1   = 0 

Main: 
   Mode = PortA >> 3      
   
   if modeOld <> Mode then 
      Modeold = Mode       
      PBData = 0           
      Up_Dn  = 1           
      Cnt1   = 0 
   endif    
   
   gosub Chk_PB_UpDn
   
   if PB_Auto then 
      if Up_Dn = 1 then 
         gosub Run_Up 
      else 
         gosub Run_Dn
      endif
   endif
   
   PortB = PBData
   
   if PB_Auto then
      pause 100
   else
      gosub DeBounce
   endif

Goto Main    


Chk_PB_UpDn:   
   if PB_Up then 
      Up_Dn = 1
      if not PB_Auto then gosub Run_Up
   else 
      if PB_Dn then 
         Up_Dn = 0
         if not PB_Auto then gosub Run_Dn
      endif
   endif   
return      

Run_Up:
   select case Mode
      case 0  
         if Cnt1 = 16 then 
            if PB_Auto then 
               Up_Dn = 0
            else   
               cnt1 = 0    
            endif   
         endif
         Cnt1 = cnt1 + 1 
         gosub Mode0
      case 1 
         if Cnt1 = 9 then 
            if PB_Auto then 
               Up_Dn = 0
            else   
               cnt1 = 0    
            endif   
         endif
         Cnt1 = cnt1 + 1 
         gosub Mode1
      case 2
         PBData = PBData + 1
      
      case 3
         if Cnt1 = 11 then 
            if PB_Auto then 
               Up_Dn = 0
            else   
               cnt1 = 0    
            endif   
         endif
         Cnt1 = cnt1 + 1 
         gosub Mode3
    end select
return      

Run_Dn:
   select case Mode
      case 0  
         if Cnt1 = 0 then 
            if PB_Auto then
               Up_Dn = 1
            else
               cnt1 = 16
            endif
         endif
         Cnt1 = cnt1 - 1 
         gosub Mode0
      case 1
         if Cnt1 = 0 then 
            if PB_Auto then
               Up_Dn = 1
            else
               cnt1 = 9
            endif
         endif
         Cnt1 = cnt1 - 1 
         gosub Mode1
      case 2
         PBData = PBData - 1
      
      case 3
         if Cnt1 = 0 then 
            if PB_Auto then
               Up_Dn = 1
            else
               cnt1 = 11
            endif
         endif
         Cnt1 = cnt1 - 1 
         gosub Mode3
    end select
return

Mode0:
   select case cnt1 
      case 00 : PBData =  0
      case 01 : PBData =  ld1
      case 02 : PBData =  ld1+ld2
      case 03 : PBData =  ld1+ld2+ld3
      case 04 : PBData =  ld1+ld2+ld3+ld4
      case 05 : PBData =  ld1+ld2+ld3+ld4+ld5
      case 06 : PBData =  ld1+ld2+ld3+ld4+ld5+ld6
      case 07 : PBData =  ld1+ld2+ld3+ld4+ld5+ld6+ld7
      case 08 : PBData =  ld1+ld2+ld3+ld4+ld5+ld6+ld7+ld8
      case 09 : PBData =  ld2+ld3+ld4+ld5+ld6+ld7+ld8
      case 10 : PBData =  ld3+ld4+ld5+ld6+ld7+ld8
      case 11 : PBData =  ld4+ld5+ld6+ld7+ld8
      case 12 : PBData =  ld5+ld6+ld7+ld8
      case 13 : PBData =  ld6+ld7+ld8
      case 14 : PBData =  ld7+ld8
      case 15 : PBData =  ld8
      case 16 : PBData =  0
    end select
return

Mode1:
   select case cnt1 
      case 00 : PBData =  0
      case 01 : PBData =  ld1
      case 02 : PBData =  ld2
      case 03 : PBData =  ld3
      case 04 : PBData =  ld4
      case 05 : PBData =  ld5
      case 06 : PBData =  ld6
      case 07 : PBData =  ld7
      case 08 : PBData =  ld8
      case 09 : PBData =  0
    end select
return

Mode3:
   select case cnt1 
      case 00 : PBData =  0
      case 01 : PBData =  ld1
      case 02 : PBData =  ld1+ld2
      case 03 : PBData =  ld1+ld2+ld3
      case 04 : PBData =  ld2+ld3+ld4
      case 05 : PBData =  ld3+ld4+ld5
      case 06 : PBData =  ld4+ld5+ld6
      case 07 : PBData =  ld5+ld6+ld7
      case 08 : PBData =  ld6+ld7+ld8
      case 09 : PBData =  ld7+ld8
      case 10 : PBData =  ld8
      case 11 : PBData =  0
    end select
return

DeBounce:
   Cnt2 = 0
   repeat 
      Cnt2 = Cnt2 + 1
      pause 1
    until (PB_Dn = 0) and (PB_Up = 0) or (Cnt2 > 200)
    if Cnt2 < 50 then pause (50 - Cnt2)    
return

End
 

Adjuntos

  • juego de luces.pdf
    15.8 KB · Visitas: 93
Lubeck

Vuelve a analizar detenidamente el circuito "juego de luces.pdf" que coloco Autotronico y veras que RA3 y RA4 no son siempre iguales, sino que siguen una secuencia determinada según el Modo que hayas elegido.

Mode0 .......

Mode1 .......

Mode3 .......





Saludos, JuanKa.-
 
J2C : los diodos son para proteger el puerto A en caso de conectar la alimentacion mal
lubeck: en el esquema esta puentiado el selector con RA3 y RA4, equivocacion mia pero ya lo corregui, con lo cual las opciones del juego de luces se amplia, lo arme en proteus y les dejo la simulacion al igual que el diagrama correguido en el punto de RA3 y Ra4.



autotronico dijo:
J2C : los diodos son para proteger el puerto A en caso de conectar la alimentacion mal
lubeck: en el esquema esta puentiado el selector con RA3 y RA4, equivocacion mia pero ya lo corregui, con lo cual las opciones del juego de luces se amplia, lo arme en proteus y les dejo la simulacion al igual que el diagrama correguido en el punto de RA3 y Ra4.
por otro lado con la condicon anterior el mode se ejecuta en deteminar la entrada por el puerto sin que el programa corra en la opcion es como si en ambos casos llegara un 1 logico.
 

Adjuntos

  • simulacion juego de luces.pdf
    15.7 KB · Visitas: 78
  • juego de luces.rar
    65 KB · Visitas: 105
Última edición:
Autotronico

En este caso:
J2C : los diodos son para proteger el puerto A en caso de conectar la alimentacion mal

Como que el PIC ya paso a mejor vida y no tiene ningun sentido proteger las entradas del puerto A.




Por otra parte considero totalmente ilogico colocar la llave de 4 posiciones y los 4 diodos de acuerdo a tu ultimo esquema:

llave 1 : ------ RA3=1 ; RA4=0
llave 2 : ------ RA3=0 ; RA4=1
llave 3 : ------ RA3=1 ; RA4=0
llave 4 : ------ RA3=0 ; RA4=1

Dado que las posicines 1 y 3 serian exactamente lo mismo entre ellas, y las 2 y 4 también serian lo mismo entre ellas.




Sin embargo, y es lo que di a entender, en el primer esquema tenia logica:

llave 1 : ------ RA3=1 ; RA4=0
llave 2 : ------ RA3=0 ; RA4=1
llave 3 : ------ RA3=1 ; RA4=1

Permitiendo elegir entre 3 modos distintos que puedes manejar por programa.



Saludos, JuanKa.-
 
hola amigos recien estoy iniciandome en este mundo de electronica con microcontroladores
en esta ocacion quiero realizar un temporizador de 0 - 99 minutos programable.
nose como empesar espero de su ayuda adjunto el diagrama en proteus
 

Adjuntos

  • temporizador.rar
    22 KB · Visitas: 104
nose como empesar
yo te recomendararia que....

no pretendas que alguien te haga el codigo...
empieza como la mayoria empezamos.... encendiendo un led... para eso puedes ir a la pagina #1 de este tema... y ya que hayas leido gran parte y echo un codigo propio aunque este mal, lo pones y te podemos echar una mano los que gustemos hacerlo...
 
J2C "Como que el PIC ya paso a mejor vida y no tiene ningun sentido proteger las entradas del puerto A"

Amigo, claro que protego al pic, en la alimentacion siempre coloco un diodo de proteccion en el caso de que la alimentacion este mal.

Al igual puedo colocar un unico diodo entre la alimentacion y el selector y otro en la alimentacion al PIC.:LOL:

Por otro lado tenes mucho razon en la configuracion opcional de las entradas.:apreton:

SALUDOS
 
mmmm

bueno mi conclucion a tu duda, es que tienes dos posibilidades de enviar un dato a un pic....

1.-una es mandar una cadena de caracteres y recibirlos en un arreglo como se ha mencionado antes o con el codigo del amigo arturouc u cualquier otro algoritmo que cumpla con el fin...
y utilizando los if then necesarios o un select case... para prender bit por bit como lo estas haciendo...

2.- la otra es mandar un solo caracter y prender los bits nesesarios... y para esto prepare este video...

http://www.youtube.com/watch?v=_ZwNt6hwLKs





Muchas gracias Lubeck (y). me ha servido de mucho tu ayudam duda resuelta.
Gracias mil gracias
salu2
 
hola amigos por aqui de nuevo con mis ideas y problemas jeje... bueno, les cuento que he diseñado un controlador de motores microcontrolados para usar en robotica. el circuito se basa en un micro pic12f629, un l293 y funciona asi: recibe un tren de pulsos por gpio3 usando pulsin y los guarda en la variable t1 para despues compararlos con los valores 50,100,150'200 y 250 con los que se logran las funciones ADELANTE, ATRAS, IZQUIERDA y DERECHA. estoy probandolo con un robot que arme, que evade obstaculos mediante dos bumpers hechos con microswitchs. el problema que tengo, es que cuando lo pongo en funcionamiento y detecto un obstaculo, aveces funciona y aveces no. yo pense que se trataba de ruido en el sistema pero no, lo extraño, es que en proteus me hace lo mismo y no entiendo cual es el error que estoy cometiendo, yo creo que es el micro del driver de motores y por eso les dejo el codigo y la simulacion en proteus para ver si me pueden dar una manito con esto... muchas gracias a todos.
 

Adjuntos

  • pic drive.rar
    42 KB · Visitas: 105
bueno gente del foro, ya solucione el problema jejeje... :D les gane :D... no era el control de motores, era el pic maestro el que hacia el problema. la solucion fue encerrar las rutinas de giro y retroceso del pic maestro en un lazo for...next y listo :)
aca les dejo el codigo corregido por si lo necesitan jeje... les cuento que esta practica forma parte del tutorial de robotica que estoy haciendo y pronto compartire en el post de robotica que hice hace un tiempo.
saludos y gracias amigos

Código:
@ DEVICE MCLR_OFF, XT_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_OFF, PROTECT_OFF
DEFINE OSC 4                  'define el oscilador a 4MHZ
CMCON = 7                     'comparadores off
TrisA=%11111111               'todo el port A como entrada
TrisB=%00000000               'todo el port B como salida
PORTA = %11111111             'todo el port A en 1
PORTB = %00000000             'pone a cero todo el puerto b
derecho var porta.0
izquierdo var porta.1
pulso var portb.0
x var byte
low pulso
inicio:
pulsout pulso,100      'avanza si no hay bumper en contacto   
if derecho=0 AND IZQUIERDO=1 then doblaizq  'ir a doblaizq si hay contacto en bumper derecho 
if DERECHO=1 AND izquierdo=0 then doblader 'ir a doblader si hay contacto en bumper izquierdo
if derecho=0 and izquierdo=0 then retro 'ir a retro si ambos bumpers estan
goto inicio

doblader:                       'contacto en bumper derecho, ir a la izquierda     
for x=1 to 10                    
pulsout pulso,200
pause 200
next 
for x=1 to 10 
pulsout pulso,250
pause 200
next
goto inicio

doblaizq:                     'contacto en bumper izquierdo, ir a la derecha
for x=1 to 10 
pulsout pulso,250
pause 200
next 
for x=1 to 10                    
pulsout pulso,200
pause 200
next
goto inicio

retro: 
for x=1 to 10                   'ambos bumpers en contacto 
pulsout pulso,150          ' retrocede y dobla a la derecha
pause 200
next
for x=1 to 10 
pulsout pulso,250
pause 200
next
goto inicio
 
Última edición:
Saludos D@rio.
Una pregunta + un comentario.
Por que usas For x=0 To 10 Step 1 :confused:
Si hará lo mismo que For x=0 To 10
Ya que los pasos de un For Next se dan de uno en uno por default.
Ósea que el Step 1 esta redundando en el código
hará 11 pasos de todos modos con o sin el Step 1 ;)
Si quieres hacer 10 pasos solamente, seria For x=1 To 10
Ok. Buen código y suerte. :apreton:
 
hola amigos por aqui de nuevo con mis ideas y problemas jeje... bueno, les cuento que he diseñado un controlador de motores microcontrolados para usar en robotica. el circuito se basa en un micro pic12f629, un l293 y funciona asi: recibe un tren de pulsos por gpio3 usando pulsin y los guarda en la variable t1 para despues compararlos con los valores 50,100,150'200 y 250 con los que se logran las funciones ADELANTE, ATRAS, IZQUIERDA y DERECHA. estoy probandolo con un robot que arme, que evade obstaculos mediante dos bumpers hechos con microswitchs. el problema que tengo, es que cuando lo pongo en funcionamiento y detecto un obstaculo, aveces funciona y aveces no. yo pense que se trataba de ruido en el sistema pero no, lo extraño, es que en proteus me hace lo mismo y no entiendo cual es el error que estoy cometiendo, yo creo que es el micro del driver de motores y por eso les dejo el codigo y la simulacion en proteus para ver si me pueden dar una manito con esto... muchas gracias a todos.

Que tal dario, una forma mas resumida ya que estas usando trenes de pulso, pues usa un PIC y un Servomotor, quitale el tapón de tope para que gire a 360 grados y déjale el circuito de control que trae, así descartarías la idea de usar un L293, menos complicado, menos circuito y menos consumo.
 
Saludos D@rio.
Una pregunta + un comentario.
Por que usas For x=0 To 10 Step 1
Si hará lo mismo que For x=0 To 10
Ya que los pasos de un For Next se dan de uno en uno por default.
Ósea que el Step 1 esta redundando en el código
jeje... tenes razon, es verdad, ya lo modifico jeje...

Que tal dario, una forma mas resumida ya que estas usando trenes de pulso, pues usa un PIC y un Servomotor, quitale el tapón de tope para que gire a 360 grados y déjale el circuito de control que trae, así descartarías la idea de usar un L293, menos complicado, menos circuito y menos consumo.
hola nano, te cuento que no estoy usando servomotores, si te fijas en la simulacion en proteus y en lo que dije en el primer mensaje, estoy usando un controlador de motores que diseñe que se comporta como un servo pero este tiene la capacidad de controlar 2 motores usando una sola linea de control. de todas formas, gracias por tu recomendacion.
saludosss
 
Hola que tal, aqui molestando de nuevo jeje
bueno ahora ando controlando un motor a paso unipolar de 5 hilos.
ya logre hacer todas sus velocidades horario y antihorario.
solo tengo una pequeña problematica...
cuando pulse un pulsador que se haga una sola secuencia del motor. por ejemplo


trisb=0 ;hacer salidas el puerto b
antihorario:
portb=%0011 ;energiza bobina A y C
PAUSE 5 ;espera 5 mls
portb=%0110 ;energiza bobina C y B
PAUSE 5 ;espera 5 mls
portb=%1100 ;energiza bobina B Y D
PAUSE 5 ;espera 5 mls
portb=%1001 ;energiza bobina D Y A
PAUSE 5 ;espera 5 mls
GOTO antihorario ;continuar girando
END

este programa hace el full step del motor, bueno cuando yo presione un boton solo quiero que se energize la bobina A y C y cuando vuelva a presionar el boton que se energicen las siguiente bobinas que serian C y B, tengo una vaga idea de como hacerlo pero no la puedo aterrizar =(.
Imagino que es con un if dentro de un for, pero no tengo clara la idea

alguna sugerencia??
de antemano gracias
 
Atrás
Arriba