Autor Tema: Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus  (Leído 7271 veces)

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

Desconectado Andreufr

  • PIC10
  • *
  • Mensajes: 19
    • Automatic water with Remote monitoring & Control
Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus
« en: 11 de Agosto de 2006, 16:36:19 »
Hola ha todos.

Estoy intentado comunicar el PIC16F877A i una EEPROM 24LC512 con bus I2C con Proteus y no me funciona. Programo con CCS y uso la libreria de CCS para controlar la EEPROM y no hay forma de escribir o leer un dato bien. Realmente no se donde esta el fallo si en escribir o en leer ya que no puedo comprovar si se ha escrito bien la memoria.

A ver vamos por partes:

El Bus I2C creo que me funciona bien por que tengo montado un RCT DS1307 que va con I2C y me funciona a la perfección. Aun con todo he provado de ir cambiando el calor de las resistencias de Pull-Up por que nunca se sabe... pero nada el RTC sige funcionando y la EEPROM sigue sin funcionar...

Supongo que la libreria de CCS para la EEPROM estabien, si alguien sabe algo... He provado de leer y escribir usando la libreria "external_EEPROM.c" de CCS pero la cosa no va...

He provado tb de cambiar de memòria poniendo una mas pequeña para provar que no sea la libreria de Proteus lo que no funciona, pero tampoco va...

Creo que la comunicación con la EEPROM se hace correctamente, ya que he comparado lo que pone en el datasheet de la memòria y CCS lo hace correctamente. A bajo pongo la foto del debuguer de Proteus con la comunicacion a ver si a alguien ve algun fallo...

He provado tb cambiar la libreria de CCS, poniendo el delay_ms(5); que pide el datasheet (aun que eso creo que ya esta controlado en la libreria) pero la cosa sigue sin funcionar...

He provado tb de escribir en una posicion distinta de memoria (que no sea la 00) y he provado de escribir varias posiciones... pero tampoco va. Solo saca o FF o basura...

En definitiba estoy un poco desesperado! Aun con todo he leido en el foro gente que se queja que simulando con Proteus estas memorias con bus I2C dan problemas... si es eso, alguien tiene otra opcion para mi?¿ otra memoria EEPROM?¿ (necessito que sea EEPROM por que los datos no se tienen que borrar...)

Os pongo el codigo y la foto de Proteus a ver si alguien ve algo...

GRACIAS!!

#include <16F877A.h>               

#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      
#use delay (clock=4000000)         
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1)   

#include "lcd.c"   //incluim la llibreria de CCS del LCD

#use standard_io (D)

// Libreria DS1307.c //////////////////////////////////////////////////////////

#define RTC_SDA  PIN_C4
#define RTC_SCL  PIN_C3

#include <_ds1307.c>

///////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////

#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3

#include <24512.c>               //incloem la llibriaria de la EEPROM 24LC512 de 512KBytes --> 64K posicions   de memòria -->2^16 = 16 bits adesces



const char Version[]="1.0.D\0";
//int1 flanco=0;
//int1 dump,kdump;
int  n,i=0;
char c=0x00;
//char rec=0x00;
byte sec;
byte min;
byte hrs;
byte day;
byte month;
byte yr;
byte dow;
char sdow[11];

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

////////////////////////////////////////////////////////////////////////////////////////

#include<csTeclat2.c>            //Incloem la funcio del teclat


void InicialitzaLCD(){            //inicialitza el LCD i treu el missatge de benvinguda durant 3 segons

   lcd_init(); //Inicia LCD               
   
   lcd_putc("   Benvingut\n"); //treu text
   lcd_putc("  Control REG"); //treu text
   delay_ms(1000);
}

void LCD_PosaDataHora(byte sec, byte min, byte hrs, byte day, byte month, byte yr, byte sdow){

   lcd_putc("\f");
   lcd_gotoxy(1,1);         //per anar a la primera posicio anem a la (1,1)
   printf(lcd_putc,"%02u:%02u:%02u\n",hrs,min,sec);
   printf(lcd_putc,"%02u/%02u/%02u %s\n",day,month,yr,sdow);
}

void lee_y_transmite_date_and_time(void){      //llegeix i transmiet via rs232 la data y el temps
 
  ds1307_get_day_of_week((char*) sdow);
  ds1307_get_date(day,month,yr,dow);
  ds1307_get_time(hrs,min,sec);
  printf("\n\%s \%02d/\%02d/\%02d ",sdow,day,month,yr);
  printf("\%02d:\%02d:\%02d\r\n", hrs,min,sec);
}


void main(void)
{   
   char k;         
   long int j;      
   set_tris_b(0xF0);         //Instrucció obligatoria fent servir csTelcat2.c sino no funciona
                        //Files: entrades del teclat,
                        //Colúmnes: sortides de teclat

   set_tris_b(0b00000000);      //inicialltzo el port C tot com a sortides per la trans I2C


   port_b_pullups(TRUE);      //Instrucció obligatoria fent servir csTeclat2.c, sino no funciona a no se que posem pullups externes!!
            
//****************************treiem per la usart la info de base         
   delay_ms(500);
   printf("\r\n");
   printf("[RRBOARD2] Real Time Clock version %s\r\n",version);
   printf("based on DS1307 Dallas Maxim Hardware\r\n\n");
   
   InicialitzaLCD();            //inicialitzem el LCD i posem el missatge funcionant...

   lcd_putc("\f"); //neteja pantalla
   lcd_putc("Funcionant...\n"); //treu text

   ///////////////////AQUI EMPIEZAN MIS PROBLEMAS!!!**********************************

      //inicialtizem la eeprom externa

   printf("Inicialitzant EEPROM...\r\n");
   init_ext_eeprom();

   //TEST EEPROM primer escribim despres llegim

   printf("Test de la EEPROM externa (Write and read) ...\r\n\n");

      write_ext_eeprom(130,0x14);
      
   printf("EEPROM escrita! i=%X Llegint...\r\n",i);

      c=read_ext_eeprom(130);

         printf(" %X %X \r\n",j,c);

// Inicializa DS1307

   printf("Inicializando DS1307 ...\r\n\n");

   ds1307_init(DS1307_ALL_DISABLED);

   // Set date for -> 5 Agosto 2006 Viernes
   // Set time for -> 02:50:00
   printf("Set Date & Time to ...\r\n");
   ds1307_set_date_time(9,8,6,2,18,51,00);
   //delay_ms(1000);   

   // Llegeix Data i Hora actual y transmet

   printf("Fecha y Hora actual en el DS1307\r\n\n");
   lee_y_transmite_date_and_time();
   printf("\r\n\n");

   // Test de RAM -> primer Write, segon Read

printf("Test de la NVRAM interna del RCT (Write and read) ...\r\n\n");

   for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){

      ds1307_write_nvram_byte(i,i);
   }

n=0;
   for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
       c=ds1307_read_nvram_byte(i);
      printf("%X ",c);

         if(++n==0x0f){
          n=0;
         printf("\r\n");
      }

   }
   printf("\r\n");



//despres de inicialitzar tot esperem per començar!



puts("\nPulsa una tecla:  ");   //escribim per la USART

LCD_PosaDataHora(sec, min, hrs, day, month, yr, sdow);      //posem l'hora i la data al LCD. L'hora a dalt i la data a baix

   while(1)   
   {   
      k=kbd_getc();         //llegim la tecla del teclat per polling
      delay_ms(100);         //per que no perpadegi

      if(k)
      {
         //printf("\b");      //Retrocede una posicion(borra ultima tecla)
         printf("%c",k);      //Envio de tecla per virtual terminal
         lcd_putc(k);      //teriem la tecla pulsada pel LCD
      }
   }   
}


Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus
« Respuesta #1 en: 15 de Agosto de 2006, 13:35:42 »
Buenas!!!si usas el compilador CCS, para que no d eproblemas al escribir en las memorias eeprom, te recomiendo que uses la libreria input.c que trae el mismo compilador, en el post de Ejemplitos en C para 16F648A, concretamente en el programa numero 52, se usa una memoria eeprom 24LC256 para su escritura y su lectura con una pequeña modificacion de esta libreria.


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Andreufr

  • PIC10
  • *
  • Mensajes: 19
    • Automatic water with Remote monitoring & Control
Re: Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus
« Respuesta #2 en: 16 de Agosto de 2006, 15:19:04 »
Muchas Gracias!! vszener! voy a probar!

La verdad es que ya había dejado el tema por imposible... te agradezco mucho tu respuesta!

La probare y ya contare k tal!

Desconectado Andreufr

  • PIC10
  • *
  • Mensajes: 19
    • Automatic water with Remote monitoring & Control
Re: Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus
« Respuesta #3 en: 16 de Agosto de 2006, 15:40:59 »
Hola de nuevo vszener.

He probado lo que me has dicho y sigue sin funcionar... de hecho no me funciona ni con el ejemplo compilado del proteus que cuelgas. No me funciona ni tu función.

No entiendo una cosa, que tiene que ver la librería input.c con la memoria eeprom¿? esta librería es para leer de teclado, no?¿

Espero que puedas ayudarme!

Gracias otra vez!

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus
« Respuesta #4 en: 17 de Agosto de 2006, 07:51:53 »
La libreria input.c, es para recibir datos en hexadecimales e incluso float, int, etc. El contenido de las funciones de la libreria input.c lo puedes encontrar en la carpeta donde has instalado el compilador CCS, normalmente la ruta de instalacion es la siguiente: C:\Archivos de programa\PICC\Drivers

En la carpeta llamada 'Drivers' encontraras una libreria llamada input.c, esa es la que tienes que abrir para ver las funciones que trae.

Mirate el ejemplo que yo te he indicado, la manera que esta realizado el mismo y adaptalo a tu programa.


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vinny

  • PIC10
  • *
  • Mensajes: 27
Re: Problemas para comunicar PIC16F877A y EEPROM 24LC512 con Proteus
« Respuesta #5 en: 29 de Noviembre de 2006, 16:27:41 »
Hola! creo q en tu codigo deberias inicializar el I2C, aunque si dices que el RTC te va ....
creo q te falta la línea siguiente al principio

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)

sino inicializas yo creo q no puede ir...pero no se mucho de esto la verdad

espero que ya lo hayas arreglado xq por lo que veo publicaste hace tiempo...
a ver si funciona
Solo existen dos cosas infinitas, el universo y la estupidez humana, de lo primero no estoy seguro...


 

anything