TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: badtzdizzy en 02 de Abril de 2004, 11:58:00
-
Hola a Todos
Me llamo Jaime y pues soy un novato en esto de la programacion de pics en C, hasta ahora he hecho algunos programitas sencillos para irme adentrando poco a poco en esta onda. Pero ahora necesito que me echen la mano, estoy haciendo un programa para controlar un motor a pasos, y de manera general lo quiero controlar con tres botones, uno para giro a la izquierda, otro para giro a la derecha otro para detener. Al iniciar el programa quiero que espere a que yo oprima un boton para que comience a girar, y cuando oprima el boton de deterner pues que se detenga en la secuencia que iba. Entonces si yo oprimo alguno de los botones de giro, necesito que el motor empiece a girar pero en a partir de la secuencia en la que se detuvo, ya sea a la izquierda o a la derecha. Lo he intentado por medio de interrupciones por cambio en el puerto B pero no se que estoy haciendo que no me sale lo que necesito. Aqui esta el codigo que hice para que me digan que ando haciendo mal, de antemano muchas gracias y saludos desde Mexico.
#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#byte PORTB=0x06
#BIT RBIF=0xB.0
#define DELAY 1000
#define SWEEP 4
#define NUMSTEPS 4
int tecla = 0;
char step[] = {5, 9, 10, 6};
char stepPos = 0;
#int_RB
void interrupt()
{
int current;
static int last=0xF0;
output_high(PIN_C1);
current=PORTB;
if (!(bit_test(current,5))&&(bit_test(last,5))) {tecla=2;}
if (!(bit_test(current,6))&&(bit_test(last,6))) {tecla=0;}
if (!(bit_test(current,7))&&(bit_test(last,7))) {tecla=1;}
delay_ms(50);
last=current;
}
void iniciar()
{
RBIF=0;
enable_interrupts(int_RB);
enable_interrupts(global);
}
void espera()
{
tecla=0;
while(tecla==0);
}
void pulseMotor()
{ aqui mando las salidas con un retardo
............ }
void stepMotorForw()
{ mando la secuencia hacia adelante
............... }
void stepMotorBack()
{ mando la secuencia al reves
......}
main()
{
char i;
set_tris_d(0x00);
iniciar();
while (TRUE)
{
do
{
espera();
}
while ((tecla!=2)&&(tecla!=1));
if (tecla==1)
{
for(i=0; i < SWEEP; i++)
{
output_low(PIN_C1);
pulseMotor();
stepMotorForw();
}
}
if (tecla==2)
{
for(i=0; i < SWEEP; i++)
{
output_low(PIN_C1);
stepMotorBack();
pulseMotor();
}
}
}
}
Se aceptan sugerencias y correcciones, gracias.
-
Creo que lo has complicado en exceso, hay que buscar soluciones sencillas, cortas y fáciles de entender. Je, je eso no siempre es fácil, verdad.
No te preocupes dejo la solución en ejemplos para simular.
Un saludo
-
Pues de que me la complico, pues creo que tienes toda la razon, y es que como soy nuevo en esto, pues todavia no conozco todas las funciones. De todos modos muchas gracias por tu ayuda, y cuando ya logre algo mejor lo subo para que lo cheques, de antemano gracias Pocher.