# PIC16F628A y control de servo



## MmUeRtTe (Nov 28, 2010)

soy nuevo en esto de la electronica y tengo un problema que para mi es importante y complicado de resolver.

Tengo un problema  a la hora de programar este pic (16f628a), ya que no se como usar el oscilador interno a 4mhz, hasta ahora lo he venido haciendo con el propio programador (WinPic), pero para mi nuevo programa nada funciona, eso si en proteus funciona perfectamente.

Codigo en PicBasicPro


```
n var byte
portb=0

inicio:
for n=50 to 250 step 1
pulsout portb.0,100
pause 100
next

for n=50 to 250 step 1
pulsout portb.0,150
pause 100
next
goto inicio

end
```

Este codigo en proteus funciona perfectamente, pero luego en la placa de prototipado no funciona.

El esquema que monto es el siguiente  (va en paint porque ahora no tengo eagle)

http://img88.imageshack.us/img88/4061/1servo.png


espero que puedan ayudarme, gracias


----------



## ByAxel (Nov 28, 2010)

Curso programacion de pic en bsic pro... desde la 1ra página hacen uso de los fuses y como declararlos; busca el archivo del PIC en C:\PBP\INC, ahí están los fuses.
Los importantes son el tipo oscilador, el MCLR (ON/OFF) y el LVP (en OFF).

saludos.


----------



## scythercap (Sep 2, 2012)

Hola a todos, primero felicitarlos por el foro, la verdad muy completo, y si bien no suelo escribir, lo leo a menudo.
Como la mayoria de los que escribimos , acudo a uds para solucionar un problema que me esta eliminando los pocos pelos que me quedan, es el siguiente

quiero hacer algo tan sencillo como automatizar un servomotor (corona cs-928bb) con un pic (16f628a) ultilizando su oscilador interno de 4mhz, y a travez de PWM que, segun tengo entendido, es el modo de hacerlo, cabe aclarar que lo intento hacer en PIC BASIC.

a continuacion el modesto programa:

led3 var portb.3
pul var portb.0
n var byte



inicio:
        for n= 30 to 240 step 10            
        pwm pul,n,n
        next

        for n= 240 to 30    step -10
        pwm pul,n,n        
        next

        high led3
        pause 1000
        low led3

        goto inicio
        end


la configuracion del oscilador interno la hago con el pickit2, donde, en los bits de configuracion pongo "3D1C ", (asi al menos creo habilitar los 4mhz, desabilitar el WD y hacer el MSCL interno)

pero....me sucede lo siguiente...cuando pruebo el programa con leds, todo barbaro, su intencidad varia de acuerdo a lo pensado, pero cuando conecto el motor ZAZ!, se va del todo hacia un lado, y queda haciendo fuerza...ni ganas de volver, o parar por ahi, no importa las variaciones que le haga, siempre gira su totalidad en sentido horario y ahi queda empujando, no se que hacer, la verdad, me tiene mal.

espero haber sido explicito en los detalles, desde ya muchas gracias por vuestra colaboracion


----------



## Scooter (Sep 3, 2012)

¿Y el esquema? No solo de código vivimos.
De hecho tiene todos los puntos de ser un problema de hardware.


----------



## scythercap (Sep 3, 2012)

bueno, como te digo, alimento el pic con un 7805, del mismo modo que al servo... luego conecto el cable naranja (el de señal según creo) al puerto b0 del pic y un led (con una resistencia de 330 ohms a tierra) en el puerto b3. con el led todo bien, incluso, si pongo leds en vez de el motor, la intensidad varía, pero todo se complica al poner el servo (sus cables son: rojo, marron y naranja)

 en cuanto al esquema, supongo que es a esto a lo que te referias, lo hice en proteus (en ese simulador tampoco funciona) a modo de ver las conecciones hechas....
gracias


----------



## carferper (Sep 4, 2012)

la verdad no estoy familiarizado con Basic pero creo que el archivo agjunto te puede ayudar en tu proyecto.  Es un ejemplo muy sencillo en JAL del control de un servo usando el PIC12F683. En especial te recomiendo que compares las señales PWM del osciloscopio con las de tu proyecto. Tambien ten en cuenta que cada servo es diferente, en este ejermplo uso: pulsos de 1ms minimo para -90 hasta 2.5ms maximo para 90.  Los pulsos estan separados 20ms entre ellos.  Tambien no te olvides en la implementacion fisica considerar la corriente que el servo requiere para operar y lo que el micro puede abastecer.

saludos


----------



## fife89 (Sep 4, 2012)

Bueno, lo primero que debes hacer es separar la alimentacion del pic y el servo , alimentas el pic con 5v de un 7805  y otro 7805 exclusivo para el servo , dos alimentaciones distintas con el GND comun
podrias usar dos baterias de 9v comun y corrientes.
luego el osc 4mhz esta bien 
debes tener claro el servo que usaras y su respectivo datasheet para leer los datos tecnicos referentes 
necesitas el standar para el oscilador y su reset

luego ya que tienes esto montado y con un pin seleccionado para el servo digamos 
portb.5 sale

te dejo un codigo ejemplo 

```
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo     var portb.5;control de servo
PORTB.5=0

inicio

for i=150 to 250 step 1
pulsout servo,i
pause 10
next i
go inicio

end
```

donde pause 10(valor muy importante) es el tiempo en ms necesario para un servo convencional
 este es para un futaba s3004 
servo toma el valor de i 
por lo tanto cada 10 ms avanza , si quieres aumentar su velocidad solo cambias el paso  (step) a 2 o otro valor mas alto en ves de ir de 1 en 1 va de 2 en 2 y asi
150 es el punto centro 
si quieres centrar el servo y mantenerlo ahi te dejo un ejemplo 

```
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo     var portb.5;control de servo
PORTB.5=0

inicio

pulsout servo,150
pause 10
goto inicio

end
```
donde 150 es el valor de la mitad, si quieres cambiar la posicion cambia el 150 por un valor entre (1-250)

otro ejemplo para retroceder


```
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo     var portb.5;control de servo
PORTB.5=0

inicio

for i=250 to 150 step 1
pulsout servo,i
pause 10
next i
go inicio
```

Saludos
espero que te sirva 
PDD perdon por la escritura jeje cualquier cosa me avisas


----------



## scythercap (Sep 5, 2012)

gracias por las respuestas, la datasheet del servo me fue imposible de encontrar (ni siquiera en su pagina http://www.servodatabase.com/servo/corona/cs-929mg) lo mas parecido es este modelo, el mio es cs-928bb

yo estaba empecinado en hacerlo con la orden PWM, pero bueno, probare con la orden PULSOUT, y les cuento, otra cosa, no tengo pensado usar reset en MASTERCLEAR, ya que mi idea es que funcione indefinidamente, por eso lo configure de modo interno con los BITS DE CONFIGURACION, al igual que el OSCILADOR (interno de 4Mhz) con el bit 4 en 1 y los bits 1 y 0  en 0


----------



## fife89 (Sep 5, 2012)

te recomiendo esa configuracion  si no quieres fallos ademas tienes el control del programa y el corre indefinidamente dependiendo de tu programacion solo mantienes un bucle infinito


----------

