Autor Tema: Ayuda con SPI entre dos PIC 16f876  (Leído 3954 veces)

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

Desconectado pabarriu

  • PIC10
  • *
  • Mensajes: 12
Ayuda con SPI entre dos PIC 16f876
« en: 17 de Octubre de 2006, 21:01:08 »
Hola amigos,

   Estoy tratando de comunicar dos 16f876 por medio de SPI (pq ademas quiero grabar una MMC con SPI) usando CCS. Logro enviar datos desde el maestro a esclavo sin ningún problema, pero no he podido lograr que el esclavo responda al maestro de forma adecuada. La idea es enviar un número al PIC esclavo y que este responda de acuerdo a ello. El PIC maestro aumenta un contador al recibir una interrupción del puerto B y envía dicho número al PIC esclavo, esto funciona sin ningún problema.     

   Ahora bien, de acuerdo al número que recibe el esclavo, debe enviar un valor de vuelta al PIC maestro que obtiene de un arreglo. Que es lo que no funciona.

   Traté de simular un modo "framed SPI" utilizando un PIN extra (RC6) para hacer que cuando sea HIGH el PIC maestro envíe el clock de lectura (spi_read()). El PIC maestro lee el bit "framed" como otra interrupción en el puerto B (RB5). En el fondo con esto hago que el esclavo solicite un clock de lectura. Sin embargo esto no me ha funcionado. Les adjunto el código.

MAESTRO
Código: [Seleccionar]
#include "H:\Diseño\LCD\testSPI_2\master_3.h"
#include <stdio.h>
#include "H:\Diseño\LCD\testSPI_2\flex_lcd_2.c"

char text0[]="\fSend1:";
char text1[3];
char text2[]="Rec1:";

int data_in=0, linea=0, flag=0, data=0;
int index[]={0,0};
byte port_b, last_b;

void print_linea(int lin, int data);
//void linea2();

#int_RB
void RB_isr()
{
   byte changes;
   port_b=input_b();
   changes = last_b ^ port_b;
   last_b = port_b;
   if (bit_test(changes,4) && !bit_test(last_b,4))
   {
   linea=1;
   flag=2;
   }
   if (bit_test(changes,5) && !bit_test(last_b,5))
   {
   data_in=spi_read(0);
   }
//   delay_ms(200); //Desahbilita la interrupcion del flanco de bajada.
}

#int_EXT
void EXT_isr()
{

   linea=0;
   flag=1;

}

void print_linea(int lin, int data)
{
   if(index[lin]==6) index[lin]=0;

   spi_write(index[lin]);
   sprintf(text1,"%2d",data);
   lcd_put_string_xy(text1,10,lin+1);
   index[lin]++;
}


void main()
{

   lcd_init();
   lcd_setcursor(0,0);
   last_b=input_b();

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_RB);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   lcd_put_string(text0);
   lcd_put_string_xy(text2,1,2);

   sprintf(text1,"%2d",index[0]);
   lcd_put_string_xy(text1,10,1);
   sprintf(text1,"%2d",index[1]);
   lcd_put_string_xy(text1,10,2);

   //data_in=spi_read(0);

   while(1)
      {
      if(flag==1)
         {
         print_linea(linea, data_in);
         flag=0;
         }
      if(flag==2)
         {
         print_linea(linea, data_in);
         flag=0;
         }


      }

}


ESCLAVO
Código: [Seleccionar]
#include "H:\Diseño\LCD\testSPI_2\slave_3.h"
#include <stdio.h>
#include "H:\Diseño\LCD\testSPI_2\flex_lcd_2.c"

int index;

int data_out[]={2,4,6,8,10};

char text1[3];
char text2[]="\fRecibido:";
char text3[]="Enviado:";

void outspi();


#int_SSP
SSP_isr()
{
if(spi_data_is_in()) index=spi_read();
sprintf(text1,"%2d",index);
lcd_put_string_xy(text1,10,1);
}


void outspi()

{

   spi_write(data_out[index]);
   output_high(PIN_C6);
   output_low(PIN_C6);
   

}


void main()
{

   lcd_init();
   lcd_setcursor(0,0);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SLAVE|SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);

   lcd_put_string(text2);
   lcd_put_string_xy(text3,1,2);
   spi_write(data_out[index]);

   while(1)
   {
 //  outspi();


   }

}

