Pages: [1]   Go Down
Author Topic: DS3234 Temperatur Anzeigen  (Read 592 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 8
Posts: 153
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
hab gerade geschafft, die Zeit vom DS3234 auf dem LCD MI0283QT2 anzuzeigen.
Komme aber nicht klar, die Temperaturdaten aufzubereiten. Die Abfrage erfolgt so :

Code:
void ReadTemperatur(){
  digitalWrite(cs, LOW);
  SPI.transfer(0x11);
  unsigned int nt = SPI.transfer(0x00);       
  digitalWrite(cs, HIGH);
  temph=nt;

  digitalWrite(cs, LOW);
  SPI.transfer(0x12);
  unsigned int nt1 = SPI.transfer(0x00);       
  digitalWrite(cs, HIGH);

  templ=nt1;



}
Wer kann mir helfen. Werte werden zwar übertragen, aber es feht eine Umwandlung.

Gruss Kalli
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was sagt das Datenblatt wie der Temperaturwert übertragen wird?
Grüße Uwe
Logged

0
Offline Offline
Full Member
***
Karma: 8
Posts: 153
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,

das Datenblatt als PDF
http://www.sparkfun.com/datasheets/BreakoutBoards/DS3234.pdf

andere Daten habe ich nicht dazu.

Gruss Kalli
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich wollte Dich etwas arbeiten machen.  smiley-wink smiley-wink smiley-wink

die DS3234-Bibiothek https://github.com/rodan/ds3234 macht das so:

Code:
/ temperature register

float DS3234_get_treg(uint8_t pin)
{
    float rv;
    uint8_t temp_msb, temp_lsb;
    int8_t nint;

    digitalWrite(pin, LOW);
    SPI.transfer(0x11); // temperature register MSB address
    temp_msb = SPI.transfer(0x00);
    digitalWrite(pin, HIGH);
    digitalWrite(pin, LOW);
    SPI.transfer(0x12); // temperature register MSB address
    temp_lsb = SPI.transfer(0x00) >> 6;
    digitalWrite(pin, HIGH);

    if ((temp_msb & B10000000) != 0)
        nint = temp_msb | ~((1 << 8) - 1); // if negative get two's complement
    else
        nint = temp_msb;

    rv = 0.25 * temp_lsb + nint;

    return rv;
}

Du kannst aber auch die Funktion der Bibiothek verwenden.

Das Datenblatt sagt:
Quote
Temperature Registers (11h–12h)
Temperature is represented as a 10-bit code with a resolution
of 0.25°C and is accessible at location 11h and
12h. The temperature is encoded in two’s complement
format, with bit 7 in the MSB representing the SIGN bit.
The upper 8 bits, the integer portion, are at location 11h
and the lower 2 bits, the fractional portion, are in the
upper nibble at location 12h. Example: 00011001 01b =
+25.25°C. Upon power reset, the registers are set to a
default temperature of 0°C and the controller starts a
temperature conversion.
The temperature is read on initial application of VCC
and once every 64 seconds afterwards. The temperature
registers are updated after each user-initiated conversion
and on every 64-second conversion. The
temperature registers are read-only.

Grüße Uwe

Logged

0
Offline Offline
Full Member
***
Karma: 8
Posts: 153
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,

habe das Beispiel angepasst, ausprobiert und es funktioniert. Danke !
Für die aktuelle Anwendung hat es aber keinen Zweck, RTC sitzt zwischen LCD und mSD-Shield und zeigt
eine unsinnige Temperatur an. Für weitere  Anwendungen steht es dann aber zur Verfügung.
Noch eine Frage, warum schreibt man oft "int8_t" statt "int", ist es nur zur Speicherplatzeinsparung oder hat es noch einen
anderen Grund ?

Gruss Kalli
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3072
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

int ist Standard C und kann je nach Hardware unterschiedliche Größe haben.
Beim Arduino sind es 16 Bit = -32768 .. 32767

int8_t ist auf jeder Maschine 8 Bit groß = -128 .. 127

Ausserdem gibt es das auch als uint8_t, Bereich 0 .. 255.
Da spart man sich das Tippen des Wortes "unsigned"
Logged

Pages: [1]   Go Up
Jump to: