Autor Tema: Problemas con I2C en CCS 3.150  (Leído 2080 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pauvictor

  • PIC10
  • *
  • Mensajes: 1
Problemas con I2C en CCS 3.150
« en: 30 de Abril de 2005, 08:41:00 »
Hola.

Estoy intentando comunicar al menos dos placas con i2c con el pic 16f876 a 4MHz. Para conectar los PICs, uso en las dos lineas del I2C resistencias de pull up de 1K ohmio. La idea es tener un master que recive comandos del PC por rs232 y le manda las ordenes a los esclavos por i2c, pero no se como hacer que funcione.

El maestro creo que esta bien, pero el esclavo me plantea el problema de que no encuentro ejemplos de pics actuando como esclavo en C. Si alguien puede ayudarme se lo agradeceria. El codigo del maestro y del esclavo es el siguiente:

Maestro:

//i2cmaster.h
Codigo:

#include <16F876.h>

#device adc=8
#use delay(clock=4000000)
#fuses XT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)



//i2cmaster.c
Codigo:

#include ".\i2cmaster.h"

void main() {
   int i;
   int dato;
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,WDT_18MS);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   printf("Hola" ) ;
   while(1){

      for(i=0;i<256;i++){
         printf("T1" ) ;
         i2c_start();      
         i2c_write(0x03);   // La direccion del esclavo (direccion 3)
         i2c_write(i);                   // Dato a escribir
         printf("T2" ) ;
         i2c_stop();

         i2c_start();      
         i2c_write(0x03);   // La direccion del esclavo (direccion 3)
         dato=i2c_read();   // Dato a leer de ese esclavo
         printf("T3" ) ;
         i2c_stop();
         putc(dato);       // Se devuelve el dato al puerto rs232
      }
   }
}



//i2cslave.h
Codigo:

#include <16F876.h>
#device adc=8
#use delay(clock=4000000)
#fuses XT,WDT
#use i2c(Slave,Slow,sda=PIN_C4,scl=PIN_C3,force_hw,address=0x03)




//i2cslave.c
Codigo:

#include ".\i2cslave.h"
void main() {
 
   int dato;

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   while(1){
     dato = i2c_read();
     i2c_write(255-dato);   // La direccion del esclavo (direccion 3)
   }
}



He probado con fast y slow en la configuracion de i2c, he probado a forzarle el hardware al master, y no hay forma. Cuando los dos pics estan conectados, el master solo llega a escribir HolaT1 en el Rs232, y ahi se bloquea. Sin embargo si desconecto los 3 cables que unen las 2 placas, el master empieza a iterar continuamente mostranto T1T2T3.

Si alguien sabe que puede pasar o que hago mal se lo agradeceria mucho. Si teneis algun codigo simple de ejemplo para conectar maestro y esclavo que este testeado y pueda usar para asegurarme de que el hardware esta correcto tambien me seria de mucha utilidad.

Con las patillas del PIC del puerto A y B no he hecho nada especial, asiq ue estan al aire. No se si eso puede influir en la direccion del esclavo o algo.

Agradezco cualquier respuesta.

Gracias.

Adios.

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: Problemas con I2C en CCS 3.150
« Respuesta #1 en: 01 de Mayo de 2005, 11:39:00 »
Hummm, creo que esas resistencias de polarización son pequeñas, prueba a meter unas de valor 4k7 mínimo.

Por otra parte, si necesitas un ejemplo muy sencillo, mira a ver si te puede servir este, comunicación entre dos pics:

Fichero para simular con proteus:

http://www.telecable.es/personales/trelles2/esquemas/i2c_pics.DSN

El código:

http://www.telecable.es/personales/trelles2/codigo/Codigo%20i2c.rar

Un saludo.


 

anything