Hola gente.
Tengo un problemita, nunca use 2 timers juntos y realmente estoy un poco trabado en este momento logre que funcionen los 2 pero no se realmente que es lo que estoy haciendo y el inconveniente que veo es que uno trabaja bastante mas lento que el otro.
Lo que yo necesito es que entre al timer cada 50ms. Alguien podria darme una mano. Les pongo el codigo. Esto mueve 2 motores paso a paso y se le cambian las velocidades con unos botones pero lo que mas importa es la parte de las interrupciones de Timers y las configuracion inicial.
#include <16F873A.h>
#use delay (clock=4000000)
#fuses XT,NOWDT,NOLVP
#define INTS_PER_SECOND 1000 // (4000000/(4*4*250)) (4*Divisor*Interrupciones)
// 0 1 2 3 4 5 6 7 8 9
byte CONST Display2[] = {0b11111111,0b00001100,0b01011011,0b01011110,0b01101100,0b01110110,0b01110111,0b00011100,0b01111111,0b01111110};
int Boton=0;
int Funcion=1;
int Sea=1;
int8 Timer0 = 0, Timer1 = 0;
byte stepper1 = 0, stepper2 = 0;
int speed1 = 20;
int speed2 = 20;
byte const Motor[4] = {0b1100, 0b0110, 0b0011, 0b1001};
drive_stepper1(int speed, char dir, byte steps) {
speed = 0;
delay_ms(speed);
set_tris_c(0xf0);
if(stepper1 == 0) {
output_bit(PIN_C4,1);
output_bit(PIN_C5,1);
output_bit(PIN_C6,0);
output_bit(PIN_C7,0);
}else if(stepper1 == 1) {
output_bit(PIN_C4,0);
output_bit(PIN_C5,1);
output_bit(PIN_C6,1);
output_bit(PIN_C7,0);
}else if(stepper1 == 2) {
output_bit(PIN_C4,0);
output_bit(PIN_C5,0);
output_bit(PIN_C6,1);
output_bit(PIN_C7,1);
}else if(stepper1 == 3) {
output_bit(PIN_C4,1);
output_bit(PIN_C5,0);
output_bit(PIN_C6,0);
output_bit(PIN_C7,1);
}
stepper1++;
if(stepper1==4)
stepper1=0;
}
drive_stepper2(int speed, char dir, byte steps) {
speed = 0;
delay_ms(speed);
set_tris_a(0xf0);
if(stepper2 == 0) {
output_bit(PIN_A0,1);
output_bit(PIN_A1,1);
output_bit(PIN_A2,0);
output_bit(PIN_A3,0);
}else if(stepper2 == 1) {
output_bit(PIN_A0,0);
output_bit(PIN_A1,1);
output_bit(PIN_A2,1);
output_bit(PIN_A3,0);
}else if(stepper2 == 2) {
output_bit(PIN_A0,0);
output_bit(PIN_A1,0);
output_bit(PIN_A2,1);
output_bit(PIN_A3,1);
}else if(stepper2 == 3) {
output_bit(PIN_A0,1);
output_bit(PIN_A1,0);
output_bit(PIN_A2,0);
output_bit(PIN_A3,1);
}
stepper2++;
if(stepper2==4)
stepper2=0;
}
#INT_TIMER0
clock_isr0() { // the RTCC (timer0) overflows (255->0).
if(Timer0++ == 20) {
drive_stepper1(speed1, 'D', 0);
Timer0 = 0;
}
}
#INT_TIMER1
clock_isr1() { // the RTCC (timer0) overflows (255->0).
if(Timer1++ == 20) {
drive_stepper2(speed1, 'D', 0);
Timer1 = 0;
}
}
void main(void) {
set_timer0(0);
set_timer1(0);
setup_timer_0(T1_INTERNAL|T1_DIV_BY_1); // setup interrupts
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // setup interrupts
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
if((int) read_eeprom(1) > 6)
write_eeprom(1,1);
if((int) read_eeprom(2) > 6)
write_eeprom(2,1);
speed1 = ((int) read_eeprom(1)) * 20;
speed2 = ((int) read_eeprom(2)) * 20;
set_tris_b(0x00);
while(true) {
do {
if(!input(PIN_C0)) {
Boton = 1;
}
if(!input(PIN_C1)) {
Boton = 2;
}
if(!input(PIN_C2)) {
Boton = 3;
}
if(!input(PIN_C3)) {
Boton = 4;
}
restart_wdt(); // Puesta a cero del temporizador watchdog
}while(!input(PIN_C0)||!input(PIN_C1)||!input(PIN_C2)||!input(PIN_C3));
delay_ms(30); // Antirebotes
if(Boton==1) {
if(Sea==1)
Sea=2;
else
Sea=1;
Funcion = (int) read_eeprom(Sea);
}
if(Boton==2) {
Funcion++;
if(Funcion==7)
Funcion--;
}
if(Boton==3) {
Funcion--;
if(Funcion==0)
Funcion++;
}
if(Boton==4) {
write_eeprom(Sea,Funcion);
if(Sea==1)
speed1 = Funcion * 20;
else
speed2 = Funcion * 20;
}
output_b(Display2[Funcion]);
do{
restart_wdt(); // Puesta a cero del temporizador watchdog
drive_stepper1(speed1, 'D', 0);
drive_stepper2(speed2, 'D', 0);
}while(input(PIN_C0)&&input(PIN_C1)&&input(PIN_C2)&&input(PIN_C3));
delay_ms(30); // Antirebotes
}
}
Muchas gracias.
Pablo