Autor Tema: Duda con spi_write(var) y memoria 25LC512  (Leído 1826 veces)

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

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Duda con spi_write(var) y memoria 25LC512
« en: 29 de Noviembre de 2011, 14:30:04 »
Hola amigos, les pido colaboración por lo siguiente, estoy realizando una comunicación simple con una memoria 25LC512 pero me sucede algo demasiado extraño y no sé si el problema es de CCS, Proteus o mío

cuando hago esto funciona bien:
Código: [Seleccionar]
void grabar_25lc512(int instruccion, long direccion, char dato)
{
int dir_alto;
int dir_bajo;

dir_bajo = make8(direccion,0);
dir_alto = make8(direccion,1);

bit_clear(ce);
spi_write(0b00000010);
spi_write(0);
spi_write(0);
spi_write(1);
bit_set(ce);
}

pero cuando hago esto otro no funciona, es como si la instrucción spi_write no aceptara variables sólo constantes

Código: [Seleccionar]
void grabar_25lc512(int instruccion, long direccion, char dato)
{
int dir_alto;
int dir_bajo;

dir_bajo = make8(direccion,0);
dir_alto = make8(direccion,1);

bit_clear(ce);
spi_write(instruccion);
spi_write(dir_alto);
spi_write(dir_bajo);
spi_write(dato);
bit_set(ce);
}

este es el código completo

Código: [Seleccionar]
#include <16f876A.h>

#use delay(clock=4mhz)
#fuses xt,put,brownout
#use spi(force_hw)

#byte porta = 5
#byte portb = 6
#byte portc = 7

#define tecla_grabar bit_test(porta,0)
#define tecla_leer bit_test(porta,1)
#define ce portc,6

int conta;

void grabar_25lc512(int instruccion, long direccion, char dato);
int leer_25lc512(long direccion);

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram

void main() //Rutina principal
{
set_tris_a(0b111111); //Configuracion de entradas y salidas del puerto a
set_tris_c(0b10010111); //Configuracion de entradas y salidas del puerto b
set_tris_b(0b00000000); //Configuracion de entradas y salidas del puerto c

portc = 0b01000000;
portb = 0;

setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);

delay_ms(5);

bit_clear(ce);
spi_write(0b00000110); //se habilita el modo de escritura
bit_set(ce);

while(true)
{
while(!tecla_grabar)
{
conta++;
grabar_25lc512(0b00000010, 0, conta);
while(!tecla_grabar);
}

while(!tecla_leer)
{
portb = leer_25lc512(0);
while(!tecla_leer);
}

delay_ms(10);
}
}
///////////////////////////////////////////////////////////////////////////////
void grabar_25lc512(int instruccion, long direccion, char dato)
{
int dir_alto;
int dir_bajo;

dir_bajo = make8(direccion,0);
dir_alto = make8(direccion,1);

bit_clear(ce);
spi_write(0b00000010);
spi_write(0);
spi_write(0);
spi_write(1);
bit_set(ce);
}
///////////////////////////////////////////////////////////////////////////////
int leer_25lc512(long direccion)
{
int dir_alto;
int dir_bajo;
int dato_leido;

dir_bajo = make8(direccion,0);
dir_alto = make8(direccion,1);

bit_clear(ce);
spi_write(0b00000011);
spi_write(0);
spi_write(0);
dato_leido = spi_read(0);
bit_set(ce);

return(dato_leido);
}
///////////////////////////////////////////////////////////////////////////////

gracias



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Duda con spi_write(var) y memoria 25LC512
« Respuesta #1 en: 29 de Noviembre de 2011, 23:31:51 »
Sabes que sinceramente no veo nada raro  :? CCS maneja todo, o sea espera hasta que se envie el dato para retornar de spi_write(), así que no viene por ahí el tema  :tongue:
No contesto mensajes privados, las consultas en el foro

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Duda con spi_write(var) y memoria 25LC512
« Respuesta #2 en: 30 de Noviembre de 2011, 11:52:00 »
Hola Suky, gracias por responderme, la verdad creo que es un bug de Proteus porque hice varios ensayos con diferentes PIC y en proteus funciona mal pero en la realidad verificando con el osciloscopio funciona bien.

Saludos.