Autor Tema: RA0 daña comunicacion spi  (Leído 1591 veces)

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

Desconectado MSANTHIAGO

  • PIC10
  • *
  • Mensajes: 11
RA0 daña comunicacion spi
« en: 17 de Marzo de 2017, 15:54:05 »
Hola a todos, tengo dos microcontroladores que se comunican por spi, un 16f887 que funciona como esclavo y un 18f458 que funciona como master, cada uno se conecta a una lcd para mostar lo que envia y lo que recibe. Hice pruebas para comprobar que los datos se envian y se reciben correctamente. Luego conecto al RA0 del master una señal entre 1 y 5 voltios para que sea leida por el adc del 18f458, este muestra el valor de la señal analogica en la lcd y luego la transmite por spi al 16f887 el cual solo muestra 127 o 129.
Esto solo ocurre al conectar la señal al RA0 del master. Por que sucede esto? Como puede solucionarse?
Estoy trabajando con un circuito en proteus.
Ojala puedan ayudarme.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:RA0 daña comunicacion spi
« Respuesta #1 en: 17 de Marzo de 2017, 19:56:22 »
Por lo que comentas, puede ser:

Programa
Problemas de simulador
O que tenes algun problema en el circuito.

Es un poco complicado si no das mas dato verificar que puede ser.

Desconectado MSANTHIAGO

  • PIC10
  • *
  • Mensajes: 11
Re:RA0 daña comunicacion spi
« Respuesta #2 en: 17 de Marzo de 2017, 22:07:09 »
Bueno aqui anexo el diagrama y el codigo del maestro y esclavo, por si pueden ayudarme.



codigo master:

#include <18f458.h>

#device adc=10
#fuses hs, nowdt
#use delay(clock=20M)
#use standard_io(b)

#include <lcd.c>


#define LCD_ENABLE_PIN  PIN_D0                             
#define LCD_RS_PIN      PIN_D1                                   
#define LCD_RW_PIN      PIN_D2                                 
#define LCD_DATA4       PIN_D4                                   
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                 
#define LCD_DATA7       PIN_D7     

void main()

   int16 lectura;
   float voltaje;
   
   lcd_init();
 
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_8);
   
   
   
   setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
 
   do
   {
      set_adc_channel(0);
      lectura = read_adc();
      voltaje = 5.0*lectura/1024;
      printf(lcd_putc, "\f%01.2fV", voltaje);
     
     
      spi_write(voltaje);
      delay_ms(1000);
 
   }
  while(true);
}

########################

codigo esclavo

#include <16f887.h>           
#fuses INTRC,nowdt                 
#use delay(clock=8M)         
#use fast_io(B)
#include <lcd.c>


#define LCD_ENABLE_PIN  PIN_D0                             
#define LCD_RS_PIN      PIN_D1                                   
#define LCD_RW_PIN      PIN_D2                                 
#define LCD_DATA4       PIN_D4                                   
#define LCD_DATA5       PIN_D5                                   
#define LCD_DATA6       PIN_D6                                 
#define LCD_DATA7       PIN_D7 
void main()
{
float data;
lcd_init();
printf(lcd_putc, "hola");
output_high(pin_b1);
delay_ms(1000);
  setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);
  do
   {
     if(spi_data_is_in())
       {
         data = spi_read();
         printf(lcd_putc, "\f%f", data);
         delay_ms(1000);
       }
   }
  while(true);
   }


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:RA0 daña comunicacion spi
« Respuesta #3 en: 18 de Marzo de 2017, 11:29:14 »
Tu problema esta aca:

Código: C
  1. spi_write(voltaje);


Del manual de CCS

Citar
Syntax:
spi_write (value)
spi_write2 (value)

Parameters: data is optional and if included is an 8 bit int.

Returns: Nothing

Si lees dice que el parametro que se le pasa es un entero de 8 bits o 1 byte.

Pero tu "voltaje" es un float, un float ocupa 4 bytes.
Lo que es tambien insensato es enviar el dato como float, es mejor enviarlo como entero.

Entonces... transmisor:

Código: C
  1. while(1)
  2. {
  3.       delay_ms(1000);
  4.  
  5.       set_adc_channel(0);                       // Esto se puede sacar afuera del while, porque siempre es el canal 0, no cambia.
  6.       lectura = read_adc();                     // Lectura tiene 2 bytes o 16 bits
  7.  
  8.       spi_write(lectura&0xFF);          // Envio el byte menor
  9.       spi_write(lectura>>8);            // Envio el byte mayor
  10.  
  11.       voltaje = 5.0*lectura/1024;
  12.       printf(lcd_putc, "\f%01.2fV", voltaje);
  13. }

Receptor:

Código: C
  1. while(1)
  2. {
  3.      data = spi_read();                 // Espero el valor del byte bajo, en estos datos espera hasta que llegue algo
  4.      data |= spi_read() << 8;   // Valor del byte alto
  5.      
  6.      voltaje = 5.0*lectura/1024;
  7.      printf(lcd_putc, "\f%01.2fV", voltaje);
  8. }
 


 

anything