Ojalá alguno de ustedes me peuda ayudar. Se me olvidaba utilizo la flex_lcd_2.c configurada como 6 pines del puerto A en orden correlativo.

Saludos!!!



Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #1 en: 18 de Octubre de 2006, 02:18:13 »
me encantaria ayudarte amigo pero no he usado el SPI , mas conozco del I2C y las rutinas del C siempre funcionan, yo uso el CCS PIC, q extraño q te salga fallas, un poco lo malo del C es q no puedes identificar exactamente la falla, pero indaga mas dentro del foro, estoy seguro q encontraras la informacion q requieres.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Deimos

  • Visitante
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #2 en: 18 de Octubre de 2006, 12:57:14 »
En definitiva es poner dos micros conectados por SPI. Lo ke puedes hacer es usar un pin a parte, de forma que el esclavo mande un 0 al SS del maestro, de manera que el maestro conmute a recepcion de datos. El maestro seguirá mandando el clock y el CS al esclavo, pero al recibir el 0 por SS, el maestro preparará la máquina para ponerse a recibir datos por la SI.

Suerte

Desconectado pabarriu

  • PIC10
  • *
  • Mensajes: 12
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #3 en: 18 de Octubre de 2006, 13:49:35 »
hola,

Eso es precisamente lo que hago. Pero igual no funciona.

Saludos

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #4 en: 18 de Octubre de 2006, 16:00:13 »
busca mas info en el foro amigo, pero tambien voy a buscar por mi lado a ver q encontramos, ah porsiacaso, lo has intentado simular en proteus????? :shock:
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Deimos

  • Visitante
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #5 en: 19 de Octubre de 2006, 12:52:25 »
Hola pabarriu, mirate la configuracion interna del modulo SPI, veras que la SS es una entrada de una puerta AND. Si tienes habilitado el bit de SS control enable, en el momento que mandes un cero, la salida de dicha AND será cero, con lo que permites el paso por la tri-state de los bits de datos. Cuando el master envia un cero a la SS del esclavo, lo que está haciendo es poner un cero en la salida de dicha AND, y permite el paso de los datos que estan en SSPSR por SDO, pero, si sigues mirando resulta que el mismo cero de la AND te corta el reloj de sincronizacion del SSPSR. Pero de todos modos parece un fallo de configuracion mas que de otra cosa. Dices que de maestro a esclavo funciona, pero al revés no.

Puedes probar lo siguiente, no uses la entrada de SS y utiliza otra entrada con interrupcion asociada. El slave le manda un bit por la entrada con intrr al master, cuando el master reciba la intrr se reconfigura para recibir. Prueba así, si funciona ya sabes que es algo mal programado, porque esto tal y como te lo ponen en el datasheet funciona. Te lo garantizo.

Salu2

Desconectado pabarriu

  • PIC10
  • *
  • Mensajes: 12
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #6 en: 19 de Octubre de 2006, 16:56:21 »
Micro_cadaver: Lo estoy simulando en Proteus.

Deimos: no uso el SS, de hecho utilizo un pin de interr del puerto B para avisarle al master que reciba. Pero eso no funciona siempre....solo a veces.

Muchas gracias por sus respuestas, pero sigue estancado. Ahora he estado pensando en comunicarme I2C con el otro PIC y SPI con la memoria MMC.

Saludos!

Deimos

  • Visitante
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #7 en: 19 de Octubre de 2006, 19:20:22 »
A la MMC seguramente no te quede mas remedio que hacerlo con SPI, seguramente la MMC solo tiene puerto SPI, es lo mas normal.

Mira a ver que reciba bien las interr y que las tienes bien configuradas, que tienen la prioridad correcta, si a veces las pilla y a veces no es que coinciden con otra intrr y por eso no las sirve siempre. Mira tu programa porque parece, por lo ke cuentas ahora, que sea un problema de tiempos.

Venga chavalote, que ya casi lo tienes!!!!

Salud y República!!!

Desconectado pabarriu

  • PIC10
  • *
  • Mensajes: 12
Re: Ayuda con SPI entre dos PIC 16f876
« Respuesta #8 en: 20 de Octubre de 2006, 13:39:34 »
Hola,

   Va avanzando esot, ahora logro que transmita, pero no logro obtener el clock de lectura desde el master.....

Vamos qeu se puede!