Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

07/05/2012 #1

Avatar de angeldemx

Envio de múltiples variables vía I2C para control de 8 servos
Buen día compañeros del foro e estado trabajando en mi proyecto, donde tengo como objetivo controlar 8 servos, 6 dimmers, y 8 salidas a relevador 8 salidas a Triac, todo esto dependiendo de las señales que reciban los esclavos del micro maestro, al cual se conectan 8 sensores analógicos, para este proyecto decidí emplear un microcontrolador para cada tarea, por lo cual mi red consta de 1 maestro y 3 esclavos.

Ya tengo funcionando los 4 programas lo único que me detiene es el envió de las variables del máster a los esclavos.

Realice un programa de prueba para la comunicacion I2C, el cual envía del maestro al esclavo 8 datos o variables diferentes, empece con un solo dato y este si que trabaja bien, pero al agregar otro dato el esclavo no recibe los datos correctos, de 8 datos recibe 7 datos correctos y siempre el incorrecto me lo muestra en el esclavo como -96 y los otros 7 los recibe en desorden.

En un proyecto anterior emplee comunicacion SPI en el cual pude enviar un conjunto de variables al mismo tiempo y para I2C, quise usar la misma metodología, pero la verdad no se si esta es la manera de enviar las variables de maestro a esclavo, adjunto los programas de prueba.

La metodología que quiero aplicar para controlar el angulo de los servos es la siguiente:

En el maestro se generan 8 variables, las cuales corresponden al angulo que cada uno de los 8 servos.

dato1=Xcifra;
dato2=Xcifra;
dato3=Xcifra;
dato4=Xcifra;
dato5=Xcifra;
dato6=Xcifra;
dato7=Xcifra;
dato8=Xcifra;

despues que ya tengo el valor de cada variable la envio via I2C al eclavo

i2c_start();
i2c_write(0xa0); //la dirección del esclavo
i2c_write(dato1); //los datos a enviar
i2c_write(dato2);
i2c_write(dato3);
i2c_write(dato4);
i2c_write(dato5);
i2c_write(dato6);
i2c_write(dato7);
i2c_write(dato8);
i2c_stop(); //parada de envío

después el esclavo debe leer las variables ordenadamente para que correspondan con el numero de servo.

if (i2c_poll())
{
pwm0=i2c_read(0);
pwm1=i2c_read(0);
pwm2=i2c_read(0);
pwm3=i2c_read(0);
pwm4=i2c_read(0);
pwm5=i2c_read(1);
pwm6=i2c_read(1);
pwm7=i2c_read(1);
pwm8=i2c_read(1);

}

Ya con las variables recibidas vía I2C: pwm1,........,pwm8, el programa de los servos debería funcionar correctamente, ya que este método lo probé vía SPI y funciona sin problemas pero para trabajar con 4 micros en red decidí emplear I2C.

Si alguien ha manejado otro sistema de comunicacion con el cual pueda emplear el envió de varias variables, por favor diganme cual es.

Adjunto los programas de prueba y el archivo de proteus.


MAESTRO:

Código:
#include <18f4550.h>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#device adc=8
#use delay(clock=4000000)
#include <lcd.c>
#use i2c(MASTER,SDA=PIN_B0,SCL=PIN_B1,slow,FORCE_HW)


int8 dato1;
int8 dato2;
int8 dato3;
int8 dato4;
int8 dato5;
int8 dato6;
int8 dato7;
int8 dato8;
void i2cdatos(void);

void i2cdatos()
{
               i2c_start();
               i2c_write(0xa0);
               i2c_write(dato1);     //enviamos un dato, p.e el entero 6
               i2c_write(dato2);
               i2c_write(dato3);
               i2c_write(dato4);
               i2c_write(dato5);
               i2c_write(dato6);
               i2c_stop();
               delay_ms(1000);
}

void main(void)
{
   
   lcd_init();
   lcd_gotoxy(5,1);
   printf(lcd_putc,"i2c COM");
   delay_ms(3000);
   printf(lcd_putc,"\f");
      
      while(TRUE)
      {
           
      
      
      dato1=104;
      dato2=94;
      dato3=84;
      dato4=74;
      dato5=64;
      dato6=54;
      dato7=44;
      dato8=4;
      
      
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%i, %i, %i, %i",dato1,dato2,dato3,dato4);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%i, %i, %i, %i",dato5,dato6,dato7,dato8);
      i2cdatos();      
           }
     
}
ESCLAVO:

Código:
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#include <lcd.c>
#define led        pin_b0
#define led1       pin_b1


#define off OUTPUT_LOW
#define on OUTPUT_HIGH 
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0xa0, slow , FORCE_HW)

int8 PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0;
void i2cdatos()
{
if (i2c_poll())
{
       pwm0=i2c_read(0);
       pwm1=i2c_read(0);
       pwm2=i2c_read(0);
       pwm3=i2c_read(0);
       pwm4=i2c_read(0);
       pwm5=i2c_read(1);      
}

}

void main(void)
{

      
      
      lcd_init();
      lcd_gotoxy(5,1);
      on (led1);
      lcd_putc("Esperando");
      set_tris_B(0x00);
  
  
  OUTPUT_b(0X00);
  
      while(TRUE)
      {
        
i2cdatos();
       
       printf(lcd_putc,"\f");
       lcd_gotoxy(1,1);
       printf(lcd_putc,"%i,%i,%i,%i",pwm0,pwm1,pwm2,pwm3);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"%i,%i,%i,%i",pwm4,pwm5,pwm6,pwm7);        
              
      }
}

En la simulación

el I2C debugger me muestra que después del primer dato enviado los demas datos entregan un Nak y pues esto no debe pasar

Si alguien conoce como enviar mas de una variable a la vez vía I2C agradeceré su consejos.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.