# control de motor pap bipolar con pic 16f84a, ayuda con el codigo



## master666 (Sep 11, 2010)

hola soy nuevo en la programacion de pic  , y me he estado documentando mucho sobre los lenguages que podia utilizar, finalmente me decidi por hacerlo con CCS  , pero ahora tengo muchas dudas sobre el codigo, ya que no lo he probado, quiciera ver si alguno de ustedes me podria ayudar  .

La idea del programa es que por el puerto A sean las entradas, y por el puerto B las salidas para el puente h que maneja el motor paso a paso bipolar, que subira o bajara una plataforma por medio de un cable y unas poleas.

Se encuentran como dos entradas 2 switch que me diran la posicion de la plataforma, el primer switch que me dira si la plataforma esta en el limite de arriba y el segundo si la plataforma se encuentra en el limite abajo, conectados a pin a0 el de arriba y pin a1 el de abajo. 

Pero el motor se activara al poner el pin a2 , el pin a3 y el valor del switch de abajo en estado alto si se desea ir arriba y en estado pin a2 = 0 , pin a3 = 1 y el valor del switch de arriba en 1 si se desea ir abajo.

Siendo pin a2 y pin a3 un par de switch que el usuario manejara.

Tambien se encuentran definidas las rutinas para que el motor se mueva en un sentido o en el inverso, 


aqui les adjunto el codigo, se que no esta bueno, bueno  . pero estoy comenzando, desde ya muchas gracias, espero su pronta respuesta.




```
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT // Opciones de configuración
#use delay(clock=4000000)              // Velocidad del Cristal : 4 Mhz
#use standard_io(A)                    // puerto A como digital
#use standard_io(B)                   // puerto B como digital
#define PIN_A0  40
#define PIN_A1  41
#define PIN_A2  42
#define PIN_A3  43
#define PIN_A4  44


#define Pos1arr    b'11111010'
#define Pos2arr    b'11111001'
#define Pos3arr    b'11110101'
#define Pos4arr    b'11110110'

#define Pos1aba    b'01010000'
#define Pos2aba    b'01100000'
#define Pos3aba    b'10100000'
#define Pos4aba    b'10010000'

#define Frenoarr   b'11110110'
#define Frenoaba   b'10010000'



Long const tt=200;                    // Retardo 500 mS
Long const tz=100;                    // Reatrdo 200 mS

///DECLARACIONES DE FUNCIONES

void arriba(void);                   // mueve el motor hacia arriba
void abajo(void);                 // mueve motor hacia abajo
int valorswarr,valorswaba,valorpin;
valorswarr=input(pin_a0);
valorswaba=input(pin_a1);
valorpin1=input(pin_a2);
valorpin2=input(pin_a3);
///PROGRAMA

void main(void)
{

  set_tris_a(0b01111);            // PORTA 4 salida demas entradas
  set_tris_b(0b00000000);            // PORTB como salida
  
do
{
  if((valorswaba==1)&&(valorpin1==1)&&(valorpin2==1))
  {                                
    arriba();
  }
    if((valorswarr==1)&&(valorpin1==0)&&(valorpin2==1))
  {
    abajo();
  }
}while(TRUE);
  
  
}

void arriba(void)
{      
int i=0;
if(
  do{
  output_b(Pos1arr);
  delay_ms(tt);
  output_b(Pos2arr);
  delay_ms(tt);
  output_b(Pos3arr);
  delay_ms(tt);
  output_b(Pos4arr);
  }  while((i!=8)||(valorswarr==1))

}

void abajo(void)
{
int i=0;
do{
  output_b(Pos1aba);
  delay_ms(tt);
  output_b(Pos2aba);
  delay_ms(tt);
  output_b(Pos3aba);
  delay_ms(tt);
  output_b(Pos4aba);
}while((i!=8)||(valorswaba==1))
}
```


----------



## uneof (Sep 12, 2010)

