Forum: Mikrocontroller und Digitale Elektronik Dallas DS18B20 auslesen


von Jens (Gast)


Lesenswert?

Hallo!

Ich bin ein kompletter Anfänger im µC Bereich.
Allerdings sollen wir jetzt in der Schule mit einem ATmega8 einen 
Temperatur-Sensor auslesen und dann mit dem Wert arbeiten. Ich komme 
eigentlich ganz gut zurecht. Jedoch haben wir einen Digitalen One-Wire 
Dallas DS18B20 Temperatur-Sensor bekommen. Ich finde keine C-Library, 
die mit dem arbeitet. Könnt ihr mir helfen wie ich den auslesen kann 
bitte?

Ich wäre euch sehr Dankbar!

Mit freundlichen Grüßen,
Jens

von Fabian B (Gast)


Lesenswert?

Wie du findest keine?
Wenn ich das in google reinkloppe finde ich mehr als nur eine.

Und hier im Forum ist auch alles voll:
http://www.mikrocontroller.net/articles/Temperatursensor#DS18S20_.2F_DS18B20

von gidf (Gast)


Lesenswert?


von Jens (Gast)


Angehängte Dateien:

Lesenswert?

Ich fand die Library die im Anhang ist, aber weiß nicht wie man sie 
benutzt. Kann mir das bitte jemand erklären?

von Fabian B (Gast)


Lesenswert?

Die Aufgabe in der Schule ist, willkürlich eine lib zu kopieren und 
nichtmal zu verstehen wie man sie einsetzt?

Wie gut sind überhaupt deine AVR Kenntnisse?

Wenn ich mich recht entsinne ist in der Codesammlung hier im Forum eine 
gut dokumentierte library (glaube von Peter Dannegger).

von Jens (Gast)


Lesenswert?

Ich habe Grundkentnisse, und ich mag die ja auch verstehen...
Aber es ist jetzt erstmal wichtig dass das dann auch klappt, am liebsten 
wäre es mir wenn ihr mir sagt wie ich die benutzen muss (oder eine 
andere) und ein Bisschen Grundlegendes von den Arbeitsschritten 
erklärt...

von Karl H. (kbuchegg)


Lesenswert?

Wenn wir mal davon ausgehen, dass der Code funktioniert, ist für dich 
nur das Header File interessant.

Einfach mal aufmachen und lesen.

Da steht
1
...
2
// AVR clock frequency
3
#ifndef F_CPU
4
#define F_CPU 1000000UL // 1 MHz
5
#endif
6
...

ist das für dich relevant.
Ja, doch. Ich würde sagen ja. Es sagt dir, dass du F_CPU korrekt setzen 
musst. Persönlich bin ich davon abgekommen, F_CPU mit einem Default Wert 
zu belegen, aber da es sich hier im vorhandenen Code handelt würde ich 
den zunächst mal nicht zu sehr ändern und da die Taktfrequenz des 
Prozessors eintragen.

Weiter
1
...
2
// Pin defines
3
4
#define DALLAS_PORT     PORTB
5
#define DALLAS_PORT_IN  PINB
6
#define DALLAS_DDR  DDRB
7
#define DALLAS_PIN  0
8
...

Oh ja.! Ich würde sagen das ist ja wohl sehr relevant. An welchem Pin 
ist der 1820 angeschlossen. Also tragst du da deine Belegung ein.
1
...
2
// The number of devices on the bus.
3
#define DALLAS_NUM_DEVICES 1
4
...

wieviele Sensoren hast du angeschlossen?

Ab da kannst du dann den Rest überspringen, bis du bei
1
...
2
///////////////
3
// Functions //
4
///////////////
5
6
// Writes the LSB of the argument to the bus.
7
void dallas_write(uint8_t);
8
9
// Write a byte to the bus.
10
void dallas_write_byte(uint8_t);
11
12
// Write the specified number of bytes to the bus from the supplied buffer.
13
void dallas_write_buffer(uint8_t * buffer, uint8_t buffer_length);
14
15
// Read a bit from the bus and returns it as the LSB.
16
uint8_t dallas_read(void);
17
18
// Reads a byte from the bus.
19
uint8_t dallas_read_byte(void);
20
21
// Reads the specified number of bytes from the bus into the supplied buffer.
22
void dallas_read_buffer(uint8_t * buffer, uint8_t buffer_length);
23
24
// Resets the bus. Returns...
25
// 1 - if a device or devices indicate presence
26
// 0 - otherwise
27
uint8_t dallas_reset(void);
28
29
// Powers the bus from the AVR (max 40 mA).
30
void dallas_drive_bus(void);
31
32
// Sends a MATCH ROM command to the specified device. Automatically resets the
33
// bus.
34
void dallas_match_rom(DALLAS_IDENTIFIER_t *);
35
36
// Sends a SKIP ROM command. Automatically resets the bus.
37
void dallas_skip_rom(void);
38
39
// Populates the identifier list. Returns...
40
// 0 - if devices were found and there was no error
41
// 1 - if there was a bus error
42
// 2 - if there were more devices than specified by DALLAS_NUM_DEVICES
43
uint8_t dallas_search_identifiers(void);
44
45
// Returns the list of identifiers.
46
DALLAS_IDENTIFIER_LIST_t * get_identifier_list(void);
angelangt bist.

