
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:
- Temperaturmessbereich: -55°C to 125°C
- Für positive Temperaturwerte wird eine Nachkommastelle ausgegeben (Temperaturschrittweite: 0.1°C) (Wenn auch nur eine Messgenauigkeit von 0.5°C garantiert wird)
- Für negative Temperaturwerte beträgt die Temperaturschrittweite 0.5°C
- Der Rückgabewert von ds1820_read_temp(uint8_t DS1820_pin) ist float.
- Es kann nur ein Sensor pro ATMEGA Pin benutzt werden
- 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.
Kommentare
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.
Hello,
could you please share a little bit more information. (MCU setup and so on)
Cheers,
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
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!
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
Alle Kommentare dieses Beitrages als RSS-Feed.