ver-ODERn läuft schief

Hallo,

union, guck ich mir mal an. Spart man durch SRAM ein?
Übrigens muß ich die "SPI Bytes" als unsigned long deklarieren. Nicht als unsigned int. Sorry. Sonst hab ich immer noch falsche Werte.

Meine Funktion funktioniert nun auch soweit mit ordentlichen Timings. Wer sich dafür interessiert, bitte schön. Das mit der Erkennung vom Vorzeichen muß noch rein und vielleicht noch die feste Wartezeit von 80ms durch millis Abfrage ersetzen. Die Basis steht jedenfalls. :wink:

22Bit A/D Wandler IC, MCP3550-50

/*
Arduino Mega2560
*/

// NOP;  // delay 62.5ns on a 16MHz AtMega
#define NOP __asm__ __volatile__ ("nop\n\t")

#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();
  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 PowerUP (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;      // zugleich 50ns Zwangspause CS High to Low
  digitalWrite(CS, LOW);        // starte AD Convertion
  delay(80);                    // 80ms typische Conversion Time (MCP3550-50)
  while(digitalRead(MISO) == HIGH)       // warten bis SDO/RDY mit LOW Ready signalisiert
    {
     digitalWrite(CS, HIGH);             // wenn nicht Ready, toggle CS erneut High zu Low
     delay(1);  
     digitalWrite(CS, LOW); 
    }  
  NOP;                                      // 20ns Zwangspause
  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;
}