Welche der Funktionen wirst du brauchen und wie wird das alles wohl 
funktionieren. Lies die Funktionsnamen, lies die Beschreibungen, denk an 
das Prinzip wie das wohl verwendet werden wird
1
int main()
2
{
3
  ...
4
5
  Initialisierung, d.h. auch feststellen welche Bausteine da sind
6
7
  while( 1 ) {
8
9
    Baustein auslesen
10
11
    Wert verarbeiten
12
  }
13
}
und dann sollte sich eigentlich schon fast von alleine ergeben, welche 
Funktionen du brauchst und wie sie angesteuert werden.
Und wenn nicht: ich bin mir fast sicher, dass dort, wo du den Code 
gefunden hast, es auch ein Beispiel gibt, dass den Code in Aktion zeigt.


Also: im Header File die notwendigen Anpassungen machen, das C-File (und 
das Header File) zum Projekt mit dazu nehmen (damit es auch compiliert 
wird) und dein Programm schreiben.

: Bearbeitet durch User
von Jens (Gast)


Lesenswert?

Ok. Ich lese mir mal gleich die Funktionen durch und schreibe dann mal 
was ich machen würde, kannst du das dann mal überprüfen bitte?

Und nein, dort gab es kein Beispiel, das ist ja das Problem.

von Karl H. (kbuchegg)


Lesenswert?

Jens schrieb:
> Ich habe Grundkentnisse, und ich mag die ja auch verstehen...
> Aber es ist jetzt erstmal wichtig dass das dann auch klappt

nein. wichtig ist dass du die Dinge verstehst!
Dennn dann klappen sie auch, bzw. du kannst dir helfen, wenn es nicht 
klappt.

> am liebsten
> wäre es mir wenn ihr mir sagt wie ich die benutzen muss (oder eine
> andere) und ein Bisschen Grundlegendes von den Arbeitsschritten
> erklärt...

Ich denke allerdings auch, dass die AUfgabenstellung nicht so gemeint 
war, dass du fertigen Code suchen sollst. Ich denke, dass die 
Aufgabenstellung eigentlich so gedacht ist, dass du das Auslesen eines 
einzigen DS1820 selber programmieren sollst. Zumal das nicht so schwer 
ist, wenn man nur 1 Sensor am Bus hat, dann für diesen speziellen Fall 
hat Dallas vorgesorgt und alles ist ein wenig einfacher. Aufwändiger 
wird es erst, wenn mehere Sensoren am Bus sind. Der Code, den du da hast 
behandelt beides: die Einfachlösung und die Lösung die mit mehreren 
DS1820 klar kommt. Tja. Und jetzt erklärst du mal deinem Lehrer, warum 
du die aufwändige Lösung implementiert hast, wenn du sie doch gar nicht 
brauchst?

von Jens (Gast)


Lesenswert?

Ok. Ich bin Anfänger. Ich versuche die Lib zu verstehen, klappt aber
nicht so...

Kannst du mir bitte sagen welche Befehle ich in welcher reihenfolge und
wie nutzen muss? Ich glaube dann verstehe ih das ganze auch besser...

von Jens (Gast)


Lesenswert?

Ihr seid UNFAIR!!!

von chris (Gast)


Lesenswert?

Jens schrieb:
> Kannst du mir bitte sagen welche Befehle ich in welcher reihenfolge und
> wie nutzen muss? Ich glaube dann verstehe ih das ganze auch besser...

Dazu brauchst du nur das Datenblatt des Sensors mal durchzulesen.
Dort ist im Detail beschrieben, welche Kommandos in welcher Reihenfolge 
der Sensor möchte.

Im Wesentlichen geht das so (nur ein Sensor angeschlossen):

ow_reset
ow_skip_rom
ow_start_conversion

750 ms warten

ow_reset
ow_skip_rom
ow_read_scratchpad
9* ow_read_byte

und dann noch die richtigen beiden Bytes zusammenbauen zu deinem 
Messwert

von Mirki (Gast)


Lesenswert?

Ich habe ein PDF die genau beschreibt wie man sich seine Funktionen für 
das 1 wire baut.. Poste ich später mal rein wenn ich Zuhause bin. Wenn 
Du das Protokoll verstehst dann ist der Rest nur Fleißarbeit

von Karl H. (kbuchegg)


Lesenswert?

Mirki schrieb:
> Ich habe ein PDF die genau beschreibt wie man sich seine Funktionen für
> das 1 wire baut.. Poste ich später mal rein wenn ich Zuhause bin. Wenn
> Du das Protokoll verstehst dann ist der Rest nur Fleißarbeit


Aber postet ihm nicht zu viel.
Keine Schule dieser Welt jagt einen Anfänger in eine 1-Wire Übertragung 
rein.

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.