Autor Tema: problema con SPI solo funciona unos segundos  (Leído 5205 veces)

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

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
problema con SPI solo funciona unos segundos
« en: 02 de Mayo de 2014, 00:31:45 »
Hola, tengo un programita que manda un dato cada medio segundo a otro pic por SPI, el problema esta en que tiene un funcionamiento anormal, primero recibe el dato por spi y lo deja encendido unos 2 segundos, despues funciona la comunicacion correctamente por 2 segundos y luego simplemente es como si ya no recibiera nada por spi, comprobe que sigue funcionando el receptor ya que en una ocasion puse un led a paradear y lo continua haciendo aun cuando la comunicacion ya no funciona, acontinuacion pongo mi codigo, espero me pudan ayudar, muchas gracias


CODIGO DEL PIC MAESTRO

Código: [Seleccionar]
//Comunicar 2 PICs 18F4550 utilizando el protocolo SPI.
//
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//CABECERA///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>                  //pic a utilizar
#fuses inths                                    //oscilador interno

#FUSES NOPROTECT              //Code not protected from reading
#FUSES NOBROWNOUT             //No brownout reset
#FUSES BORV20                 //Brownout reset at 2.0V
#FUSES NOPUT                  //No Power Up Timer
#FUSES NOCPD                  //No EE protection
#FUSES NOSTVREN               //Stack full/underflow will not cause reset
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES NOLVP                  //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                  //Program memory not write protected
#FUSES NOWRTD                 //Data EEPROM not write protected
#FUSES NOIESO                 //Internal External Switch Over mode disabled
#FUSES NOFCMEN                //Fail-safe clock monitor disabled
#FUSES NOPBADEN               //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                 //configuration not registers write protected
#FUSES NOWRTB                 //Boot block not write protected
#FUSES NOEBTR                 //Memory not protected from table reads
#FUSES NOEBTRB                //Boot block not protected from table reads
#FUSES NOCPB                  //No Boot Block code protection
#FUSES NOLPT1OSC              //Timer1 configured for higher power operation
#FUSES NOMCLR                 //Master Clear pin used for I/O
#FUSES NOXINST                //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(internal=8Mhz)           //frecuencia del oscilador

/////////////////////////////////////////////////////////////////////////////////////
//VARIABLES GLOBALES////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//FUNCIONES/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//PRINCIPAL/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void main( )
{
   setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);    //configurar spi como maestro
   output_high(PIN_B2);
   delay_ms(50);
   while(1)
   {
      spi_write(1);    //escribir en el pin ra1
      output_low(PIN_B2);
      delay_ms(50);
      spi_write(0);    //escribir en el pin ra1
      output_high(PIN_B2);     
      delay_ms(50);
   }



CODIGO DEL PIC ESCLAVO

Código: [Seleccionar]
//Comunicar 2 PICs 18F4550 utilizando el protocolo SPI. Cuando hay un "1" lógico
//en el pin ra1 se enciende un diodo led.
//
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//CABECERA///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>                  //pic a utilizar
#fuses inths                                    //oscilador interno

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES WDT128                 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOPROTECT              //Code not protected from reading
#FUSES NOBROWNOUT             //No brownout reset
#FUSES BORV20                 //Brownout reset at 2.0V
#FUSES NOPUT                  //No Power Up Timer
#FUSES NOCPD                  //No EE protection
#FUSES NOSTVREN               //Stack full/underflow will not cause reset
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES NOLVP                  //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                  //Program memory not write protected
#FUSES NOWRTD                 //Data EEPROM not write protected
#FUSES NOIESO                 //Internal External Switch Over mode disabled
#FUSES NOFCMEN                //Fail-safe clock monitor disabled
#FUSES NOPBADEN               //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                 //configuration not registers write protected
#FUSES NOWRTB                 //Boot block not write protected
#FUSES NOEBTR                 //Memory not protected from table reads
#FUSES NOEBTRB                //Boot block not protected from table reads
#FUSES NOCPB                  //No Boot Block code protection
#FUSES NOLPT1OSC              //Timer1 configured for higher power operation
#FUSES NOMCLR                 //Master Clear pin used for I/O
#FUSES NOXINST                //Extended set extension and Indexed Addressing mode disabled (Legacy mode)


