Saludos compañeros, como el titulo lo dice, tengo problemas con mi proyecto.
Como antecedentes ya logre la comunicación via I2C entre 4 microcontroladores, 1 maestro (pic18f4550) y 3 esclavos (pic18f452, pic16f877a y pic16f877), pero en la programación de uno de ellos (pic15f877a el cual controla 8 servos) el programa funciona correctamente, pero al agregar el código para la comunicacion I2C la lectura que obtengo del máster es inconsistente ya que el dato que recibe es correcto pero al generarse la interrupción del timer0 el dato obtenido del máster es incorrecto.
Y así continua fluctuando entre dato correcto e incorrecto cada interrupción del timer0
adjunto el programa:
Cabe recordar que el programa funciona correctamente sin agregar el código del I2C.
Y si empleo en el codigo la función i2c_poll() el programa no anda para nada.:enfadado:
El circuito ya lo tengo armado en la protoaboard y simulado en ISIS de proteus y en los dos obtengo el mismo resultado.
Adjunto los archivos de Proteus y los programas de CCS.
si alguien me puede dar algún consejo u orientación en el tema se lo agradeceré por siempre, ya que solo es esto lo que me detiene para concluir mi proyecto.
Como antecedentes ya logre la comunicación via I2C entre 4 microcontroladores, 1 maestro (pic18f4550) y 3 esclavos (pic18f452, pic16f877a y pic16f877), pero en la programación de uno de ellos (pic15f877a el cual controla 8 servos) el programa funciona correctamente, pero al agregar el código para la comunicacion I2C la lectura que obtengo del máster es inconsistente ya que el dato que recibe es correcto pero al generarse la interrupción del timer0 el dato obtenido del máster es incorrecto.
Y así continua fluctuando entre dato correcto e incorrecto cada interrupción del timer0
adjunto el programa:
Código:
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#byte portb=0x06
#byte trisb=0x86
#include <lcd.c>
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0XA0, slow , FORCE_HW)
#bit Bit_PWM0 = PORTb.0
#bit Bit_PWM1 = PORTb.1
#bit Bit_PWM2 = PORTb.2
#bit Bit_PWM3 = PORTb.3
#bit Bit_PWM4 = PORTb.4
#bit Bit_PWM5 = PORTb.5
#bit Bit_PWM6 = PORTb.6
#bit Bit_PWM7 = PORTb.7
void main (void);
void Generador_pwm (void);
int8 control_PWM=0,dato;
int8 PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0;
#int_Timer0
void Generador_pwm(){
control_PWM++;
Bit_PWM0=1;
Bit_PWM1=1;
Bit_PWM2=1;
Bit_PWM3=1;
Bit_PWM4=1;
Bit_PWM5=1;
Bit_PWM6=1;
Bit_PWM7=1;
}
if (control_PWM==PWM0) Bit_PWM0=0;
if (control_PWM==PWM1) Bit_PWM1=0;
if (control_PWM==PWM2) Bit_PWM2=0;
if (control_PWM==PWM3) Bit_PWM3=0;
if (control_PWM==PWM4) Bit_PWM4=0;
if (control_PWM==PWM5) Bit_PWM5=0;
if (control_PWM==PWM6) Bit_PWM6=0;
if (control_PWM==PWM7) Bit_PWM7=0;
set_timer0(255);
}
void main(){
set_tris_b(0x00);
pwm0=11;
pwm1=11;
pwm2=11;
pwm3=11;
pwm4=11;
pwm5=11;
pwm6=11;
pwm7=11;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
lcd_init();
while (true){
lcd_gotoxy(5,1);
printf(lcd_putc,"El numerito es");
lcd_gotoxy(5,2);
printf(lcd_putc,"%i",dato);
dato=i2c_read();
}
}
Cabe recordar que el programa funciona correctamente sin agregar el código del I2C.
Y si empleo en el codigo la función i2c_poll() el programa no anda para nada.:enfadado:
Código:
if(i2c_poll())
{
dato=i2c_read();
}
Adjunto los archivos de Proteus y los programas de CCS.
si alguien me puede dar algún consejo u orientación en el tema se lo agradeceré por siempre, ya que solo es esto lo que me detiene para concluir mi proyecto.
Adjuntos
Última edición: