Buenas a todos, tengo implementada una comunicacion SPI en CCS con un 16F873, todo bien y funcionando, pero despues de pasar el circuito del protoboard a una placa de fenolico, aparecen ciertas cosas raras, la placa esta bien, ya la revise y la volvi a revisar, le cuento el problema, el SPI esta hecho por hardware, lo curioso es que si pongo la lectura o escritura del esclavo en el main() de la aplicacion, el pic genera el clock y los datos para el esclavo, ahora bien, si esa escritura o lectura la hago desde una funcion que llamo desde el main(), no genera ni el clock ni el dato, la rutina estoy seguro que se ejecuta, debido a que en el osciloscopio veo que baja y sube la pata del chip select, que esta antes antes y despues de la instruccion read_spi() respectivamente.
El programa espera una cadena de comandos desde la pc, en funcion de lo que envia la pc, se puede leer o escribir al esclavo SPI, esa evaluacion del comando enviado por la pc se hace en una funcion que se llama desde el main() despues que se completo la recepcion desde la PC.
En el archivo adjunto esta el codigo completo, tal como esta asi, el pic no genera el clock ni el dato para el esclavo SPI, ahora si lo coloco como lo pego a continuacion, el pic genera bien el codigo.
Probe a compilarlo con el CCS 4.0038, el 0057, y en ambos hace lo mismo.
Desde ya gracias.
Alejandro.
void main(){
int i=0;
//++++++++++++++++++Configura puertos analogicos++++++++++++++++++++++++++++++
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG ); // Ver que puertos van a ser analogicos
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_tris_a(0b11111111);
set_tris_b(0b00000000);
set_tris_c(0b10010010);
setup_spi(spi_master|spi_l_to_h|spi_clk_div_64);
//// seteo como deben estar cada uno de los pines del pic para empezar la comunicacion
output_high(pin_B1);
////seteo la transmision
delay_ms(500);
inicbuffRX(); // Borra buffer al inicio
inicbuffTX(); // Borra buffer al inicio
enable_interrupts(int_rda); // Habilita Interrupción RDA
// enable_interrupts(int_ext); // Habilita Interrupción RB0, PASO DE ALTO A BAJO
ext_int_edge(H_TO_L);
enable_interrupts(global); // Habilita interrupciones
//// mando dato al pote por spi para R=71.5K
//// mando primero el command byte y despues el dato
while(true){
spi_write(5);
}
}