Hallo,
ich lese mit SPI einen 24Bit Wert ein. Die 3 Einzel-Bytes stimmen.
Schiebe ich diese mittels ODER in ein unsigned long an passende Stelle, werden mir die höchsten freien Bits mit 1 aufgefüllt. Warum das denn? Muß doch 0 bleiben.
Lese ich die 3 Einzel Bytes nicht als Byte sondern als unsigned long ein, stimmt alles.
Code zur Verdeutlichung was ich meine.
Die Einzelbyte sind zum Bsp. so
1101 11010100 10100011
/*
Arduino Mega2560
*/
#include <SPI.h>
#define CS 38 // bring CS high for ADC sleep mode, low to start new conversion
#define MOSI 51 // MOSI is not used for this device
#define MISO 50 // status and data bits from ADC
#define SCK 52 // SPI clock from Arduino to ADC
unsigned long Messwert;
void setup()
{
Serial.begin(57600);
SPI.begin();
// Chip-Select auf HIGH
pinMode(27, OUTPUT); // EA DOGM
pinMode(28, OUTPUT); // SD-Karte
pinMode(29, OUTPUT); // MAX6675
digitalWrite(27, HIGH); // EA DOGM
digitalWrite(28, HIGH); // SD-Karte
digitalWrite(29, HIGH); // MAX6675
pinMode(53, OUTPUT); // change this to 53 on a Mega, normal 10
pinMode(CS, OUTPUT); // MCP3550-50
digitalWrite(CS, HIGH); // MCP3550-50
pinMode(MOSI, OUTPUT); // MOSI (data out from Arduino)
pinMode(MISO, INPUT); // MISO (data in to Arduino)
pinMode(SCK, OUTPUT); // SCK (serial clock)
//SPI.setClockDivider(SPI_CLOCK_DIV32); // SPI clock rate < 5 MHz per MCP3550 spec
//SPI.setBitOrder(MSBFIRST); // MSB first
SPI.setDataMode(SPI_MODE3); // rising/falling edge of clock
delay(1); // Zwangspause für MCP3550-50 Startup/Reset (normal 10µs)
}
void loop()
{
Serial.println("NEU: ");
Messwert = MCP3550();
Serial.println(Messwert, BIN);
Serial.println(Messwert);
Serial.println();
delay(2000);
}
unsigned long MCP3550 ()
{
unsigned long value = 0;
digitalWrite(CS, LOW);
delay(90);
digitalWrite(CS, HIGH);
delay(90);
digitalWrite(CS, LOW);
delay(90);
unsigned long Data1 = SPI.transfer(0); // Byte einlesen, D24 ... D16
unsigned long Data2 = SPI.transfer(0); // Byte einlesen, D15 ... D 8
unsigned long Data3 = SPI.transfer(0); // Byte einlesen, D 7 ... D 0
digitalWrite(CS, HIGH);
Serial.print(Data1, BIN); Serial.print(" "); Serial.print(Data2, BIN); Serial.print(" "); Serial.println(Data3, BIN);
value = (Data1 << 16) | (Data2 << 8) | Data3;
return value;
}
Wenn die 3 SPI Bytes als Byte einlese, werden die höchsten freien Bits von value mit Einsen aufgefüllt. Die müßte doch aber 0 bleiben, weil ja value immer neu genullt wird.
In einer anderen Funktion von mir mach ich das nach dem gleichen Schema und es funktioniert.
float MAX_6675(int CS)
{
digitalWrite(CS, LOW);
NOP; // delay 62.5ns on a 16MHz AtMega, 100ns erforderlich
NOP;
byte MSB = SPI.transfer(0); // höherwertiges Byte einlesen, D15 ... D8
byte LSB = SPI.transfer(0); // niederwertiges Byte einlesen, D7 ... D0
digitalWrite(CS, HIGH);
unsigned int KTemp = MSB << 8;
KTemp = KTemp | LSB;
KTemp = KTemp >> 3;
//float Celius = KTemp * 0.25; // umgerechnet wird in loop mit Mittelwertbildung
//return Celius;
return KTemp;
}