Forum: Projekte & Code DS18x20 lib für AVR


von St. S. (clean-energy)


Lesenswert?

Hallo,

unter 
http://sicklinger.com/de/microcontroller-avr/58-atmel-avr-atmega-ds18x20-library-in-c.html 
gibt es eine einfache float basierte DS18x20 lib für AVR. Sie ist sehr 
einfach gehalten. Ich habe Sie getestet von -45°C bis 120°C.


Gruß,

von Oliver (Gast)


Lesenswert?

"Tut mir leid, du hast das Limit an Downloads, für diese Datei, 
erreicht"

Wenig hilfreich...

Oliver

von St. S. (clean-energy)


Lesenswert?

Hallo Oliver,

vielen Dank für den Hinweis!

Jetzt müsste es wieder funktionieren.

Vielen Dank nochmal!

Grüße,

von Oliver (Gast)


Lesenswert?

Hm,

da kommt jetzt eine 11 byte "grosse" Datei. Das wird wohl nicht alles 
sein, oder?

Oliver

von St. S. (clean-energy)


Lesenswert?

Hallo Oliver,

jetzt wird es echt peinlich sorry...

Hatte die Dateien aus Versehen in der Datenbank gespeichert und das 
funktionierte nicht richtig...

Jetzt sollte es endlich klappen...

Nochmal sorry und vielen Dank für den Hinweis!

Grüße,

von Pete K. (pete77)


Lesenswert?

Warum hängst Du die Lib nicht einfach hier in das Forum? Dann findet man 
die Datei auch in dre Jahren noch, wenn der Link oben schon längst tot 
ist ...

Edit: Habe gerade die Beschreibung gelesen:

> 5. Es kann nur ein Sensor pro ATMEGA Pin benutzt werden

Das ist schon eine starke Einschränkung. Schau mal in die Sourcen von 
Peda, wie man meherer Sensoren anspricht.

> 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

Verstehe ich nicht. Die 10k vom AVR reichen nicht, aber externe 4k7?

von St. S. (clean-energy)


Lesenswert?

Pete K. schrieb:
> Warum hängst Du die Lib nicht einfach hier in das Forum? Dann findet man
> die Datei auch in dre Jahren noch, wenn der Link oben schon längst tot
> ist ...
>
Weil ich Remository mit SVN gekoppelt habe und nur einen Link warten 
moechte
> Edit: Habe gerade die Beschreibung gelesen:
>
>> 5. Es kann nur ein Sensor pro ATMEGA Pin benutzt werden
>
> Das ist schon eine starke Einschränkung. Schau mal in die Sourcen von
> Peda, wie man meherer Sensoren anspricht.
Dafuer muss man sich auch nicht mit dem bestimmen von dem 64bit 
Identifikationscode auseinandersetzen.
>
>> 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
> externe 4.7k Pullup Widerstände
>
> Verstehe ich nicht. Die 10k vom AVR reichen nicht, aber externe 4k7?

Die internen Pull-ups der IO-Pins haben zw. 20 und 50 k und sind in 
Kombination mit der Anschlussleitung zu gross um in der benoetigten Zeit 
wieder ein High zu erreichen. Dies haben meine Tests ergeben. Laut 
DS18x20 Datenblatt sollte man jedoch immer 4.7k Pull-ups verwenden.

von Karl H. (kbuchegg)


Lesenswert?

St. S. schrieb:
> Pete K. schrieb:
>> Warum hängst Du die Lib nicht einfach hier in das Forum? Dann findet man
>> die Datei auch in dre Jahren noch, wenn der Link oben schon längst tot
>> ist ...
>>
> Weil ich Remository mit SVN gekoppelt habe und nur einen Link warten
> moechte


>>> 5. Es kann nur ein Sensor pro ATMEGA Pin benutzt werden
>>

> float basierte


Alles in allem: rechne besser nicht damit, dass wir hier von 
microcontroller.net deine Lib gross weiterempfehlen werden.

von St. S. (clean-energy)


Lesenswert?

> Alles in allem: rechne besser nicht damit, dass wir hier von
> microcontroller.net deine Lib gross weiterempfehlen werden.

Es ist ja auch für Einsteiger gedacht...(steht in der Beschreibung)

Ich denke nicht, dass man z.B. für ein Thermometer mit 7-Segment Anzeige 
mehrere Sensoren pro Pin benötigt werden und float aus Gründen der 
Performance ein Problem darstellt.

von Tom (Gast)


Lesenswert?

Servus,

ich versteh euer Problem nicht? Da ist jemand so nett und stellt seine 
Library kostenlos zur Verfügung und wird nur kritisiert. Klar kann man 
manche sachen besser machen, aber gleich als unbrauchbar abzustemplen 
find ich etwas hart. Scheint wohl generell ein Phänomen dieses Forums zu 
sein, ja selbst die Modaratoren mischen mit. Braucht man sich nicht 
wundern wenn bald niemand mehr Code postet.

Also Danke für die Library.

von St. S. (clean-energy)


Lesenswert?

Tom schrieb:
> Servus,
>
> ich versteh euer Problem nicht? Da ist jemand so nett und stellt seine
> Library kostenlos zur Verfügung und wird nur kritisiert. Klar kann man
> manche sachen besser machen, aber gleich als unbrauchbar abzustemplen
> find ich etwas hart. Scheint wohl generell ein Phänomen dieses Forums zu
> sein, ja selbst die Modaratoren mischen mit. Braucht man sich nicht
> wundern wenn bald niemand mehr Code postet.
>
> Also Danke für die Library.

Danke Tom!

von Olaf (Gast)


Lesenswert?

Hallo,

Ich finde die Lib. durchaus klar durchdacht.


Eine Frage habe ich, um die Routine

sprintf(temp_po_str,"%.1f C",temp_po); //Convert temp. puffer oben to 
string
aufzulösen:

Wo finde ich diese Routine
und Wo wird Sie geladen?

ein Include von stdio.h kann ich nicht finden.

Olaf

von St. S. (clean-energy)


Lesenswert?

Hallo Olaf,

vielen Dank für den Hinweis. Ich habe stdio.h hinzugefügt. Der Fehler 
entstand als ich die Lib vom Ursprungsprogramm extrahiert habe.

Warum das Programm ohne Fehler trotzdem kompiliert muss ich bei 
Gelegenheit nochmal untersuchen.


Vielen Dank nochmal!

Beste Grüße,

St.S.

von Olaf (Gast)


Lesenswert?

Hallo Stefan,

vielen Dank für die schnelle Antwort.

Mein Compiler lief auch ohne Fehler durch, das hat mir gezeigt es muss 
doch irgendwo stdio geladen werden, was nicht der Fall war, warum das so 
ist kann ich mir nicht erklären.

Danke für die Änderung

Vielen Dank für die Library.

Viele Grüße
Olaf

von Björn H. (firefunk)


Lesenswert?

Hallo Stefan,

ich verwende deine DS18B20 Lib - Link:
http://www.sicklinger.com/en/atmel-avr-atmega-ds18...

Ich bin quasi blutiger Anfänger und bin zu blöd den Temperaturwert an
mein Display zu übergeben. Mein genaues Problem habe ich unten im Code
kommentiert.
Bitte Helf mir.

hier mein Main:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include "i2cmaster.h"
#include "ds18x20lib.h"
#include <stdio.h>
#include <stdlib.h>






//********************************************************************** 
************************
// Display Ausgabe
//********************************************************************** 
************************

#define SLAVE_ADDRESS1 0xa0


void max6953_1(char cmd, char data)
{
i2c_start(SLAVE_ADDRESS1 | I2C_WRITE);
i2c_write(cmd);
i2c_write(data);
i2c_stop();
}

void writestr1(char *s)
{
char i;
for (i = 0; i < 4; i++)
max6953_1(0x20 | i, s[i]);
}

void main(void)
{

unsigned char temp_po_str[8];
float temp_po;

ds1820_init(DS1820_pin_po); //Initialize DS1820 Lufttemp

temp_po = ds1820_read_temp(DS1820_pin_po);//Get temperature from DS1820 
Lufttemp

sprintf(temp_po_str,"%.0f",temp_po); //Convert temp. Lufttemp to string

unsigned char i;
unsigned char a;


char msg []= "Hallo";

Anstatt "Hallo" (Funktioniert, auch Zahlen gehen), wollte ich den 
Temperatur Wert Temp_po_str an das Char
Array msg übergeben.

Nur leider bekomme ich nur ein völliges Wirwar angezeigt.
Ich möchte die Temperaturwerte auf eine Nachkommastelle und
mit Vorleichen angezeigt bekommen, aber ohne das eigentliche Komma.
z.B. +12,7°C = +127  oder -6,9°C = -69

Pins und Ports habe ich geändert und das Signal ist gut messbar auf der
Datenleitung.

Verwende DS18B20 und Atmega16 bei 16 MHz
Habe auch 4,7k Pullus dran.
Habe auch versucht temp_po_str direkt für msg einzusetzen auber da kommt 
auch nur müll raus.


i2c_init();
if (i2c_start(SLAVE_ADDRESS2 | I2C_WRITE) != 0)
{
DDRB |= (1<<0); // falls Addresse 0 dann LED an PORTB.0 an.
PORTB &= ~(1<<0); // erste LED
}
i2c_stop();
max6953_1(0x01, 0xFF); // Intensität 10

max6953_1(0x02, 0xFF); // Intensität 32

max6953_1(0x03, 0x01); // scan limit

max6953_1(0x04, 0x01); // kein shutdown

max6953_1(0x07, 0x00); // display test mode

_delay_ms(2000); // 2 Sekunden warten
for (i = 0x60; i < 0x63; i++)
max6953_1(i, 0); // schreibe D0, D1

_delay_ms(4000);
while(1)
{
if (++i > strlen(msg) - 4) i = 0;
writestr1(msg + i); // schreibe vier Zeichen
_delay_ms(250);

}
return 0;
}

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.