Autor Tema: 17f877a y memoria 24c256 en proteus!! Ayuda!  (Leído 6662 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
17f877a y memoria 24c256 en proteus!! Ayuda!
« en: 10 de Febrero de 2007, 18:29:18 »
Hola a todos de ésta comunidad. Recién comienzo a programar en C y estoy haciendo un sistema de acceso. La lógica del programa no la he programado ya que estoy programando los periféricos primero para que funcionen. La lcd, teclado y relog ya funcionan en proteus, pero la memoria no. La leo y recivo un 255, me imagino porque no ha sido programada pero al grabarla se queda gcolgado y no regresa y se ve en el proteus como se envian y reciben datos por el bus i2c permanentemente, nunca termina!  les coloco el código abajito y tambien una imagen del hardware a ver si pueden ayudarme.. los procedimientos void lcd_linea y  tecla_pulsada no las puse porque no son necesarias y tecla_pulsada es mi rutina de teclado y es grande. en si lo que hice fue un mini programita para probar mis perifericos. Si aprieto 1 en el teclado leo mi relog y coloco en la pantalla los minutos por 2 seg y asi veo si funciona, si aprieto 2 grabo en la memoria en la direccion 5 la variable dato, si aprieto 3 leo la memoria en la posicion 5 y muestro el resultado en la lcd y si no hago nada aparece un "NO" en la pantalla. El que no funciona es el 2, que al apretarlo se queda colgado..

#include "D:\electronica\practicas\c\proyecto martine\otro\proyecto.h"
#include <LCD.C>
#include <_DS1307.C>
#include <24256.C>
#use fast_io(b)
#use standard_io(c)
#byte portb=0x06
#byte portb=0x07
#define FILA1  PIN_B3
#define FILA2  PIN_B4
#define FILA3  PIN_B5
#define FILA4  PIN_B6
#define COLUMNA1  PIN_B0
#define COLUMNA2  PIN_B1
#define COLUMNA3  PIN_B2


void linea(int x)
{
   lcd_gotoxy(1,x);
} //end  linea

int tecla_pulsada()

 } //end teclado


void main()
{
   int    tecla,hrs,min,sec,day,month,yr,dow,dato;
   int16 dir;
   set_tris_b(0b00000111);
   //set_tris_c(0b00000000);
   ds1307_init(DS1307_ALL_DISABLED); // inicialización de relog ds1307
   init_ext_eeprom();
   ds1307_set_date_time(9,8,6,2,18,51,00);
   delay_ms(15);
   lcd_init();
   lcd_putc("\f");
   delay_ms(10);
   
   
   while(true)
   {
   
     
     
     
      tecla=tecla_pulsada();
     
     if (tecla==1)
        {
        lcd_putc("\f");
         delay_ms(10);
         ds1307_get_time(hrs,min,sec);
         ds1307_get_date(day,month,yr,dow);
         printf(lcd_putc,"%u",min);
         delay_ms(2000);
         }
      if (tecla==2)
        {
       lcd_putc("\f");
        dato=5;
     write_ext_eeprom(5, dato);
     delay_ms(2000);
      dato=0;
         }
        if (tecla==3)
        {
       lcd_putc("\f");
        dato = read_ext_eeprom(5);
     printf(lcd_putc,"%u",dato);
     delay_ms(2000);
      dato=0;
         }
     else
     {
     lcd_putc("\f");
     printf(lcd_putc,"NO");
     delay_ms(2000);
     
     }
   }
 

}


Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #1 en: 10 de Febrero de 2007, 21:30:35 »
Hola,

Me parece que esto no es correcto:

Código: C
  1. #byte portb=0x06
  2. #byte portb=0x07

y especificamente para el teclado, no veo que te regrese algun valor
Código: C
  1. int tecla_pulsada()
  2.  
  3.  } //end teclado

Y al llamar a:

