Autor Tema: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI  (Leído 4323 veces)

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

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« en: 08 de Mayo de 2007, 14:44:12 »
Hola a todos,

Este es mi primer tema en este foro. He estado leyendo y no he encontrado la solucion a mi problema, asi que, aqui lo planteo. Si ya ha sido resuelto la duda antes, disculpar.

Estoy realizando mi proyecto de fin de carrera, y necesito almacenar bastantes datos en memoria, para luego tratarlos, o madarlos a un PC. Me he decidido por utilizar una EEPROM de microchip, el modelo 25LC1024.

Me he hecho una pequeña aplicacion que me almacena un dato en una direccion de memoria, y luego la lee, y compara los dos datos, encendiendo un LED si son iguales. Pues bien, no lo enciende.

Estoy mirando con un osciloscopio las señales que me generan tanto el PIC como la EEPROM. El PIC manda los datos correctamente (visualizo el SCK y SO y manda los datos que debe), el problema lo tengo en la salida de la memoria. Ésta recibe la instrucción de lectura, y recibe la direccion deseada correctamente, pero el dato que envia de vuelta, no es el dato introducido anteriormente, y además tiene muy mala pinta. La señal parece que sean varias señales superpuestas, y decae de forma exponencial (más o menos, para que os hagais una idea) cuando termina el periodo de envio del dato.

No tengo ni idea de como puedo solucionarlo, y ya llevo varios dias probando cosas, y no hay manera de encender el dichoso LED.

Espero que podais ayudarme, me ayudaríais muchisimo. Estoy deseando ver ese LED encendido, XD.

Muchas gracias anticipadas

Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Deimos

  • Visitante
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #1 en: 09 de Mayo de 2007, 05:58:11 »
Hola enrike y bienvenido al foro.

Seguramente no estás mandando bien la trama, o la e2prom no graba la trama porque se la estás mandando muy rápido o porque desactivas el CS antes de hora o no se..... cuelga tu programa aquí y le echaremos un vistazo entre tod@s.

Otra cosa, el bus spi tiene resistencias de pull-up? unas resistencias de pull-up pueden quitarte muchos dolores de cabeza.

Salu2!!!

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #2 en: 09 de Mayo de 2007, 09:34:39 »
Muchas gracias Deimos,

Pues tengo puestas resistencias de pull-up tanto en HOLD como en CS y WP. Suponia que con estos bastaría. ¿Hace falta poner alguna más?

El codigo que utilizo no lo tengo a mano, pero lo colgaré en cuanto pueda. A ver si mñn puedo colgarlo, porque la verdad es q me corre prisa, pero estoy un poco liao en el trabajo.

Muchas gracias, y espero q me sigais ayudando, y ayudar yo en lo q pueda

Un saludo

Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Deimos

  • Visitante
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #3 en: 09 de Mayo de 2007, 12:37:03 »
Por colgarle pull-ups en las lineas de datos no le va a pasar nada al circuito, las pull-up no suelen molestar sino todo lo contrario. A ver si puedes colgar el programa y a le sacamos algo en claro al bicho.

Salu2 enrike!!!!!

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #4 en: 09 de Mayo de 2007, 13:19:14 »
Hola de nuevo,

He podido hacer un hueco y aqui os adjunto el programa de prueba q me he creado.

Gracias por el interes Deimos, no esperaba una contestacion tan rapido.

Bueno, echarle un vistazo y ya me contareis.

Por cierto, ¿el valor de las resistencias es muy significativo en este caso? Yo suelo poner resistencias de unos 10K.

Gracias de nuevo
Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #5 en: 09 de Mayo de 2007, 14:45:13 »
Por cierto, se me olvidaba comentarlo.

No creo que el problema venga por la velocidad. Utilizo como reloj un XTAL a una velocidad de 4 MHz, y tengo el preescaler del SPI puesto como Fosc/64 (no se que valor tendra en el archivo que adjunté anteriormente, he probado con las 3 velocidades y no se cual sera la que se ha quedado en el archivo).

No creo que la velocidad sea un problema, pero bueno, aqui teneis el dato para que tengais mas pistas.   :D

Un saludo y gracias otra vez


Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #6 en: 09 de Mayo de 2007, 15:32:22 »
Hola enrike,
echale un vistazo al documento de errata de dicho micro, ya que en algunas revisiones de dicho micro el MSSP tiene algunos fallos y puede que te veas afectado por alguno de los errores, de hecho yo ya tuve algunos problemas con dicho modulo trabajando en modo I2C con el 18F2550.

Un saludo.

