Le agradecería mucho sus sugerencias para la definición de mi problema actual:
Tengo un microcontrolador ATmega128RFA1 con Zigbee integrado con UART-USB (Convertidor TTL) conectado a la PC.
Desde el ATmega128RFA1 he conectado a través de SPI un chip sensor de temperatura LTC2498.
Necesito leer The Temperature from LTC2498 en The Terminal Program en mi PC. El esquema es el siguiente:
LTC2498 - SPI - uC (Programado con el código Read_ltc2498) - UART_USB - PC.
El código con el que estoy trabajando es el siguiente:
#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <util/delay.h>
#define DD_MISO 3
#define DD_MOSI 2
#define DD_SCK 1
#define DD_SS 0
void uart_init()
{
uint16_t temp = ((8000000)/(9600.0*16)-1); //Berechnung Übertragungsgeschwindigkeit
UBRR0L = temp; //Übertragungsgeschwindigkeit übermitteln
UBRR0H = temp>>8;
UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //Senden und Empfangen freischalten
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Übertragungsformat: 8-Bit
}
int sendestring(char *s)
{
int i=0;
for(i=0; s[i] != '#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <util/delay.h>
#define DD_MISO 3
#define DD_MOSI 2
#define DD_SCK 1
#define DD_SS 0
void uart_init()
{
uint16_t temp = ((8000000)/(9600.0*16)-1); //Berechnung Übertragungsgeschwindigkeit
UBRR0L = temp; //Übertragungsgeschwindigkeit übermitteln
UBRR0H = temp>>8;
UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //Senden und Empfangen freischalten
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Übertragungsformat: 8-Bit
}
int sendestring(char *s)
{
int i=0;
for(i=0; s[i] != '%pre%'; i++)
{
while bit_is_clear(UCSR0A, UDRE0); //warten, bis UDRE0 = 1 (Senderegister frei)
UDR0 = s[i]; //ein Zeichen senden
}
return 0;
}
void SPI_MasterInit(void)
{
//Outputs: MOSI, SCK, SS
DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
//Enable SPI, Master-Mode, set clock rate fck/16
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
int SPI_MasterTransmit(char MOSI)
{
//start Transmission
SPDR = MOSI;
//wait for transmission complete
while(!(SPSR & (1<<SPIF)));
//returned data from slave to master
return SPDR;
}
int main()
{
char str[20];
// Thermoelement an CH0 und CH1
char masterOut1 = 0b10100000;
// interne Temperaturmessung:
char masterOut2 = 0b10000000;
char result;
uint32_t masterIn = 0;
uint32_t Temp = 0;
uart_init();
SPI_MasterInit();
for(;;)
{
_delay_ms(500);
//CS des Thermochips auf low
PORTB &= !(1<<DD_SS);
//Byte1
result = SPI_MasterTransmit(masterOut1);
masterIn = (result & 0b00011111); /*last 3 bits lost/*
sendestring(str);
//Byte2
result = SPI_MasterTransmit(masterOut2);
masterIn = (masterIn<<8) + result;
//Byte3
result = SPI_MasterTransmit(0);
masterIn = (masterIn<<8) + result;
//Byte4
result = SPI_MasterTransmit(0);
masterIn = (masterIn<<8) + result;
//CS des Thermochips auf high
PORTB |= (1<<DD_SS);
masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; /*Last 5 bits lost/*
sendestring(" masterIn: ");
sprintf(str, "%ld", masterIn);
sendestring(str);
//bei interner Temperaturmessung: Temperatur in °C berechnen laut Datenblatt Seite21
Temp = (masterIn*4/1570)-273;
sendestring(" Temp: ");
sprintf(str, "%ld", Temp);
sendestring(str);
_delay_ms(2000);
}
return 0;
}
'; i++)
{
while bit_is_clear(UCSR0A, UDRE0); //warten, bis UDRE0 = 1 (Senderegister frei)
UDR0 = s[i]; //ein Zeichen senden
}
return 0;
}
void SPI_MasterInit(void)
{
//Outputs: MOSI, SCK, SS
DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
//Enable SPI, Master-Mode, set clock rate fck/16
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
int SPI_MasterTransmit(char MOSI)
{
//start Transmission
SPDR = MOSI;
//wait for transmission complete
while(!(SPSR & (1<<SPIF)));
//returned data from slave to master
return SPDR;
}
int main()
{
char str[20];
// Thermoelement an CH0 und CH1
char masterOut1 = 0b10100000;
// interne Temperaturmessung:
char masterOut2 = 0b10000000;
char result;
uint32_t masterIn = 0;
uint32_t Temp = 0;
uart_init();
SPI_MasterInit();
for(;;)
{
_delay_ms(500);
//CS des Thermochips auf low
PORTB &= !(1<<DD_SS);
//Byte1
result = SPI_MasterTransmit(masterOut1);
masterIn = (result & 0b00011111); /*last 3 bits lost/*
sendestring(str);
//Byte2
result = SPI_MasterTransmit(masterOut2);
masterIn = (masterIn<<8) + result;
//Byte3
result = SPI_MasterTransmit(0);
masterIn = (masterIn<<8) + result;
//Byte4
result = SPI_MasterTransmit(0);
masterIn = (masterIn<<8) + result;
//CS des Thermochips auf high
PORTB |= (1<<DD_SS);
masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; /*Last 5 bits lost/*
sendestring(" masterIn: ");
sprintf(str, "%ld", masterIn);
sendestring(str);
//bei interner Temperaturmessung: Temperatur in °C berechnen laut Datenblatt Seite21
Temp = (masterIn*4/1570)-273;
sendestring(" Temp: ");
sprintf(str, "%ld", Temp);
sendestring(str);
_delay_ms(2000);
}
return 0;
}
He intentado cambiar la función SPI en los 4 modos para CPOL y CPHA bits en el registro SPCR pero no funciona.
Con los siguientes caracteres, he configurado LTC2498 de la siguiente manera:
32 bits: Byte1 = 10100000; Byte2 = 10000000; Byte3 = 00000000; Byte4 = 00000000;
Los resultados están alrededor de esto:
result1: 11111111 masterIn: 16777215 Temp: 42471
masterIn = DATAOUT según la hoja de datos de LTC2498 tiene que ser alrededor de 80000, por lo que es demasiado alto.
¿Podría alguien ayudarme con este problema?