Código: C
  1. tecla=tecla_pulsada();    
  2.      if (tecla==1)
  3.         {
  4.         lcd_putc("\f");
  5.          delay_ms(10);
  6.          ds1307_get_time(hrs,min,sec);
  7.          ds1307_get_date(day,month,yr,dow);
  8.          printf(lcd_putc,"%u",min);
  9.          delay_ms(2000);
  10.          }
  11.       if (tecla==2)
  12.         {
  13.        lcd_putc("\f");
  14.         dato=5;
  15.      write_ext_eeprom(5, dato);
  16.      delay_ms(2000);
  17.       dato=0;
  18.          }
  19.         if (tecla==3)
  20.         {
  21.        lcd_putc("\f");
  22.         dato = read_ext_eeprom(5);
  23.      printf(lcd_putc,"%u",dato);
  24.      delay_ms(2000);
  25.       dato=0;
  26.          }
  27.      else
  28.      {
  29.      lcd_putc("\f");
  30.      printf(lcd_putc,"NO");
  31.      delay_ms(2000);    
  32.      }

Tecla tendra el valor de 0(u otro desconocido), ya que no le asignas valor alguno, y por ende siempre llamara a :
Código: C
  1. lcd_putc("\f");
  2.      printf(lcd_putc,"NO");
  3.      delay_ms(2000);
Saludos,

Yoel :D
« Última modificación: 10 de Febrero de 2007, 21:41:59 por Yoel_Ocmin »

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #2 en: 10 de Febrero de 2007, 22:32:56 »
tecla_pulsada es una rutina para el teclado y no la puse entera ya que era muy grande! el problema no está en el valor que regrese TECLA, ya que funciona bien el teclado, sino la memoria que cuando intento grabar en ella se queda colgada!

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #3 en: 10 de Febrero de 2007, 22:50:29 »
Hola, disculpa el mal entendido.

en tu codigo esta:
Código: C
  1. if (tecla==2)
  2.         {
  3.        lcd_putc("\f");
  4.         dato=5;
  5.      write_ext_eeprom(0,5, dato);
  6.      delay_ms(2000);
  7.       dato=0;
  8.          }
Y segun acabo de ver en la ayuda:
write_external_memory( address, dataptr, count )

address: Es la direccion del dispositivo, en tu caso es 0 ya que segun se ve en proteus A0=1 y A1=A=0,
porlo que seria      write_ext_eeprom(0,5, dato);

Por otro lado, en la simulacion WP=0 y para grabar, debe estar a 1,
en todo caso creo que puedes controlar WP con PIN_C5. Entonces tu codigo seria:

Código: C
  1. if (tecla==2)
  2.         {
  3.        lcd_putc("\f");
  4.      output_high(PIN_C5);
  5.         dato=5;
  6.      write_ext_eeprom(5, dato);
  7.      delay_ms(10); // Solo se necesita de 10ms, para el tiempo de grabacion
  8.      output_low(PIN_C5);
  9.       dato=0;
  10.          }

Saludos,

Yoel

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #4 en: 10 de Febrero de 2007, 23:22:13 »
Hola, te cuento que tambien estoy iniciandome en C.

Acabo de realizar un ejemplo, que guarde solo un valor en la memoria. Tal parece que WP, funciona al revez, Cuando WP=0, permite grabar y cuando WP=1 desabilita la grabada.

Código: C
  1. #include "C:\yoel\CCScodes\Memoria\memo256.h"
  2. #define EEPROM_SDA PIN_C4
  3. #define EEPROM_SCL PIN_C3
  4. #include <24256.C>
  5.  
  6. void main()
  7. {
  8.  
  9.    setup_adc_ports(NO_ANALOGS);
  10.    setup_adc(ADC_OFF);
  11.    setup_psp(PSP_DISABLED);
  12.    setup_spi(FALSE);
  13.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  14.    setup_timer_1(T1_DISABLED);
  15.    setup_timer_2(T2_DISABLED,0,1);
  16.    init_ext_eeprom();
  17.  
  18.      output_low(PIN_C5);
  19.      write_ext_eeprom(5, 5);
  20.      delay_ms(10); // Solo se necesita de 10ms, para el tiempo de grabacion
  21.      output_high(PIN_C5);
  22.    
  23.    while(true){}
  24.    
  25.    // TODO: USER CODE!!
  26.  
  27. }

Este ejemplo funciona correctamente. Y los archivos te los he colocado aca: http://proyectosfie.com/amigotes/memoria.rar

Saludos,

Yoel.

