Go Down

Topic: DS18B20 auf Atmega8 (Read 8698 times) previous topic - next topic

skorpi080

Es ging mir erstmal nur um die Werte, habe hier ja keine 27 Grad oder mehr.
Code: [Select]
  long celsius1= raw / 16;
  holdingRegs[celsius] =celsius1;

5.524 Bytes

Damit komme ich auf 22 Grad, kommt eher hin.

Kann ich noch ein Register Array erstellen mit enum?
Code: [Select]
enum
{     
CELSIUS,   
  HOLDING_REGS_SIZE_2 // leave this one
};

long holdingRegs[HOLDING_REGS_SIZE_2]; // function 3 and 6 register array
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Serenifly

Bei enums werden den Konstanten Werte von 0 bis n zugewiesen. In dem Fall hat HOLDING_REGS_SIZE_2 den Wert 1. Das Array hat damit nur ein Element.

skorpi080

Versteh zwar die Antwort nicht aber jetzt weiß ich wenigstens dass es so nicht geht.
Quote
SimpleModbusSlaveArduinodd:71: error: conflicting declaration 'long int holdingRegs [1]'
SimpleModbusSlaveArduinodd:59: error: 'holdingRegs' has a previous declaration as 'unsigned int holdingRegs [1]'
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

jurs

#18
Sep 21, 2014, 07:54 pm Last Edit: Sep 21, 2014, 07:57 pm by jurs Reason: 1

Kann ich noch ein Register Array erstellen mit enum?


Ja klar kannst Du, das ergibt sich doch aus den Kommentaren in dem von Dir kopierten Code.

Aber um eine Gleitkommazahl (4 Bytes) in Integer-Registern zu übertragen, benötigst Du zwei Stück von der Sorte.

Zum Beispiel:
Code: [Select]
enum
{    
 CELSIUSHIWORD,  
 CELSIUSLOWORD,
 HOLDING_REGS_SIZE_2 // leave this one
};

Dann teilst Du vor dem Senden Deinen 4-Byte Gleitkommawert auf zwei Register auf:

holdingRegs[CELSIUSHIWORD]= obere zwei Bytes der Variablen
holdingRegs[CELSIUSLOWORD]= untere zwei Bytes der Variablen

Und am Ende mußt Du die Bytes zu zwei und zwei dann wieder zu einer float-Gleitkommazahl zusammenfügen und kannst sie Dir danach anzeigen lassen.

skorpi080

#19
Sep 21, 2014, 08:06 pm Last Edit: Sep 21, 2014, 08:19 pm by skorpi08 Reason: 1
Wenn, dann welche Auswirkungen könnte es haben wenn ich von int auf long ändere?
Code: [Select]
long holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 6 register array

Wie ichs verstehe, würd sich eigentlich nix ändern, ausser dass ich die Lib alles auf long ändern müsste.
Mehr Bytes würds wahrscheinlich einnehmen.

Welches wäre für mich relevant, vor oder nach der ersten else?

Code: [Select]
  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }


Wie teilt man sowas, noch nie gemacht?!

Aber auch wenn ichs geteilt übermittelt kriege, weiß ich immer noch nicht wie ichs in openHAB flicke.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

jurs


Wie teilt man sowas, noch nie gemacht?!

Aber auch wenn ichs geteilt übermittelt kriege, weiß ich immer noch nicht wie ichs in openHAB flicke.


Wie man 4 Bytes aus einer float Variablen iin 2*2 Bytes Integer-Variablen packt, das könnte ich Dir wohl noch zeigen.

Aber mit modBus und openHAB, und wie Du damit Gleitkommazahlen übertragen und dann am Ende auch richtig anzeigen lassen kannst, wenn das Protokoll eigentlich nur Integerwerte übertragen kann, dazu kann ich Dir überhaupt nichts sagen.

Ich kann Dir nur sagen, dass Du nicht volle 4 Bytes einer float-Gleitkommazahl in  nur einer einzigen 2 Byte großen Integer-Variablen versenden kannst. 2 Bytes als Int reichen entweder nur für die ganzzahlige Temperatur ohne Nachkommastellen. Oder für einen modifizierten Temperaturwert, beispielsweise "Temperatur in Zehntelgrad".

skorpi080

Hier wirds wohl erwähnt, ganz unten, wenn ichs richtig lese/verstehe.
https://github.com/openhab/openhab/wiki/Modbus-Tcp-Binding

Code: [Select]
Number MyCounterH "My Counter high [%d]" (All) {modbus="slave3:0"}
Number MyCounterL "My Counter low [%d]" (All) {modbus="slave3:1"}


Müsste dann vor der komma MyCounterH anzeigen und nach der komma MyCounterL.
Teste ich, wenn du mir dass mit dem teilen beibringst.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Serenifly

#22
Sep 21, 2014, 09:11 pm Last Edit: Sep 21, 2014, 09:17 pm by Serenifly Reason: 1
Gleiches Prinzip wie wenn man in ein Byte Array "wandelt". Einfach die Adresse der Zahl auf einen Zeiger auf unsigned int casten und dann als Array ansprechen:

Code: [Select]

float f = 123.456;

unsigned int high = ((unsigned int*)&f)[1];
unsigned int low = ((unsigned int*)&f)[0];



Quote

Müsste dann vor der komma MyCounterH anzeigen und nach der komma MyCounterL.

Das wird allerdings nicht gehen. Gleitkomma-Zahlen funktionieren völlig anders:
http://de.wikipedia.org/wiki/IEEE_754#Zahlenformate_und_andere_Festlegungen_des_IEEE-754-Standards
http://de.wikipedia.org/wiki/IEEE_754#mediaviewer/File:IEEE-754-single.svg

Man hat ein Bit Vorzeichen, 8 Bit Exponent und der Rest ist der Basis.

skorpi080

Code: [Select]
  long celsius1= raw / 16;
  float f = celsius1;

unsigned int high = ((unsigned int*)&f)[1];
unsigned int low = ((unsigned int*)&f)[0];

  holdingRegs[CELSIUSHIWORD] =high;
    holdingRegs[CELSIUSLOWORD] =low;


In openhab:
Code: [Select]
Number MyCounterH "My Counter high [%d]" (All) {modbus="slave3:0"}
Number MyCounterL "My Counter low [%d]"  (All) {modbus="slave3:1"}

Ausgabe:
Quote
21:16:19.503 INFO  runtime.busevents[:26] - MyCounterH state updated to 1
21:16:19.503 INFO  runtime.busevents[:26] - MyCounterL state updated to 16824
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Serenifly

Ich glaube x-tel Grad wäre hier doch die beste Wahl. Dann könnte man auch damit rechnen.

Sicherlich könnte man auch Vorkommastellen und Nachkommastellen aufteilen. Aber dann taugt das eigentlich nur zu Anzeige.

skorpi080

Wie mach ichs mit x-tel Grad?
Dass mit raw*625L zeigt nicht richtige Werte an.
Verstehe auch nicht warum es richtig anzeigen soll, wenn ich raw durch 16 teilen muss und nicht multiplizieren.

Wenn Temperatur steuern, könnte man nur die Vorkommastellen nehmen, der rest wäre nice to have.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

jurs


Wie mach ichs mit x-tel Grad?
Dass mit raw*625L zeigt nicht richtige Werte an.


Das ist dann ja auch ein "long", die Zahlen sind extrem gross, und der Variablentyp long hat ebenfalls 4 Bytes.

So müßte es gehen in Zehntelgrad (mit Abrundung der Hundertstel):
Code: [Select]

holdingRegs[CELSIUS] = raw*625L/1000;  // Zwischenrechnung ist long, Ergebnis passt in int


Mit *625 bekommst Du zehntausendstel Grad, geteilt durch 1000 sind es dann zehntel Grad.
Und in zehntelgrad angegeben ist die Temperatur dann so klein, dass Du den Wert problemlos auf einen int zuweisen kannst, ohne dass ein Zahlenüberlauf auftritt.

skorpi080

Jup, zeigt 222 Grad an.
Muss jetz mal schaun wie oder ob man es konvertieren kann.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

sschultewolter

Was heißt konvertieren?

Ich hatte es bei mir
Code: [Select]
*temperature = raw * 10 / 16; gelöst gehabt. So dass ich einen Wert von 123 hatte. Wobei 3 die Nachkommastelle war.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

skorpi080

Ich bekomme ja auch 22.2 Grad als 222 angezeigt, konvertieren in openHAB von 222 auf 22.2
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Go Up