Si eres nuevo con los PIC prende fuego a todos los 16F84A que tengas. A la larga lo agradecerás. A cambio consigue 16F628A o 16F88, que aparte de considerablemente más baratos, tienen muchísimas más cosas.


----------



## Trev (Sep 21, 2010)

Hola master666.. he visto rapidamente el código yo tambien uso ccs, me parece 
1º Te estas complicando la vida de usar un PIC y programar el código cosa que se puede hacer con un 555 y un L297 sin programar nada y con un simple pot puedes probar a diferentes velocidades..y el puente o un puente integrado como un L293
2º Si = deseas usar el PIC para practicar o por lo q sea el código esta bastante bien pero en las funciones arriba() y abajo() estas dando 32 pasos solamente y no incrementas la variable i local a esas funciones, dame el nº pasos por vueltas de tu motor, ¿son 32 pasos los q necesitas? en todo caso cambia en los while( i!=8 || (xxx==1)) por while( xxx==1) o sea q siga hasta q llegue al final de carrera


----------



## master666 (Sep 21, 2010)

gracias por responder, lo que pasa es lo siguiente, estoy utilizando el pic por la implementacion que le doy ademas de manejar el motor maneja otras cosas, y estoy utilizando un puente H ya que en nicaragua no pude encontrar ninguno de los circuitos integrados que acabas de mencionar.

con respecto al while lo puse como un limitante, pero lo pienso quitar y solo dejar dos variable que me den el estado del pin y este me diga si se encuentra en el limite superior (donde va el switch) y otro si llego al limite inferior( el otro switch)


----------



## Trev (Sep 21, 2010)

Fijate ahora q lo miro bien al código que tu no estas leyendo nada en las entradas, solo lo haces una vez muy rapidamente en el main antes del bucle infinito eso esta bien,estas asignando a las variables valorswarr y valorswaba lo que de los (pulsadores o llaves) se lee al principio solamente de tu programa cosa q necesitas hacer en las funciones arriba() y abajo() que tomas esos valores q lees al principio pero q no se te estan actualizando por ej. mientras esta subiendo la plataforma valorswarr no se actualiza solo ahi debes poner un 
arriba()
{
do
{
tu codigo
}
while(input(PIN_A0));
o sea el do-while de esta forma se ejecutará (la plataforma seguirá subiendo) hasta que la función input(PIN_A0) devuelva un 0 y el while se aga falso o sea cuando llegue hasta arriba, no se si me entendes?
en los if del main tenes el mismo problema
yo usaria un pulsador(con una resistencia de pull-up al pin) para poner en marcha el motor y una llave para pararlo


----------



## master666 (Sep 22, 2010)

me estas diciendo dentro de la funcion arriba???

void arriba(void)
{
int i=0;
do{
output_b(Pos1arr);
delay_ms(tt);
output_b(Pos2arr);
delay_ms(tt);
output_b(Pos3arr);
delay_ms(tt);
output_b(Pos4arr);
} while(input(PIN_A0)==0);

Asi????
yo pensaba que automaticamente la variable tomaba el valor actualizado del pin o no  es asi????

y la resistencia pull-up es la que tiene integrada el circuito????


----------



## Trev (Sep 22, 2010)

Hola master666



> yo pensaba que automaticamente la variable tomaba el valor actualizado del pin o no es asi????


No..no es asi cuando haces una asignacion (como la que hiciste al comienzo del programa) si o cuando la usas directamente como te indique



> me estas diciendo dentro de la funcion arriba???



Haz lo mismo en las dos funciones y en los if de la funcion principal tambien.



> y la resistencia pull-up es la que tiene integrada el circuito????


No,las que tra integradas el pic 16f84 estan en el puerto B de los pines B7 a B4 y debes activarlas por programa asi

port_b_pull_ups(TRUE);

Tienes proteus para simular circuitos?, si lo tienes te doy una mano,sino desgargatelo y subite el diseño y te ayudo con este programa, trata de trabajar en conjunto con el simulador asi las cosas son mas claras,un saludo


----------