PD: Al parecer el problema esta en las definiciones de los pines SCL y SDA. Ya que por defecto aparecen como :
#define EEPROM_SDA PIN_B0
#define EEPROM_SCL PIN_B1

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #5 en: 11 de Febrero de 2007, 11:46:36 »
Las definiciones de los pines ya lo hice. y hasta he cambiado de pines a la memoria y la definicion y sigue dando el mismo problema!. eso que tu dices de hacer write_ext_eeprom(0,5, dato); , me da error! al abrir la libreria de la meoria 24c256 no aparece ese primer parámetro de identificacion que es el 0. ademas en el ejemplo que tu pusistes tampoco lo pusistes!. puse lo del control del WP con un pin. y nada  :shock: . me voy a volver loco! el micro se queda colgado y se ve la transmisiones, los pines cambiando de color y ahi se queda infinitamente! será el proteus?¿ pero es que veo que dices que tu lo has hecho! y no sé que he hecho mal, inicialicé la memoria, la leo bien pero al mandarle a escribir se queda colgada! al revisar la libreria veras lo que está abajo,  esa es la seccion de grabado y si ves al final, en el while eso es una comprobación de que guardó! ahi se queda colagado, la memoria no está guardando! si le quito eso, osea, quitarle la comprobación de guardado ya no se queda colgado el micro. pero al intentar leer la posición 5 me vuelve a dar 255  y no 5 que es el dato que estoy intentando guardar, eso significa que no guardó. Por eso cuando está haciendo la comprobación se queda pegado. DIOS MIO :shock:

void write_ext_eeprom(long int address, BYTE data)
{
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0);
   }
}
« Última modificación: 11 de Febrero de 2007, 11:56:11 por elavismo »

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #6 en: 11 de Febrero de 2007, 12:35:11 »
no sé que hice pero ahora no se queda colgado. pero al parecer no guarda el dato, ya que grabo un 5 en la direccion 5 y leo un 255 en la direccion 5  :x .. lo que hice fue cambiar el modelo de la memoria en el proteus por el que tu tienes

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #7 en: 11 de Febrero de 2007, 15:14:22 »
elnavisimo, te falta lo fundamental, tenes que incluir la libreria I2C,

Código: [Seleccionar]
include "D:\electronica\practicas\c\proyecto martine\otro\proyecto.h"
#include <LCD.C>
#include <_DS1307.C>
#include <24256.C>
#use fast_io(b)
#use standard_io(c)
#byte portb=0x06
#byte portb=0x07
#define FILA1  PIN_B3
#define FILA2  PIN_B4
#define FILA3  PIN_B5
#define FILA4  PIN_B6
#define COLUMNA1  PIN_B0
#define COLUMNA2  PIN_B1
#define COLUMNA3  PIN_B2



salvo que este en proyecto.h, si no no te dejaria compilar, pero buscala y para el esquema que has dibujado tiene que decir esto.


Código: [Seleccionar]
#use I2C(master, sda=PIN_C4,scl=PIN_C3,FORCE_HW,SLOW=100000)


Asi definis que use el I2C por hardware a una velocidad de 100Khz que es el maximo que
soporta el ds1307, la sentencia para grabar es write_ext_eeprom(direccion ,dato), el dato es de 8 bits y la direccion es de 16 bits, en el caso de la 24lc256, que son 32 Kbytes de memoria.








saludos
PikMan

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #8 en: 11 de Febrero de 2007, 15:18:25 »
Las definiciones de los pines ya lo hice. y hasta he cambiado de pines a la memoria y la definicion y sigue dando el mismo problema!. eso que tu dices de hacer write_ext_eeprom(0,5, dato);

Este fue un error mio, ya que al inicio vi la ayuda del CSS y encontre la funcion write_external_eeprom(0,5,dato).

Tal  parece que me olvide en mencionarlo. Pero la funcion correcta estaba bien es write_ext_eeprom(5,5);

     output_low(PIN_C5);
     write_ext_eeprom(5, 5);
     delay_ms(10); // Solo se necesita de 10ms, para el tiempo de grabacion
     output_high(PIN_C5);

Si puedes enviame el codigo completo, para poder ayudarte... si no quieres publicarla esta el correo.

Saludos,

Yoel

PD:Pikman... Estoy suponiendo que elavismo tiene incluido todo esto en include "D:\electronica\practicas\c\proyecto martine\otro\proyecto.h", ya que cuando creas el proyecto por wizard... ahi lo coloca.


Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #9 en: 11 de Febrero de 2007, 15:22:53 »
Parece que ya encontre el problema... y no es codigo...