Deimos

  • Visitante
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #7 en: 09 de Mayo de 2007, 18:59:09 »
Hola enrike, en cuanto tenga un minuto mañana te comento algo del programa. Con respecto a las pull-up de 10K? Es mucho 10K hombre, casi no dejas pasar corriente. De 2K2 o menos es más coherente. Cuando más rápida sea la comunicación más pequeñas han de ser las resistencias para dar corriente a la señal y que no se amorre.

Sé que es una pregunta tonta pero....... todas las masas estan juntas? Las alimentaciones del micro y de la e2prom las pasas por condensadores de 0.1µF? Tu problemas más bien parece físico y no de programación, no obstante me miro el fuente y te comento algo.

Salu2!!!!

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #8 en: 10 de Mayo de 2007, 04:54:34 »
Buenas

Pues si, puede ser que tengo problemas con el circuito. Las resistencias las cambiaré a ver que obtengo, y la pregunta que me haces, las masas y las alimentaciones las tengo todas unidas (las del PIC y las de la EEPROM), y tengo condensadores de desacoplo de 2'2uF creo recordar.

Ya me comentas algo del programa, y ya te dire si han surgido efecto el cambio de resistencias.

Un saludo Deimos
Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Deimos

  • Visitante
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #9 en: 11 de Mayo de 2007, 06:30:18 »
Hola enrike.

A ver tu programa es un poco....... raro? jajajaja veo que haces una cosa rarísima para comunicar con SPI, y no hace falta ni siquiera que esperes a la interrupcion del SPI, esto lo hace todo solo la libreria de spi.h

Mira aquí te adjunto un fuente para una comunicación SPI entre un pic18 y uno dispositivo que solo tiene entrada de SPI, es decir, no devuelve ningun dato.

Código: [Seleccionar]
/**********************************************/
/* protocolo spi para 18F452 en picdem2plus */
/*el programa envia un valor por SDO del SPI, el cual se va incrementando de 0 a 255*/
/*una vez que llega a 255 resetea el valor poniendolo a cero y vuelve a empezar*/
/**********************************************/

//declaracion de maquina y librerias
#include "p18f452.h"
#include "spi.h"
#include "portb.h"
#include "delays.h"
#include "string.h"
#include "xlcd.h"

//declaracion puertos

#define SS PORTBbits.RB4 //salida de chip select
#define SCK PORTCbits.RC3 //salida de reloj
#define SDO PORTCbits.RC5 //salida de  de datos

//declaracion de funciones
void Setup(void);

//-----------------------------------------------------
void Setup(void)
{
TRISBbits.TRISB5=0; //HAB salida
TRISBbits.TRISB4=0; //SS salida
TRISBbits.TRISB3=0; //RB3 salida
TRISBbits.TRISB2=0; //RB2 salida
TRISBbits.TRISB1=0; //RB1 salida
// TRISBbits.TRISB0=0; //RB0 salida
TRISAbits.TRISA4=1;

PORTBbits.RB3=0;
PORTBbits.RB2=0;
PORTBbits.RB1=0;
// PORTBbits.RB0=0;
}

//-----------------------------------------------------
//programa principal
void main(void)
{
unsigned char value=0x00;

Setup();
while(-1)
{
HAB=1;
SS=0; //habilita transimision
OpenSPI(SPI_FOSC_64,MODE_00,SMPMID); //abre puerto SPI
SSPENB;
Delay10TCYx(10);
DataRdySPI(); //espera byte estable
WriteSPI(value); //
CloseSPI(); //cierra bus SPI
SS=1; //deshabilita transmision
HAB=0;
Delay10TCYx(10);
if(value<0xFF){value++;}else{value=0;}
}
}

Este fuente le envia a un potenciómetro digital un valor por el puerto SPI. El potenciómetro no devuelve ningún valor, por eso no está la llamada a ReadSPI()

No hace falta que esperes al bit de interrupcion del SPI, la libreria lo hace por ti, tu lo único que has de hacer es llamar a las rutinas cuando te interese. Prueba este programa o modificalo, porque te garantizo que funciona.

Dews!!!!!

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #10 en: 11 de Mayo de 2007, 07:10:42 »
Muchas gracias de nuevo.

En cuanto pueda modificaré tu programa para que me lea también y volveré a probar. Ya te contaré mis progresos (espero que sean buenos  :lol:).

Bueno, mi porgrama es raro, jeje, lo se, es el primer intento que hago para comunicar el PIC con un dispositivo externo, y bueno, no me ha ido muy bien. Espero que con tu ayuda pueda seguir aprendiendo.

Gracias por tu tiempo

Un saludo, y ya te contare
Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Deimos

  • Visitante
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #11 en: 11 de Mayo de 2007, 11:01:30 »
Venga majo, ya verás que con este programa te irá bien el invento jejejeje

Ala puessssssssss!!!!!!!!

PD: me he dado cuenta que hay cosas que no estan bien en el programa, ya que lo he tenido que tocar para no liarte demasiado. Si te fijas hay una variable que pone HAB, bien esa salida la necesitaba para habilitar un transistor de potencia, pero vaya, puedes hacer dos cosas, o quitarle toda linea de programa que haga referencia al HAB, o coger el fuente original y retocarlo. Bueno te paso el fuente original que está sin retocar.

Código: [Seleccionar]

/**********************************************/
/* protocolo spi para 18F452 en picdem2plus */
/**********************************************/

//declaracion de maquina y librerias
#include "p18f452.h"
#include "spi.h"
#include "portb.h"
#include "delays.h"
#include "string.h"
#include "xlcd.h"

//declaracion puertos

#define HAB PORTBbits.RB5 //habilitacion del driver
#define SS PORTBbits.RB4 //salida de chip select
#define SCK PORTCbits.RC3 //salida de reloj
#define SDO PORTCbits.RC5 //salida de  de datos
#define LEDRB3 PORTBbits.RB3; //
#define LEDRB2 PORTBbits.RB2; //
#define LEDRB1 PORTBbits.RB1; //
//#define LEDRB0 PORTBbits.RB0; //
#define KEY PORTAbits.RA4;

//declaracion de funciones
void Setup(void);

//declaracion de variables
//unsigned char x=0;

//declaracion de constantes
#define TRUE 1
#define FALSE 0

//-----------------------------------------------------
void Setup(void)
{
TRISBbits.TRISB5=0; //HAB salida
TRISBbits.TRISB4=0; //SS salida
TRISBbits.TRISB3=0; //RB3 salida
TRISBbits.TRISB2=0; //RB2 salida
TRISBbits.TRISB1=0; //RB1 salida
// TRISBbits.TRISB0=0; //RB0 salida
TRISAbits.TRISA4=1;

PORTBbits.RB3=0;
PORTBbits.RB2=0;
PORTBbits.RB1=0;
// PORTBbits.RB0=0;
}

//-----------------------------------------------------
//programa principal
void main(void)
{
unsigned char ctrl=0x11; //00010001
unsigned char value=0x00;

Setup();
while(-1)
{
HAB=1;
SS=0; //habilita transimision
OpenSPI(SPI_FOSC_64,MODE_00,SMPMID); //abre puerto SPI
SSPENB;
Delay10TCYx(10);
DataRdySPI(); //espera byte estable
WriteSPI(ctrl);
WriteSPI(value); //
CloseSPI(); //cierra bus SPI
SS=1; //deshabilita transmision
HAB=0;
Delay10TCYx(10);
if(value<0xFF){value++;}else{value=0;}
}
}



No te preocupes de los leds, del HAB o del KEY, esas eran entradas y salidas que en su día me hicieron falta, pero para tu programa no son necesarias. No deberían afectar a tu proyecto.

Salu2!!!!!!

PD: los cuadraditos que salen en el programa son tabuladores, ok?

Dews!!!!
« Última modificación: 11 de Mayo de 2007, 11:09:43 por Deimos »

Desconectado enrike

  • PIC10
  • *
  • Mensajes: 13
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #12 en: 14 de Mayo de 2007, 13:32:25 »
POR FIIIIIIIIIIIIIIIIIIIIIIIN     :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/


Parece que ya lo he consegido. Por fin voy a poder continuar con mi proyecto, jeje.

Al final he conseguido hacer que me funcione, modificando mi programa. No he utilizado el ejemplo que ha dejado nuestro compañero Deimos, pero de todas maneras, muchas gracias Deimos, me has sido de gran ayuda. 

Dejo el programa por si le sirve de ayuda a alguien, así ya tendreis dos para comparar.

Ahora a por el USB,  :lol:

Un saludo
Las cosas divertidas no acaban en -rium, acaban en...aberna, ...olera, ...erveza

Deimos

  • Visitante
Re: Comunicacio entre PIC18F4550 y memoria 25LC1024 mediante SPI
« Respuesta #13 en: 14 de Mayo de 2007, 15:24:27 »
Enhorabuena enrike, que bien sabe cuando acaba funcionando, verdad? jajajajaja ;) Me alegra haberte sido de ayuda... o no jejejeje

Venga majo, a por el usb que esto ya lo tienes chupao jejejejeje

Dews!!!!!


 

anything