TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: manwenwe en 04 de Octubre de 2006, 16:34:32
-
Hola! Estoy intentando comunicar dos 16f877 mediante SPI utilizando las funciones propias de CCS pero necesito algo de ayuda pues no me funciona :mrgreen: El código en ambos micros es el siguiente:
PicMaestro:
#include <16f877.h> //pic a utilizar
#use delay (clock=4000000) //Fosc=4Mhz
void main (void)
{
SET_TRIS_C(0b00010000);
SET_TRIS_A(0);
OUTPUT_LOW(pin_a0);
delay_ms(5);
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
SPI_WRITE('A');
while(TRUE) {};
}
Pic_Esclavo:
#include <16f877.h> //pic a utilizar
#use delay (clock=4000000) //Fosc=4Mhz
#include<lcd.c> //libreria manejo lcd
void main(void)
{
SET_TRIS_A(0xFF);
SET_TRIS_B(0);
SET_TRIS_C(0b00101000);
setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_CLK_DIV_16);
do {} while (SPI_DATA_IS_IN() != (TRUE));
lcd_init(); //inicializa lcd
printf(lcd_putc,SPI_READ());
do{} while(TRUE);
}
Y las conexiones son las siguientes:
MAESTRO ESCLAVO
RC3/SCK <<======>> RC3/SCK
RC4/SDI <<======>> RC3/SDO
RC5/SDO <<======>> RC4/SDI
RA0 <<======>> RA5/SS(negado)
No he montado el circuito pero lo he simulado en ISIS PROTEUS y no me obtengo resultados en el LCD(este si que funciona seguro...). Me da el siguiente warning que no entiendo: Warning: [U1] at 39.0000u (PC=0x00F3): MSSP slave mode with no SS pin control and CKE==1 is ambiguous!....
Espero que alguien pueda echarle un vistazo al codigo para ver cual fue mi fallo o mostrarme un código en CCS para SPI que funcione. Muchas gracias compañeros!!!
-
Yo que tu reviso el esclavo
Al Porta<5> configuralo como DIGITAL, sino el RA5 no funcionará como CS del SPI.
RC5/SDO debe ser SALIDA
RC4/SDI debe ser ENTRADA
RC3/SCK debe ser ENTRADA
El TRISC debiera quedar 0b00011000
-
Modifiqué el codigo: puse la linea SCK del esclavo como debia ser...entrada(craso error :shock:) e incluí en ambos codigos SETUP_ADC_PORTS(NO_ANALOGS); para asegurarme de que las lineas de PORTA son digitales en ambos. He conseguido eliminar otros cuantos warnings pero me sigue saliendo:
Warning: [U1] at 41.0000u (PC=0x00F3): MSSP slave mode with no SS pin control and CKE==1 is ambiguous!===>> en el PIC ESCLAVO
... creo que este es el error... Se que con CKP y CKE se configura el tipo de flanco de reloj que es donde estará el error pero con las funciones propias de CCS no se pueden modificar estos "flags" ¿? ¿O puede ser otro el error? MUCHAS GRACIAS!!!!!
-
Modifiqué el codigo: puse la linea SCK del esclavo como debia ser...entrada(craso error :shock:) e incluí en ambos codigos SETUP_ADC_PORTS(NO_ANALOGS); para asegurarme de que las lineas de PORTA son digitales en ambos. He conseguido eliminar otros cuantos warnings pero me sigue saliendo:
Warning: [U1] at 41.0000u (PC=0x00F3): MSSP slave mode with no SS pin control and CKE==1 is ambiguous!===>> en el PIC ESCLAVO
... creo que este es el error... Se que con CKP y CKE se configura el tipo de flanco de reloj que es donde estará el error pero con las funciones propias de CCS no se pueden modificar estos "flags" ¿? ¿O puede ser otro el error? MUCHAS GRACIAS!!!!!
Fijate lo que hace SPI_H_TO_L en la función en el MPSIM y fíjate como quedan configurados los registros SSPCON, SSPTAT.
Respecto a los warnings de Proteus no te puedo ayudar porque realmente lo usé muy poco.
-
Cambié de flanco de subida a flanco de bajada en ambos códigos y la salida al LCD por una salida simple digital hacia leds y... vualá!!!!! La razón(de lo del tipo de flanco) nunca la sabré pues a saber que hay dentro de las funciones SPI :lol: pero weno.... y reconozco que pequé de vanidad al pensar que no era problema del LCD... De todas formas muchas gracias Maunix!!!!
Me gustaría hacer otra pregunta para quien me puda ayudar; no tiene nada que ver con este hilo pero creo que no tiene entidad para molestar a los foreros.... Manejo mas o menos bien ANSI C y acabo de cambiar de ASM a C para PIC; he instalado CCS y he integrado el compilador en MPLAB que me es mas familiar que el IDE de PCW. A riesgo de hacer una pregunta absurda: ¿cual es la forma de incluir tipos de datos?. Es decir, escribo(p.e.): char manu = 'M'; ó int x = 5; dentro del main() y el compilador me da el siguiente fallo: "A numeric expression must appear here"...¿? Gracias y salu2!
-
Aquí tendrás poca suerte para una pregunta así, porque el tema no se relacinoa mucho. Encima dice Comunicacion ISP en vez de SPI. jeje.
Andá a este link
http://www.todopic.com.ar/foros/index.php?topic=14156.msg84978#msg84978 (http://www.todopic.com.ar/foros/index.php?topic=14156.msg84978#msg84978)
Ahi tenes varios links sobre CCS, no te ayudo porque no lo uso