R5 y R6 son 1k... Reemplazalas por 4.7K y veras como Graba... :D

Saludos,

Yoel

Desconectado Y@el

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 415
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #10 en: 11 de Febrero de 2007, 15:31:13 »
Por que las resistencias de 4.7K?....

Bueno son resistencias que yo coloco regularmente.

Algo mas tecnico.
http://home.scarlet.be/~mb069957/projects/datasheet/24LC256.pdf Pag4

2.2 SDA Serial Data
This is a bi-directional pin used to transfer addresses and data into and data out of the device. It is an open drain terminal, therefore the SDA bus requires a pull-up resistor to VCC (typical 10 k for 100 kHz, 2 k  for 400 kHz)
For normal data transfer SDA is allowed to change only during SCL low. Changes during SCL high are reserved for indicating the START and STOP conditions.

Saludos,

Yoel

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #11 en: 11 de Febrero de 2007, 16:13:41 »
Lo de las resistencia no parece ser. ya las cambie por 4.7k y sigue igual. el codigo que publique es el codigo entero sin una funcion de teclado.  tengo lo del i2c en el proyecto.h . estuve viendo otro foro. http://www.ccsinfo.com/forum/viewtopic.php?p=76319#76319
 
al parecer es el mismo problema que yo tenia. se quedaba en un ciclo infinito y ellos lo solucionaron pero aun asi tengo dudas y estoy preguntandoles a ellos. porque he tratado de hacer algo de lo que ellos hicieron y sigue sin funcionar. No graba nada en la memoria, ya no se queda en el ciclo infinito, pero no graba. TAmbien voy a montarlo en placa y soldar todo a ver si funciona de verdad y no sea el proteus jodiendo! ellos como que le pusieron un stop a la libreria del 24c256 pero no se donde aun..

que locura todo esto!

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #12 en: 12 de Febrero de 2007, 00:26:09 »
Bueno, despues de leer tu ultimo post, y si solo has probado con Proteus, este ultimo puede ser el problema.

Código: [Seleccionar]
status=i2c_write(0xa0);
   while(status==1)        // ACKNOLEGE POOLING, STATUS SE PONE EN 1 CUANDO HAY ACK
   {
   i2c_start();
   status=i2c_write(0xa0);
   }

Aqui lo que hace es esperar que esperar que la memoria termine el proceso de escritura, si lees el datasheet de la memoria dice que, la memoria no constesta el ACK despues de enviarle el bit de start mientras esta escribiendo, entonces se aprovecha esto para saber si esta escribiendo o ya termino, porque la otra alternativa es poner un delay de 5 ms, que es el tiempo aproximado en que termina de escribir pero este puede ser mas o menos segun la temperatura y voltaje, entonces de la manera antes descripta usas el tiempo que solamente le demande la memoria, el soft se queda esperando que conteste, puede que esto no este previsto por proteus, cambia las lineas que puse mas arriba por :

Código: [Seleccionar]
delay_ms(5);

no olives del ultimo i2c_stop();


Y pruebalo nuevamente, el proteus es muy lindo pero no hay nada como una placa prototipo con un ICD y si usas CCS mejor, es una maravillosa herramienta.

suerte!


PD: Veo lo que te contestaron el en foro de CCS y es lo mismo que yo te explico, pero el ultimo post tiene un error pues agrega el tiempo de 5ms y no saca el while...

« Última modificación: 12 de Febrero de 2007, 00:37:25 por pikman »
saludos
PikMan

Desconectado elavismo

  • PIC10
  • *
  • Mensajes: 30
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #13 en: 12 de Febrero de 2007, 12:56:05 »
Muchas gracias amigo, estoy montándolo en placa en estos momentos  y les aviso a ver como me fué!

Desconectado cesmarvas

  • PIC10
  • *
  • Mensajes: 13
Re: 17f877a y memoria 24c256 en proteus!! Ayuda!
« Respuesta #14 en: 24 de Julio de 2007, 13:09:09 »
hola amigos yo recien entro a programar pic pero en lenguaje basic con el entorno Mikrobasic que me parece muy bueno por tener variedad de librerias. antes lo hacia  en assembler puro

yo igual que ustedes intento escribir y leer una memoria i2c que no puedo con el simulador proteus, diganme por favor es el proteus o es que no se conectar los pines adecuados

gracias