/* stepper.c
 * Programa exemplo para controlar um motor de passo unipolar de quatro fases 
 * atraves da placa de interface PCL724.
 * O motor roda N passos para a frente e para tras ate que o utilizador 
 * prima uma tecla.
 */
#include <conio.h>
#include <dos.h>
/* 
 * Registos da placa PCL724
 */
#define BASE 0x20C
#define PortA BASE
#define PortB BASE+1
#define PortC BASE+2
#define CONFIG BASE+3
char roda(int stp, char currStp);
#define N 750
main(){
char posicao;
outportb(CONFIG, 0x80);
do{
	posicao= roda(N,0x01);
	posicao= roda(-N, posicao);
	} while(!kbhit());
}
char roda(int stp, char currStp){
/*
 * currStp - contem o padrao activo no motor de passo
 * stp - contem o numero de passos que se pretendem dar
 */
#define T 105  /* tempo entre passos para um arranque seguro */
#define DT 2   /* constante de aceleracao */
char directo[4]={0x01, 0x02, 0x04, 0x08};
char inverso[4]= {0x08, 0x04, 0x02, 0x01};
char i, t, *ptab;
int stp1, stp2, stp3, passo;
/* Inicializa variaveis */
if(stp<0){
	ptab=inverso;
	stp= -stp;
	}
else ptab= directo;
/* procura indice correspondente a currStp */
for(i=0; ptab[i] != currStp; i++);
i++;
t=T;
/* calcula num_passos em cada fase */
if(stp>100)
	stp1= stp3= 50;
else
	stp1= stp3= stp/2;
stp2= stp-(stp1+stp3);
/* aceleracao */
for(passo=0; passo<stp1; passo++){
	i &= 0x03;
	outportb(PortA, ptab[i++]);
	delay(t);
	t-=DT;
	}
/* full speed */
for( ; passo<stp1+stp2; passo++){
	i &= 0x03;
	outportb(PortA, ptab[i++]);
	delay(t);
	}
/* desaceleracao */
for( ; passo<stp; passo++){
	i &= 0x03;
	outportb(PortA, ptab[i++]);
	delay(t);
	t+=DT;
	}
return(ptab[--i]);
}
/* Back */