#use delay(internal=8Mhz)           //frecuencia del oscilador

/////////////////////////////////////////////////////////////////////////////////////
//VARIABLES GLOBALES////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//FUNCIONES/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//PRINCIPAL/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void main()
{
   output_c(0x00);
   setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);     //configurar spi como esclavo
   for(;;)
   {
     /* output_low(PIN_C0);
      delay_ms(500);
      output_high(PIN_C0);     
      delay_ms(500);
     */
       if(spi_data_is_in())      //si hay un dato en el spi
      {       
         //output_d(spi_read()); 
         output_c(spi_read());
      }else{
         
      }
   }
}

« Última modificación: 02 de Mayo de 2014, 00:33:59 por urielm80 »

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #1 en: 02 de Mayo de 2014, 01:42:49 »
Hola, les comento que realize otra prueba, modifique mi codigo del slave de la sig manera

Código: [Seleccionar]
//Comunicar 2 PICs 18F4550 utilizando el protocolo SPI. Cuando hay un "1" lógico
//en el pin ra1 se enciende un diodo led.
//
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//CABECERA///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>                  //pic a utilizar
#fuses inths                                    //oscilador interno

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES WDT128                 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOPROTECT              //Code not protected from reading
#FUSES NOBROWNOUT             //No brownout reset
#FUSES BORV20                 //Brownout reset at 2.0V
#FUSES NOPUT                  //No Power Up Timer
#FUSES NOCPD                  //No EE protection
#FUSES NOSTVREN               //Stack full/underflow will not cause reset
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES NOLVP                  //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                  //Program memory not write protected
#FUSES NOWRTD                 //Data EEPROM not write protected
#FUSES NOIESO                 //Internal External Switch Over mode disabled
#FUSES NOFCMEN                //Fail-safe clock monitor disabled
#FUSES NOPBADEN               //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                 //configuration not registers write protected
#FUSES NOWRTB                 //Boot block not write protected
#FUSES NOEBTR                 //Memory not protected from table reads
#FUSES NOEBTRB                //Boot block not protected from table reads
#FUSES NOCPB                  //No Boot Block code protection
#FUSES NOLPT1OSC              //Timer1 configured for higher power operation
#FUSES NOMCLR                 //Master Clear pin used for I/O
#FUSES NOXINST                //Extended set extension and Indexed Addressing mode disabled (Legacy mode)


#use delay(internal=8Mhz)           //frecuencia del oscilador

/////////////////////////////////////////////////////////////////////////////////////
//VARIABLES GLOBALES////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//FUNCIONES/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//PRINCIPAL/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void main()
{
   output_c(0x00);
   setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);     //configurar spi como esclavo
   for(;;)
   {
     /* output_low(PIN_C0);
      delay_ms(500);
      output_high(PIN_C0);     
      delay_ms(500);
     */ if(spi_data_is_in())      //si hay un dato en el spi
      {       
         //output_d(spi_read()); 
         //output_high(PIN_C0);
         output_e(spi_read());
         
         output_toggle(PIN_C0);
         delay_ms(50);
      }else{
         
      }
     
   }
}

notese que dentro de el if que indica si recibio dato puse un toggle al pin c0 y para mi sorpresa el toggle lo contunua haciendo, pero en el puerto d no muestra lo que se manda por SPI, mmm esto me deja muy confuso, que podra ser????

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: problema con SPI solo funciona unos segundos
« Respuesta #2 en: 02 de Mayo de 2014, 07:06:52 »
lo estas haciendo con pics reales o una simulacion en proteus??

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #3 en: 02 de Mayo de 2014, 10:37:38 »
lo estas haciendo con pics reales o una simulacion en proteus??

con un pic real, en la simulacion funciona sin problemas

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con SPI solo funciona unos segundos
« Respuesta #4 en: 02 de Mayo de 2014, 12:45:32 »
Usas el oscilador interno? Hay veces que el oscilador interno dá muchos problemas en las comunicaciones, me ha pasado alguna que otra vez
Has probado usando un cristal externo?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #5 en: 02 de Mayo de 2014, 12:57:42 »
Usas el oscilador interno? Hay veces que el oscilador interno dá muchos problemas en las comunicaciones, me ha pasado alguna que otra vez
Has probado usando un cristal externo?

Hola ppyote, gracias por tu respuesta, te comento que desafortunadamente no uso el oscilador externo porque tengo problemas con el, de hehco tengo otro mensaje en esta misma seccion del foro con mi problema con el oscilador externo

http://www.todopic.com.ar/foros/index.php?topic=42701.0

asi que no me queda mas que intentar con el interno, algo curioso es que en el esclavo coloque un led que enciende cuando hay recepcion de datos y funciona siempre, y en el maestro coloque un boton que es el que activa la comunicacion y tambien funciona bien, el problema es que el esclavo solo muestra el dato correctamente en el puerto los primero s 2 o 3 segundos despues de que enciendo el pic, despues no se que pasa con el pic que nadamas no recibe el dato bien, tambien prove a esperar 5 segundos antes de enviar la primera vez el dato y ya no lo recibe bien, esto me hizo creer que hay algo en la configuracion que hace que despues de cierto tiempo (2 o 3 segundos) el registro donde recibe los datos no funcione correctamente, como si se reconfigurara

alguien le ha pasado o tiene alguna idea???

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con SPI solo funciona unos segundos
« Respuesta #6 en: 02 de Mayo de 2014, 15:26:17 »
A mi me parece que el error puede ser que estás demorando la recepción de datos más de lo que demoran en llegar, y produciendo un overflow del buffer de recepción.

Maestro:

Código: C#
  1. /////////////////////////////////////////////////////////////////////////////////////
  2. //PRINCIPAL/////////////////////////////////////////////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////
  4. void main( )
  5. {
  6.    setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);    //configurar spi como maestro
  7.    output_high(PIN_B2);
  8.    delay_ms(50);
  9.    while(1)
  10.    {
  11.       spi_write(1);    //escribir en el pin ra1
  12.       output_low(PIN_B2);
  13.       delay_ms(1000);
  14.       spi_write(0);    //escribir en el pin ra1
  15.       output_high(PIN_B2);      
  16.       delay_ms(1000);
  17.    }
  18. }

Esclavo:

Código: C#
  1. /////////////////////////////////////////////////////////////////////////////////////
  2. //PRINCIPAL/////////////////////////////////////////////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////
  4. void main()
  5. {
  6.    output_c(0x00);
  7.    setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);     //configurar spi como esclavo
  8.    for(;;)
  9.    {
  10.        if(spi_data_is_in())      //si hay un dato en el spi
  11.          output_d(spi_read());  
  12.    }
  13. }

y no olvides deshabilitar el Watch Dog Timer en el Maestro, que veo has omitido su FUSE.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #7 en: 02 de Mayo de 2014, 17:15:45 »
A mi me parece que el error puede ser que estás demorando la recepción de datos más de lo que demoran en llegar, y produciendo un overflow del buffer de recepción.

Maestro:

Código: C#
  1. /////////////////////////////////////////////////////////////////////////////////////
  2. //PRINCIPAL/////////////////////////////////////////////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////
  4. void main( )
  5. {
  6.    setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);    //configurar spi como maestro
  7.    output_high(PIN_B2);
  8.    delay_ms(50);
  9.    while(1)
  10.    {
  11.       spi_write(1);    //escribir en el pin ra1
  12.       output_low(PIN_B2);
  13.       delay_ms(1000);
  14.       spi_write(0);    //escribir en el pin ra1
  15.       output_high(PIN_B2);      
  16.       delay_ms(1000);
  17.    }
  18. }

Esclavo:

Código: C#
  1. /////////////////////////////////////////////////////////////////////////////////////
  2. //PRINCIPAL/////////////////////////////////////////////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////
  4. void main()
  5. {
  6.    output_c(0x00);
  7.    setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);     //configurar spi como esclavo
  8.    for(;;)
  9.    {
  10.        if(spi_data_is_in())      //si hay un dato en el spi
  11.          output_d(spi_read());  
  12.    }
  13. }

y no olvides deshabilitar el Watch Dog Timer en el Maestro, que veo has omitido su FUSE.

Saludos.

Hola, gracias por la respuesta, pero deja te comento que no lo estoy retrasando, a pesar de que tenia un led parpadeando, hice la prueba y comente el código

Código: [Seleccionar]
/* output_low(PIN_C0);
      delay_ms(500);
      output_high(PIN_C0);     
      delay_ms(500);
     */

de hecho así lo deje, por lo que nunca entra a este código, incluso he modificado el maestro para que solo mande la transmisión cuando yo presione un botón y aun así solo funciona la transmisión en los primeros segundos, después ya no recibe el dato, que otra cosa podría ser????

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #8 en: 11 de Mayo de 2014, 02:08:34 »
ya coloque el fuse de NOWDT en el maestro pero sigo con el problema de que solo funciona los primeros 4 segundos, alguien mas tiene alguna idea de porque pasa esto y no sigue funcionando la comunicacion por SPI?? como les comento en proteus funciona pero en fisico nadamas no funciona mas de 4 segundos despues de energizarlo

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con SPI solo funciona unos segundos
« Respuesta #9 en: 11 de Mayo de 2014, 19:56:06 »
en los fuses no declaras el tipo de comunicacion spi que deseas.... usas el spi por software o hardware?
prueba insertando estas lineas despues del #use delay()
#use spi(MASTER,BITS=8,FORCE_HW)
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #10 en: 12 de Mayo de 2014, 00:50:22 »
en los fuses no declaras el tipo de comunicacion spi que deseas.... usas el spi por software o hardware?
prueba insertando estas lineas despues del #use delay()
#use spi(MASTER,BITS=8,FORCE_HW)

Hola ppyote utilizo el spi por hardware, inserte las lineas que me comentas después del delay tanto para el maestro como para el esclavo, cambiando en las del esclavo la palabra MASTER por SLAVE, aun así no funciona mas de unos segundo, ya intente probar con SPI por interrupción y nunca entra a la interrupción, que mas podría hacer?

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con SPI solo funciona unos segundos
« Respuesta #11 en: 12 de Mayo de 2014, 06:47:30 »
Podrías limpiar el bit de la interrupción spi poniendo a 0 el bit respectivo
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #12 en: 12 de Mayo de 2014, 12:47:46 »
Podrías limpiar el bit de la interrupción spi poniendo a 0 el bit respectivo

pero ni siquiera entra la primera vez a la interrupción.
Hice una prueba poniendo interrupciones y las active pero jamas entro a la interrupción y cuando lo utilizo sin interrupciones lee correctamente el dato que le envíe solo los primeros 4 segundos

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: problema con SPI solo funciona unos segundos
« Respuesta #13 en: 12 de Mayo de 2014, 14:31:09 »
Yo creo que no configuras bien la señal de clock del esclavo, mira la página 201 del. Datasheet como puedes configurarlo
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado urielm80

  • PIC10
  • *
  • Mensajes: 30
Re: problema con SPI solo funciona unos segundos
« Respuesta #14 en: 27 de Mayo de 2014, 20:24:30 »
decidi rehacer el codigo de 0, implemente un display de 7 segmentos en el esclavo y mando un numero desde el marestro por spi y funciona bien, aunque cuando conecto por ejemplo un sensor en el puerto del maestro y envio la lectura de ese pin a el esclav por spi, hay ocasiones en las que manda mal el dato, saben a que se debera???


 

anything