TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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 na![Llorica Llorica]()
![Llorica Llorica]()
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.
-
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???