Forum: Mikrocontroller und Digitale Elektronik Maxim MAX31856 mit Infineon XMC 1100


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dennis K. (dennisk93)


Angehängte Dateien:

Lesenswert?

Guten Tag Community,

ich stehe vor einem Problem, und zwar dass ich bei dem MAX31856 Baustein 
zwar eine "Wertartige" Rückgabe bekomme, diese sich aber bei einer 
Temperaturänderung kein bisschen ändert, sie schwankt nur Generell ein 
bisschen.

Als erstes schicke ich dem MAX31856 folgende Werte:
1
SPI_write(0x8103);
2
3
SPI_write(0x8081);

hier das Datenblatt dazu:

https://datasheets.maximintegrated.com/en/ds/MAX31856.pdf

Ab Seite 18 sind die Register beschrieben und welche Werte was bewirken.

SPI_write sieht von der Funktion aus wie die erste Hälfte von folgender 
SPI_read Funktion:
1
uint32_t SPI_read(uint8_t address, uint8_t bits)
2
{
3
4
  uint8_t i;
5
  uint32_t data=0;
6
  P0_9_reset();            //CS
7
  simple_delay(5);
8
9
    for (i = 8; i; i--)
10
    {
11
      P0_8_reset();          //Clock
12
      if(address & 0x80)
13
      {
14
        P0_6_set();
15
      }
16
      else
17
      {
18
        P0_6_reset();
19
      }
20
      simple_delay(10);
21
      address = address << 1;
22
      P0_8_set();          //Clock
23
      P0_6_reset();          //MOSI
24
      simple_delay(10);
25
    }
26
    for (i = bits; i>0; i--)
27
    {
28
      data = data << 1;
29
30
      P0_8_reset();          //Clock
31
32
      simple_delay(10);
33
34
      P0_8_set();          //Clock
35
36
      if(P0_7_read())
37
      {
38
        data |= 1;
39
      }
40
      simple_delay(10);
41
42
    }
43
  P0_9_set();            //CS
44
  simple_delay(5);
45
  return(data);
46
}

P0_X_set() und reset sind aus der GPIO.h und setzen nur das 
entsprechende Registerbit. simple_delay() ist einfach testweise eine 
while Schleife, welche die Anzahl der Durchläufe bekommt. Zwischen jeder 
24 Bit Abfrage auf 0x0C wird 400000 Durchläufe gewartet, was auf dem 
Oszi etwas über 200ms beträgt, was mehr als Genug für einen neuen Wert 
sein sollte.

Hat jemand eine Idee, was das Problem auslösen könnte? Wenn noch 
Informationen meinerseits fehlen sollten, reiche ich die natürlich noch 
nach.

Sonst sehe ich immer nur Lösungen mit dem Arduino, aber mit diesem 
Controller sollte das doch eigentlich genau so gut gehen.

Edit: AVDD und GVDD sind Gebrückt und werden mit einem Netzteil mit 3,3V 
versorgt. GNDs sind auch alle gebrückt.

Edit2: Ich sehe grad, auf dem Oszi sind die Bezeichnungen für Miso und 
Mosi vertausch, also ich schicke dem MAX das "0x0C" und bekomme das 
erste Signal auf dem Oszi zurück, welches sich aber bei einer 
Temperaturänderung nicht ändert.
Besten Dank im Voraus und Gruß,
Dennis

: Bearbeitet durch User
von Dennis K. (dennisk93)


Lesenswert?

Mittlerweile ist mir aufgefallen, dass der Fehler einfach nur ein 
simpler Flüchtigkeitsfehler in der ersten for-Schleife war. Hat zwar 
lange gedauert, aber so passiert einem das immerhin nicht nochmal.

Jetzt bekomme ich plausible Werte. Ich bekomme also ein 19-Bit Wert, 
welchen ich in einer uint32_t Variable ablege. Die Bits dieser Variable 
haben den Wertbereich 2^10 bis 2^-7[°C]. Das erste Bit ist ein Sign Bit.

Wenn ich das jetzt nach rechts durchshifte, sodass 2^0 mein LSB ist, 
bekomme ich einen guten Wert (Raumtemperatur 23°C passt laut 
Thermometer, 33°C in der Hand), mit der Genauigkeit 1°C halt. Jetzt 
könnte ich jedes kleiner wertige Bit maskieren und den entsprechenden 
Wert addieren.

So in etwa:
1
for(i=0;i<7;i++)
2
{
3
   if(data&0x1) //data->Komplette 19 bit
4
   {
5
   Temperatur = Temperatur + (0.0078125*(i+1)); 
6
   /*Temperatur->Anfangs 12 Bit mit Genauigkeit 1°C*/
7
   }
8
   data = data >> 1;
9
}

Das muss doch auch einfacher/schneller gehen, oder? Hat da jemand einen 
Tipp?

Das Sign Bit kann vernachlässigt werden, das ist in der Anwendung eh 
immer 0 (positiv).

Vielen Dank im Voraus und Gruß,

Dennis

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.