# Controlar Motor PAP con PIC16F84



## edix/09 (Sep 14, 2010)

Hola, buscando por la red para aprender busque manuales de programacion y en uno encontre la utilidad de lo que queria, que es mover motores PAP pero resulta que los ejemplos que te da el manual es una programacion para mover de izq  a derecha con 2 botones y yo quiero que quede grabada una secuencia y sin la necesidad de apretar botones o solo 1 para que inicie... pensaba algo como que el motor se mueva asia la izq,der,pare,izq,der,para y despues ir agregando si me podrian ayudar se lo estaria agraeciendo.

Saludos


----------



## shadowpucci (Sep 15, 2010)

No se en que querras programar, pero yo tengo un programa hecho en CCS de un motor PAP que en funcion de una señal analogica, va variando su posicion, osea, si tengo 1 volt se queda en X, si tengo 2 gira 50°, si tengo 3, vuelve 180° y asi unas 30 posiciones distintas... es tan sencillo como cargar una tabla y consultarla. 

La tabla la podes grabar en una EEPROM externa, tipo 24C16 y consultarla por I2C, y asi independizarte de grabar la secuencia en el pic....


----------



## edix/09 (Sep 15, 2010)

necesito manejar 2 pap a la ves como mucho, y tu soft puede grabar secuencias?


----------



## shadowpucci (Sep 15, 2010)

no secuencias, sino que yo grabo una tabla mediante datos de puerto serie, y despues consulto esa tabla, es un toque

mañana en el laburo te subo el codigo


----------



## felipeyeah (Sep 16, 2010)

primero que nada debes sacar tu tabla de verdad y tu diagrama de trancisión..


----------



## shadowpucci (Sep 16, 2010)

mira, yo para drivear el motor que uso, lo tengo en el puerto C en la parte baja, entonces con este .h que "arme" (copia parcial del ejemplo de CCS), manejo el motor


```
#byte port_c = 7

byte const POSITIONS[4] = {0b0101,
                           0b1001,
                           0b1010,
                           0b0110};

void drive_stepper(BYTE speed, char dir, BYTE steps) {
   static BYTE stepper_state = 0;
   BYTE i;

   for(i=0; i<steps; ++i) {
      delay_ms(speed);
      set_tris_c(get_tris_c()|0xF0);
      port_c =((port_c & 0xF0)|(POSITIONS[ stepper_state ]|0xF0));
      if(dir!='R')
         stepper_state=(stepper_state+1)&(sizeof(POSITIONS)-1);
      else
         stepper_state=(stepper_state-1)&(sizeof(POSITIONS)-1);
   }
}
```
entonces, para moverlo a la derecha, 20 pasos llamo a 

drive_stepper(speed,´D´,20) 

para moverlo a la izquierda 30

drive_stepper(speed,´R´,30) 

asi, armas una rutina por cada motor. Despues, como tomes y leas los datos es transparente, vos a esa funcion le pasas como queres moverlo y cuantos pasos y listo!


----------



## edix/09 (Sep 16, 2010)

pero yo necesito que por ej el motor gire 30º para un ldo pare un ratito gire para el otro lado 60º cambie rapidamente asia el otro lado 50º asi... que varie el movimiento pero no necesite el puerto seria que ya kede en el pic


----------



## shadowpucci (Sep 16, 2010)

bueno, ahi tenes que armar la rutina de traer del puerto serie y grabarlo en una memoria. 

tomas los datos del puerto serie, y los almacenas en una memoria IIC, como te comente antes. Una vez que tienes la secuencia almacenada, la vas leyendo secuencialmente, ni mas ni menos....


----------



## edix/09 (Sep 17, 2010)

aver  shadowpucci no entendi vien que es lo del codigo es una programacion o ke? disculpa mi ignorancia...

saludos


----------



## shadowpucci (Sep 17, 2010)

Es un archivo .H para CCS, el cual posee la rutina que genera la se secuencia para el PAP. Tiene un FOR que lo hace tantos steps del PAP le indiques, un comando speed(que es la cantidad de tiempo en ms entre paso y paso) y la direccion, osea, si va padelante o patra. 

Después, con otro archivo generas el sistema de secuencias, y cuando tenes que mover el motor, llamas a esta rutina y listo!

El sistema de secuencias tampoco tendria que ser muy dificil, pensandolo un poco, es tomar un dato de velocidad y direccion y decirle cuanto moverse a esta rutina...

algo asi

```
#include "TEST-16F684.h"
//#include <2416.C>
#include "i2c.h"
#include "step.h"

int a;
char get_data_eeprom(VOID);

void main()
{
DO
   {
   for(a=0; a<fin_tabla ; a++)
   drive_stepper(speed, dir,get_data_eeprom()); 
}WHILE ( BOTON );
}

char get_data_eeprom(VOID)
{
   CHAR i = 0;
   I2C_start ( );     // Inicio de transmision a EEPROM
   I2C_write ( ADDRESSW );   // Instruccion de escritura de la memoria
   I2C_write ( a );     // Registro a leer
   I2C_start ( );     // Repetir condicion de START
   I2C_write ( ADDRESSR );   // Instruccion de lectura de la memoria
   i = I2C_read ( ); // Leer el registro 
   I2C_noack ( );     // NO enviar ACK para terminar la lectura
   I2C_stop ( );     // Generate stop
   return i;
}
```

el i2c.h lo podes sacar de aca que lo deje posteado
https://www.forosdeelectronica.com/f24/comunicacion-i2c-problemas-42340/


----------



## edix/09 (Sep 19, 2010)

hola de nuevo, el que es 12c.h va en otro pic? asi se comunican? o va en el mismo? es que me mescle un poco...


----------



## lubeck (Sep 19, 2010)

> hola de nuevo, el que es 12c.h va en otro pic?


no... en ese codigo es para utilizar una memoria eeprom como esclavo... no es otro pic... 
imagino que ahi esta almacenado las secuencias del motor o algo asi...


----------



## shadowpucci (Sep 20, 2010)

lubeck dijo:


> no... en ese codigo es para utilizar una memoria eeprom como esclavo... no es otro pic...
> imagino que ahi esta almacenado las secuencias del motor o algo asi...



tal cual. Solo que yo no guardo secuencias, guardo otros datos, pero tranquilamente puede almacenar una secuencia


----------



## edix/09 (Sep 20, 2010)

ok ya estube leyendo un poco mas sobre pic y es bastante amplio el contenido en el manual que tengo no tenia nada importante... aver ayudenme a programar el pic y luego lo de las secuencias asi las cambio cuando necesite... me gustaria saber tambien sobre la parte de la electronica solo es mover 2 Motore PAP.

Saludos y gracias por ayudarme.


----------



## lubeck (Sep 20, 2010)

> aver ayudenme a programar el pic


ayudame a ayudarte... que lenguaje de programación conoces mas???
tienes un programador de pic o construiras uno???


----------



## edix/09 (Sep 21, 2010)

me toy por comprar 1 programador, estoy viendo cosas de C... pero no mucho vos que lenguaje utilizas?

Saludos


----------



## lubeck (Sep 21, 2010)

> vos que lenguaje utilizas?


yo utilizo picbasic pro para basic y ccs para c... domino un poco mas el basic y a mi se me hizo super sencillo aprender...
en c es un poco mas laborioso pero da mejores resultados... segun he leido...


----------

