Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

06/07/2015 #1


Cómo Recibir un dato de 16bits por SPI? separar 8 y 8
Buenas! Estoy armando un control R.F con analógicos y no entiendo mucho el tema de SPI.
El problema que me surgió es que no sé como recibir el dato, se que envío 8bits de eje X y 8bits de eje Y, pero al enviarlo supongo que se junta en un dato de 16 bits y a la hora de recibirlo no sé cómo separarlo sin perder información.

Para enviar hago esto:
Código PHP:
do{
PORTB ADC_GET_SAMPLE(0); //leo el chanel 0
                
delay_us(20);
                
VRX PORTB;
                
SPI1_Write(VRX);   //envio el dato VRX
                
while(SSPSTAT.BF==1);  //mientras el buffer esta en 1
                
delay_ms(100);
                
PORTD ADC_GET_SAMPLE(1);
                
delay_us(20);
                
VRY PORTD;
                
SPI1_Write(VRY);
                while(
SSPSTAT.BF==1);
                
delay_ms(100);
             }while(
1); 
¿Cómo podría hacer para recibirlo?
Si me pueden dar una manito se los agradecería mucho. Saludos.

PD: uso mikroC. Es comunicación entre dos PIC (16F877A y 18F4550)
06/07/2015 #2

Avatar de Nuyel

A menos de que el registro de entrada sea de 16bits (y lo dudo con esos PIC), deberías recibirlos como 8 bits y el microcontrolador tener una interrupción cuando eso pasa, entonces solo sacar los datos y listo, por que el buffer se borra al siguiente dato y el SPI es síncrono simultáneo, los datos entran y salen al mismo tiempo, y para esos PIC una ves que se transmite el dato recibido ocupa el mismo buffer.
06/07/2015 #3

Avatar de Daniel Meza

Hola, pues puedes declarar dos variables, una para X y otra para Y y en la misma rutina de recepción guardar ambos valores recibidos en cada variable respectiva. Como dice Nuyel auxíliate de las banderas de interrupción para saber cuando se ha terminado de recibir un dato.
06/07/2015 #4

Avatar de Scooter

Puedes declarar una variable int de 16 bits y juntarlos:

Valor = alto*256+bajo

Alto y bajo son bytes de 8 bits

En la rutina de recepción harás algo así como

Alto=byte recibido;
Bajo=byte recibido;
06/07/2015 #5


Muchas a gracias a todos! voy a fijarme en las banderas de la interrupcion gracias! cualquier duda comento.
06/07/2015 #6

Avatar de TRILO-BYTE

lo que yo haria seria recibir los 16 bits de 1 tajo y seprara X y Y

unsigned int dato
unsigned char X, y;

X=dato &0X0F ; // el char se carga con el primer byte y lo enmascaro para quitar basura

y=(dato >>8) & 0X0F; //roto 8 veces a la derecha y lo enmascaro para quitar basura

y asi obtengo 2 bytes rebanados como jamon

que es mas comodo trabajar asi que con un int de 16 o 32 bytes
07/07/2015 #7


Me tira un corto en SCK, proteus dice "MSSP slave mode with no SS pin control and CKE==1 is ambiguous!"
Hasta donde se tengo todo configurado como corresponde, dejo ambos codigos, espero alguien pueda echarle un ojo y ayudarme con el tema! muchas gracias!
Archivos Adjuntos
Tipo de Archivo: rar ADC&SPI.rar (936 Bytes, 8 visitas)
07/07/2015 #8

Avatar de Scooter

Pues eso, al esclavo hay que seleccionarlo con un pin. Parece que no lo has conectado o que está mal.
No tengo proteus, así que no lo puedo ver.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.