DS18x20 lib für AVR

#1674068
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?
OP #1674472
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.
#1675005
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.
OP #1675175
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.
Gast #1675992
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.
OP #1676022
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!
Gast #1844022
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
OP #1844226
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.
Gast #1844346
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
#3469773
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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren