Autor Tema: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....  (Leído 10683 veces)

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

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #15 en: 13 de Octubre de 2010, 19:36:11 »
Ya lo solucione  :-/  :-/, resulta que mi error era mas sencillo de lo que parecia, mas bien fue un error de observacion, despues de intentar como mil intentos, me di cuenta que mi configuracion en el esclavo estaba mal, concretamente el bit SMP, del registro SSPSTAT, que en el esclavo debe ser 0, y yo lo ponia a 1, error, jajaja bueno gracias por la ayuda
Nunca se deja de aprender

Desconectado Lobo_Azul

  • PIC10
  • *
  • Mensajes: 29
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #16 en: 30 de Octubre de 2010, 18:22:39 »
   Que bien que hayas solucionado tu problema thegame, pero podrías subir los códigos que hiciste para nosotros los principiantes, si no es mucha molestia, yo quiero empezar a trabajar con este protocolo tambien, de todas formas gracias... :P

Desconectado Lobo_Azul

  • PIC10
  • *
  • Mensajes: 29
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #17 en: 10 de Noviembre de 2010, 22:40:01 »
   Hi thegame, pues ando revisando este foro de nuevo pero no veo respuesta........ :(
O al menos podrías decirme a cual 1 y cual 0 es al que te refieres que resolvio tu problema y donde esta en el codigo??
Y otra preguntita  :P : Las lineas

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

que pones en tu código son forzosamente necesarias para el SPI con el 18F4550, es decir que si pongo al maestro y esclavo con un 18f4550 deben ser necesarias esa lineas, pero si pongo como maestro un 18f4550 y esclavo un 16f877 esas lineas cambian o sólo las usas para configurar la salida del led???

Gracias de todas formas.

Desconectado Lobo_Azul

  • PIC10
  • *
  • Mensajes: 29
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #18 en: 20 de Noviembre de 2010, 19:56:06 »
    :huh:  Hola de nuevo, sigo esperando respuesta a mis dudas, pero no la veo, o al menos podría alguien ayudarme, ya que yo he puesto como maestro un PIC18F4550 y como esclavo un PIC16F877A, pero no logro hacer que el esclavo me envíe datos (he puesto vartias lineas como comentarios a modo de prueba, pero ninguna funciona), quisiera ver si alguien me puede ayudar, pongo los códigos para ver si alguien puede decirme donde esta mi error o como puedo hacer para que el esclavo me envíe los datos del convertidor AN0 que pongo en este caso, agrdecería su ayuda, gracias.   :?:

Soy algo nuevo en esto de responder, pero tambien adjunto el proyecto entero que he realizado en Proteus y una imagen del mismo; espero ayuda gracias...   :?


Para maestro:
Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(MASTER,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

int8 leidoesc;

void main(void)
{
   bit_clear(TRISB,7);
   bit_set(PORTB,7);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);
   bit_clear(PORTB,7);
  
   while(1)
   {
      spi_write(0xFF);
                delay_ms(1000);
                
       spi_write(0x16); //recibir
       if(spi_data_is_in())
       {
         leidoesc = spi_read();
         output_d (leidoesc);
         delay_ms(250);
       }
   }
  
}




Para esclavo:

Código: [Seleccionar]
#include <16f877a.h>
#DEVICE ADC=8
#use delay(clock=20000000)
//#byte puerto_b=06

void canal_0(void);

int conversion=0, valor_spi, dummy;

void main()
{
  setup_adc_ports(RA0_ANALOG);
  setup_adc(ADC_CLOCK_DIV_2);
  set_tris_a(255);
  set_tris_c(223);
  set_tris_b(0);
  //puerto_b = 0;
  setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16| SPI_XMIT_L_TO_H);
  do
   {
     if(spi_data_is_in())
       {
         //canal_0();
         valor_spi = spi_read();
         output_d(valor_spi);
         delay_ms(250);
         //canal_0();
         //spi_write(conversion);
         output_b(conversion);
         //dummy = spi_read();
         //spi_write(conversion);
         delay_ms(250);
         //spi_write(conversion);
         //output_b (0);
       }

          /* canal_0();
           spi_write(conversion);
           delay_ms(250);*/
           //output_b (0);

      
   }
  while(true);
}

void canal_0(void)
{
   setup_adc(adc_clock_div_32);           // Encendemos el conversor
   set_adc_channel(0);
   delay_us(20);
   conversion = read_adc();
   conversion = conversion << 1;
    
}

Pongo también la simulación que he hecho en proteus:




Desconectado Lobo_Azul

  • PIC10
  • *
  • Mensajes: 29
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #19 en: 20 de Noviembre de 2010, 19:58:14 »
Mmmmmm, o estaba pensando, debo poner esto como un nuevo tema???  :?

Gracias de todas formas.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #20 en: 11 de Septiembre de 2011, 23:26:45 »
ijole, una disculpa lobo azul, me desconecte bastante tiempo por mi trabajo, y apenas volvi a entrar, no se si ya allas resuelto tu problema amigo, pero si puedo ayudarte adelante, avisame y subire el codigo que utilice, que por cierto debo buscar jeje, pero no problema si no lo volvemos a hacer.

en cuanto a lo de las lineas que preguntas se ponen para mapear el registro tris y port del micro y de esta manera utilizar algunas funciones que trae el CCS, almenos asi lo he utilizado varias veces sin problema, claro hay otras funciones que realizan la misma accion pero depende de como programemos.

de nuevo una disculpa y yo estare al pendiente, por lo pronto buscare el codigo y lo subire en caso de que a alguien mas le sirva ok.
Nunca se deja de aprender

Desconectado borodelostoldos

  • PIC10
  • *
  • Mensajes: 7
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #21 en: 07 de Noviembre de 2012, 11:39:31 »
Hola chicas, para mandar un dato desde el esclavo al master, primero tienen que escribir un dato con el maestro: spi_write("cualquier cagada")
Cuando leen en el esclavo, si ademas quieren mandar un dato aprovechando el clock qeu genera el master, usan la función spi_read("dato que quiero mandar")
Asi mientras lee el dato que manda el master, que puede ser importante o no, el esclavo va mandando por la otra línea (SDO)el dato que quiere comunicar.
CCS Reference Manual 2012.pdf


 

anything