sicklinger.com

  • Schrift vergrößern
  • Standard-Schriftgröße
  • Schriftgröße verkleinern
  • English (United States)
  • Deutsch (DE-CH-AT)
Start ATMEL AVR ATMEGA DS18x20 library in C

ATMEL AVR ATMEGA DS18x20 library in C

E-Mail Drucken PDF
( 20 Votes )

 

Hallo,

heute gibt es die erste Version meiner C-Bibliothek für ds1820 (ds18x20) Temperatursensoren.

Die Bibliothek wurde mit dem AVR Studio (4.18 SP2) und mit dem WinAVR-20100110 Compiler erzeugt (Projektdatei enthalten).

Die Treiberroutinen unterstützten folgende Features:

  1. Temperaturmessbereich: -55°C to 125°C
  2. Für positive Temperaturwerte wird eine Nachkommastelle ausgegeben (Temperaturschrittweite: 0.1°C) (Wenn auch nur eine Messgenauigkeit von 0.5°C garantiert wird)
  3. Für negative Temperaturwerte beträgt die Temperaturschrittweite 0.5°C
  4. Der Rückgabewert von ds1820_read_temp(uint8_t DS1820_pin) ist float.
  5. Es kann nur ein Sensor pro ATMEGA Pin benutzt werden
  6. Für kurze Leitungslängen (<1m) vom DS18x20 zum Microcontroller reichen die internen Pullup Widerstände des MCU. Für längere Leitungslängen benötigt man externe 4.7k Pullup Widerstände

Beispiel:

Diese kleine Beispiel soll zeigen wie einfach die Bibliothek benutzt werden kann. Es werden 5 DS18x20 Sensoren benutzt.

 

#include "ds18x20lib.h"
#include <stdio.h>
//#########################################
//#########################################
//#########################################
// S T A R T  M A I N  P R O G R A M 
int main (void)
{
//-----------------------------------------
// Allocate memory
//----------------------------------------- 
unsigned char temp_po_str[8],temp_pm_str[8],temp_pu_str[8],temp_ke_str[8],temp_bo_str[8];
float temp_po,temp_pm,temp_pu,temp_ke,temp_bo;
//-----------------------------------------
// Init Stuff
//-----------------------------------------
ds1820_init(DS1820_pin_po);              //Initialize DS1820 "sensor #1"
ds1820_init(DS1820_pin_pm);              //Initialize DS1820 "sensor #2"
ds1820_init(DS1820_pin_pu);              //Initialize DS1820 "sensor #3"
ds1820_init(DS1820_pin_ke);              //Initialize DS1820 "sensor #4"
ds1820_init(DS1820_pin_bo);              //Initialize DS1820 "sensor #5"
for(;;){
//-----------------------------------------
// Read temperature
//-----------------------------------------
 temp_po = ds1820_read_temp(DS1820_pin_po); //Get temperature from DS1820 "sensor #1"
 temp_pm = ds1820_read_temp(DS1820_pin_pm); //Get temperature from DS1820 "sensor #2"
 temp_pu = ds1820_read_temp(DS1820_pin_pu); //Get temperature from DS1820 "sensor #3"
 temp_ke = ds1820_read_temp(DS1820_pin_ke); //Get temperature from DS1820 "sensor #4"
 temp_bo = ds1820_read_temp(DS1820_pin_bo); //Get temperature from DS1820 "sensor #5"
 
 sprintf(temp_po_str,"%.1f C",temp_po); //Convert temp. "sensor #1" to string
 sprintf(temp_pm_str,"%.1f C",temp_pm); //Convert temp. "sensor #2" to string
 sprintf(temp_pu_str,"%.1f C",temp_pu); //Convert temp. "sensor #3" to string
 sprintf(temp_ke_str,"%.1f C",temp_ke); //Convert temp. "sensor #4" to string
 sprintf(temp_bo_str,"%.1f C",temp_bo); //Convert temp. "sensor #5" to string
}
}
// E N D  M A I N  P R O G R A M 
//#########################################
//#########################################
//#########################################

 

Die Bibliothek steht unter GNU LGPL v2.1 und kann hier heruntergeladen werden.

Zuletzt aktualisiert am Samstag, den 04. September 2010 um 17:05 Uhr  

Kommentare  

 
0 #5 2011-09-15 08:44
Ich verwende den ds18x20 in einer Anwendung, die Zeit-kritisch ist (Interrupt getrieben) - aktive Warteschleifen sind da verboten.

Als schnelle Mogel-Lösung habe ich schlicht und einfach die ganze 1-Wire Sache auf einen gesonderten Prozessor ausgelagert, der über SPI an den Prozessor mit der (zeit-kritischen) Anwendung angehängt ist. Plump, aber läuft gut.

Gibt es / hat jemand darüber nachgedacht ? 1-Wire Software, die ohne aktives Warten - in einer Interrupt getriebenen Anwendung - läuft?

Wartezeiten in der hier gebrauchten Grössenordnung sind "sperrig" zu implementieren - Beginnen und Enden einer Interrupt Prozedur braucht ja selber schon fast so viel Zeit wie die zu verwirklichende Wartezeit.
Zitieren
 
 
0 #4 Stefan Sicklinger 2011-08-01 09:11
Zitat:
Hi Stefan,

Thanks for this stuff. I have built it with DS1820 and it works fine however does not work with DS 18B20S+ (it shows about -40 degree). Can you please help? Thanks!


Hello,

could you please share a little bit more information. (MCU setup and so on)

Cheers,

Stefan
Zitieren
 
 
0 #3 2011-08-01 00:44
Hallo Stefan,

vielen Dank für diese sehr nützliche LIB!

Ich hatte Probleme mit dem Timing bei den Funktionen aus deiner delay.h. Ich hab sie durch die Standard-AVR-LibC-Funktionen ersetzt und damit läufts bestens!

Viele Grüße

Philipp
Zitieren
 
 
0 #2 Stefan Sicklinger 2010-10-20 05:13
zitiere Armin Sch.:
Hi!

Du solltest noch erwähnen, dass man in den Linker Optionen ein "-Wl,-u,vfprintf -lprintf_flt" anhängen sollte, da sonst nicht mit float gearbeitet werden kann.
Ausserdem würde ich an deiner Stelle auf die schon vordefinierten delay Funktionen direkt zurückgreifen, anstatt diesen Umweg über die delay.c zu gehen in der du ohnehin auf die _delay_xs() zugreifst. Ich hatte das Problem, dass ich mit "deinen" delay-Funktionen nicht arbeiten konnte...

Aber ansonsten: Sehr gute Arbeit! :)

Grüße Armin


Vielen Dank für den Hinweis mit der Linker Option.

Ich habe die delay-Funktion geschrieben, da ältere Versionen von Winavr leider nur einen sehr kleinen Wertebereich akzeptiert haben.
Ich werde die Bibliothek jedoch im Winter überarbeiten und deine Vorschläge einarbeiten.
Danke nochmal!
Zitieren
 
 
0 #1 2010-05-22 15:21
Hi!

Du solltest noch erwähnen, dass man in den Linker Optionen ein "-Wl,-u,vfprintf -lprintf_flt" anhängen sollte, da sonst nicht mit float gearbeitet werden kann.
Ausserdem würde ich an deiner Stelle auf die schon vordefinierten delay Funktionen direkt zurückgreifen, anstatt diesen Umweg über die delay.c zu gehen in der du ohnehin auf die _delay_xs() zugreifst. Ich hatte das Problem, dass ich mit "deinen" delay-Funktionen nicht arbeiten konnte...

Aber ansonsten: Sehr gute Arbeit! :)

Grüße Armin
Zitieren
 

Kommentar schreiben


Sicherheitscode
Aktualisieren


Schlagzeilen


Hallo,
habe soeben die überarbeitete Fassung der Latex Installationsanleitung unter Windows online gestellt. Es wird jetzt auch die Inkscapeversion 0.48 in Verbindung mit dem textext-Plugin unterstützt.
http://sicklinger.com/de/latex-installationsanleitung.html

 

Hallo,
seit heute ist die USA 2010 Bildergalerie online. Hier geht es lang
P.S. Freu mich über Kommentare