Hola,
tengo un programa de funcionamiento de un motor. Recibo la velocidad por i2c, la proceso y se la envio mediante pwm a la etapa de potencia del motor.
A su vez, necesito leer los datos de un encoder, lo cual lo hago periodicamente cada 122Hz.
Es decir, uso TIMER0, TIMER1 y TIMER2.
todo funciona bien por separado, pero al juntarlo me sale algun tipo de colision, puesto que el motor se me queda a una velocidad fija y no varía. supongo que no actualiza el valor de "pwm1" de forma correcta.
si deshabilito la linea de configuracion de timer0 en el main para no leer el encoder, todo funciona correctamente, pero es totalmente necesario el uso de esa linea, por lo que recurro a vosotros.
el codigo es el siguiente:
#include <16F886.h>
#include <i2c_config.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa1, FORCE_HW)
#define INTS_PER_SECOND 72 // (20000000/(4*256*256))
BYTE array[4];
BYTE pwm1;
BYTE pwm2;
long time=1,flancos=0;
#int_rtcc
void clock_isr()
{
long value1,value2;
output_high(PIN_B1);
if(time==1)
{
value1=get_timer1();
time=2;
}
else
{
value2=get_timer1();
flancos=value2-value1;
time=1;
}
output_low(PIN_B1);
}
#INT_SSP
void ssp_interupt ()
{
BYTE state;
state = i2c_isr_state();
if(state < 0x80) //Master is sending data
{
array[state] = i2c_read();
if(state == 2){ //Second received byte is data
if (array[0]==0x01){
if( bit_test(array[1],7)){
pwm1 = 0;
pwm2 = array[state];
}
else{
pwm2 = 0;
pwm1 = array[state];
}
}
}
}
if(state >= 0x80) //Master is requesting data
{
i2c_write(0x01);
}
}
void main ()
{
enable_interrupts(INT_SSP);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_ccp2(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_0( RTCC_INTERNAL | RTCC_DIV_32); ///SI COMENTO ESTA LINEA, TODO FUNCIONA OK
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //use low power 32kHz crystal
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_timer1(0);
pwm1 = 0;
pwm2 = 0;
while (TRUE){
set_pwm1_duty(pwm1);
set_pwm2_duty(pwm2);
}
}
me podeis echar una mano??
muchas gracias