TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Ercuito en 31 de Mayo de 2005, 10:50:00

Título: Problema comunicacion i2c o eso creo
Publicado por: Ercuito en 31 de Mayo de 2005, 10:50:00
Buenas, os explico, estoy haciendo una comunicacion i2c entre dos pics en la que el master le envia un byte al esclavo, el problema es q si al programa del esclavo le añado cosas no se pq el dato recibido del master es su direccion y no el dato enviado. aki os pongo el programa del esclavo

#include <16f876.h>

#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0X08, fast , FORCE_HW)
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5   // Identificador asociado al registro de dirección 5
#byte port_b = 6   // Identificador asociado al registro de dirección 6
#byte port_c = 7   // Identificador asociado al registro de dirección 6


void main(void){

   int dato,vel,k,duty_PWM1,duty_PWM2,e1,e2;
   signed int e;

   set_tris_a(0b00010000);
   set_tris_b(0b00000000);//
   port_b=0;   //Apaga todo lo del puerto B

   setup_counters(rtcc_ext_h_to_l,rtcc_div_1);
   setup_timer_1(T1_EXTERNAL);
   set_timer0(0);
   set_timer1(0);

   setup_timer_2(T2_DIV_BY_16, 249, 1);
   setup_ccp1 (CCP_PWM);
   setup_ccp2 (CCP_PWM);
   dato=0;
   e=0;
   duty_PWM1=0;
   duty_PWM2=0;

   while(1)
   {
   if(i2c_poll())
            {
               dato=0;
               dato=i2c_read();
               i2c_stop();
            }

   vel = dato&0b00001111;//bits de velocidad
   if(vel>10)
   {
       duty_PWM1=0;
   }

   duty_PWM1 = 25 * vel;//25 int 100 long
   duty_PWM2 = 25 * vel;
   while(!i2c_poll())
      {
            port_b=dato&0b00110000;
            set_pwm1_duty(duty_PWM1);
            set_pwm2_duty(duty_PWM2);
            //set_timer0(0);
            //set_timer1(0);
            //delay_us(500);      //adquiere valores
            //e1=get_timer0();
            //e2=get_timer1();
            //e=e2-e1;  
            //duty_PWM1=duty_PWM1+e;
         }
      }
  }
El programa asi como esta me va a la perfeccion pero es añadir cosas y na de naLloricaLlorica
La idea es añadir al programa un control de motores el cual consiste en q por medio de dos encoders calcule un error y este aplicarlo al valor de pwm, pero si pongo esto y lo ejecuto tanto en el proteus como fisicamente el programa no me va. Me han comentado q puede ser por limitaciones del pic (16f876).
Muchas gracias.
Título: RE: Problema comunicacion i2c o eso creo
Publicado por: Ercuito en 31 de Mayo de 2005, 11:33:00
Bueeeeeee creo q ya esta solucionado, el problema estaba en el master pero al ponerle un delay entre i2c_write(direccion) y i2c_write(dato); y i2c_stop(); el programa funciona correctamente, lo q no entiendo es q antes sin ponerlos tb me funcionaba pero al intentar añadir cosas no, pq sera???