Gracias por responder, si quieres te paso el ISIS, no lo pegue antes por no llenar espacio
// Control de motor paso a paso con un STK6713B y un pic 16F628
// Funciona con pasos completos o medios pasos
// control de I del motor en funcion de dos resistencias en el STK
// paro de motor despues de no recibir pulsos en 3 min
// Pulsos en RB0
// RB1 no se usa
// Direccion en RB2
// Bloqueo en RB3
// seleccion de Paso completo/medio RB4
// Salidas RA0-A
// RA1-B
// RA2-!A
// RA3-!B
#include <16F628A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,MCLR,NOPROTECT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use fast_io(B)
#use fast_io(A)
#BYTE port_A = 5
#define dir_direccion PIN_B2
#define dir_bloqueo PIN_B3
#define dir_paso PIN_B4
// salidas activas con 0
// Unipolar
BYTE ULTIMO_ESTADO=0;
// medio paso
BYTE const paso_medio[8] = {0b00000111,
0b00000011,
0b00001011,
0b00001001,
0b00001101,
0b00001100,
0b00001110,
0b00000110};
// paso completo
BYTE const paso_completo[8] = {0b00001100,
0b00001100,
0b00000110,
0b00000110,
0b00000011,
0b00000011,
0b00001001,
0b00001001};
BYTE const paro_motor[1] = {0b11111111};
static int16 contador = 0;
// interrupcion por sobrecarga del timer
#int_timer1 //Esta funcion es llamada cada vez que
timer_isr() { //timer1 sobrepasa (2^16).
contador++;
}
// interrupcion por cambio de B0
#INT_EXT
void step (void){
int1 Dir;
int1 Bloq;
int1 Paso;
Dir = input(dir_direccion);
Bloq = input(dir_bloqueo);
Paso = input(dir_paso);
If(Bloq)
break;
if (Dir) // comprueba el bit de direccion B2
{
if(ULTIMO_ESTADO==7)
{
ULTIMO_ESTADO=0;
}
else
ULTIMO_ESTADO++;
}
else
{
if(ULTIMO_ESTADO==0)
{
ULTIMO_ESTADO=7;
}
else
ULTIMO_ESTADO--;
}
if(Paso) // si esta a 1 el pin B4 paso completo
port_A = paso_completo[ULTIMO_ESTADO];
else
port_A = paso_medio[ULTIMO_ESTADO];
// resetea el contador de tiempo maximo de motor parado cada vez que llega un pulso
contador = 0;
}
void main()
{
int i;
setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 ); //init timer1
enable_interrupts(INT_TIMER1); //turn on timer1 interrupt
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
ext_int_edge(H_TO_L); //init interrupt edge triggering for B0, Active Low
enable_interrupts(GLOBAL);
set_tris_a(0x00); //set port A&B for correct data i/o directions
set_tris_b(0xFF);
port_A = paro_motor[0];
for (i=0;i<100;i++)
{
port_A = paso_medio[ULTIMO_ESTADO+1];
}
for (i=0;i<100;i++)
{
port_A = paso_medio[ULTIMO_ESTADO];
}
enable_interrupts(INT_EXT); //activa la interrupcion externa de B0
while(TRUE)
{
if(input(PIN_B3))
port_A = paro_motor[0];
}
}
Tambien encuentro un problema en el funcionamiento, si el bloqueo esta puesto PIN_B3 hay pequeños pulsos de salida y no bloquea realmente, y no se porque