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:
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
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
#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