TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Algec en 19 de Abril de 2008, 15:37:20
-
Porque si uso delay_ms(100) por ejemplo antes de habilitar la interrupcion externa de B0 no me funciona? en cambio si meto codigo pero no el delay si
PEgo el codigo que falla
asi funciona
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
asi No funciona la interrupcion
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];
}
delay_ms(100);
enable_interrupts(INT_EXT); //activa la interrupcion externa de B0
-
Hola
Sube el programa completo por favor, incluyendo el manejo de la interrupción del timer y del cambio en b0.
-
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
-
Hola
Te recomiendo que le des una leída a este tema
http://www.todopic.com.ar/foros/index.php?topic=21226.0
Usa la recomendación de Pocher de incluir un asm en el código de la atención a la interrupción.
Veo innecesario que pongas...
while(TRUE)
{
if(input(PIN_B3))
port_A = paro_motor[0];
}
ya que dentro del void del intrb0 lo vuelves a checar. Sólo déjalo como
while(1);
y en la interrupción pon:
If(Bloq)
{
port_A = paro_motor[0];
break;
}
-
Lo de replicar el paro es poque si llega el cambio del bloqueo y no ha llegado a generarse de nuevo la interrupcion el motor se queda con corriente ya que se han quedado salidas activas. Leere el post que me recomiendas y gracias de nuevo
-
Vaya ya aparecio el fallo, y no era de soft, mis disculpas, era porque me habia equivocado al poner el pic en el ISIS porque aproveche un esquema anterior que llevaba un 16F84 y al ser casi similares en esquema no lo son en funcionamiento.
Gracias de todas formas, ya funciona correctamente