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

Temas similares

05/04/2013 #1


Comunicación I2C en CCS con memoria Eeprom M24512
Hola, tengo una duda a cerca de la escritura y lectura en la eeprom m24512 la cual se comunica con el pic mediante la interfaz I2C. En el libro simulador ccs y simulador proteus para microcontroladores pic (primera edición) viene un ejemplo en el capitulo 7, página 200, en general entiendo la mayor parte del código solo una sección es la que no entiendo, buscando en el foro no encontré una explicación, así que decidí publicar mi duda.
El código es el siguiente:

Código PHP:
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)          //Configuración I2C
#include <lcd.c>

#define EEPROM_ADDRESS long int  //¿Que indica este define?. Es algún tipo de dato de 16 bits que puede ser usado para declarar variables así: EEPROM_ADDRESS dato, declara la variable dato de tipo EEPROM_ADDRES, o sea de 16 bits, ¿es cierto lo que digo?
                                                       
void write_ext_eeprom(long int addressBYTE data)
{
   
short int status;
   
i2c_start();                   //Inicializa la transmisión
   
i2c_write(0xA0);            //Escribe la palabra de control (dirección ah + 0 para escritura)
   
i2c_write(address>>8);   //Parte alta de la dirección a escribir en la eeprom. Recorre 8 bits a la derecha con lo que siempre habrá ceros en los 4 bits mas significativos de la dirección, o que es lo que hace
   
i2c_write(address);         //Parte baja de la dirección a escribir en la eeprom.
   
i2c_write(data);              //Dato a escribir
   
i2c_stop();                     //Finalización de la transmisión.
   
i2c_start();  //Reinicio. Para que se vuelve a iniciar la transmición, esta parte del código es la que no logro entender y lo que sigue
   
status=i2c_write(0xa0); //Lectura del bit ACK, para evitar escrituras incorrectas. Para que espera el bit de reconocimiento y evitar escrituras incorrectas si ya se escribió todo, esto no me deja dormir 
   
while(status==1)           //Si es 1 esperar a que responda el esclavo. Para que
   
{                                     //espera a que responda si ya respondió anteriormente
      
i2c_start();                        //Desde que se vuelve a iniciar la transmisión hasta donde 
      
status=i2c_write(0xa0);       //termina este ciclo while no logro entender para que se
   
}                                         //se hace, alguien que me explique.
}                                     


BYTE read_ext_eeprom(long int address) {
   
BYTE data;
   
i2c_start();                        //Inicializa la transmisión
   
i2c_write(0xA0);           //Escribe la palabra de control (dirección ah + 0 para escritura)
   
i2c_write(address>>8);   //Parte alta de la dirección a escribir en la eeprom. Lo mismo que anteriormente comente 
   
i2c_write(address);         //Parte baja de la dirección a escribir en la eeprom.
   
i2c_start();                      //Reinicio
   
i2c_write(0xa1);             //Escribe la palabra de control (dirección ah + 1 para lectura)
   
data=i2c_read(0);           //lectura del dato. el cero entre paréntesis indica que no hay ACK para que el esclavo libere la línea de datos (SDA), o ¿que es lo que hace?
   
i2c_stop();                      //Finalización de la transmisión.
   
return(data);
}


void main() {
 
   
int8 valor=0dato;
   
EEPROM_ADDRESS address;;
   
lcd_init();
      
    for (
address=0;address<=9;address++) {
      
WRITE_EXT_EEPROM(addressvalor);
      
lcd_gotoxy(1,1);
      
printf(lcd_putc,"enviando=%1D",valor);
      
delay_ms(500);
      
valor++ ;
   }
   for (
address=0;address<=9;address++) {
      
dato=READ_EXT_EEPROMaddress);
      
lcd_gotoxy(1,2);
      
printf(lcd_putc,"recibiendo=%1D",dato);
      
delay_ms(500);
   }
 } 
Solo en esta parte del código es donde esta lo que no me deja dormir, espero puedan explicarme porque se ponen estas líneas de código:

status=i2c_write(0xa0); //Lectura del bit ACK, para evitar escrituras incorrectas
while(status==1) //Si es 1 esperar a que responda el esclavo
{
i2c_start();
status=i2c_write(0xa0);
}
}
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.