DS18S20, Atmega8, AVR Studio

Gast #2613383
Lesenswert?

Hallo Leute ,

ich habe folgendes Problem. Ich wollt mit einem Mikrocontroller Atmega8 
MK2 ,
Compiler AVR Studio und Temperaturfühler DS18S20 eine Temperaturmessung 
realisieren.
Da ich Anfänger in der Hinsicht bin  und zuvor nicht viel mit 
Mikrocontroller zu tun hatte, habe ich mich dank der zahlreichen 
Beiträge zu diesem Thema etwas eingelesen  und ein Programm Code 
erstellt. Nur Leider ist der Programm Code fehlerhaft und ich weiß nicht 
wo der Fehler liegt.

 Das LCD zeigt nur 0 an und wenn ich den Sensor abklemme 127 .

Ich arbeite schon seit Tagen daran nur ohne Erfolg.
Ich würde mich sehr freuen, wenn jemand ein Blick auf dem Code werfen 
könnte.

Vielen Dank im voraus!!
Angehängte Dateien:
#2613462
Lesenswert?

Wo hast du denn den Code her?
(nur um abzuschätzen wie zuverlässig der ist).


In der Codesammlung gibt es einige Beiträge zum Thema DS1820 auslesen.
Hast du von denen schon mal was ausprobiert bzw. angepasst?

Da das Bustiming nicht beliebig flexibel ist: Hast du kontrolliert, ob 
den µC tatsächliche mit den 3.zerquetschte Mhz läuft?
Gast #2614274
Lesenswert?

> Kann mir keiner sagen ob der Code Fehlerhaft ist oder nicht?

IMHO ist der Code fehlerhaft. Es werden innerhalb der Definition von 
main() andere Funktionen definiert.

Hinweis dazu:

>> The C language also exhibits the following more specific characteristics:
>> ...
>> # Functions may not be defined within the lexical scope of other
>> functions.
https://en.wikipedia.org/wiki/C_%28programming_language%29

Genauer müsste man im Standard nachsehen z. B. im offen zugänglichen
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf und dort in 
6.9
#2614316
Lesenswert?

Kurt schrieb:
> Das kann ich leider nicht überprüfen aber das ist auch mein vermutung
> das was mit der timing nicht stimmt. ich weiss nicht wie das überprüfen
> oder was ändern kann.
> Gruß

Du hast also einen externen Quarz(oszillator) 3,686400 MHz. Sind die 
Fuses auch ensprechend gesetzt? Mach mal eine LED-Blink-Funktion mit 
_delay_ms(1000) und zähle die Blinkzyklen in z.B. 30 s. Wenn Du einen 
Frequenzzähler oder ein entsprechendes Multimeter hast, geht es 
natürlich etwas einfacher.

Ansonsten sehen mir die ganzen Funktionen in main sehr seltsam aus.

Servus
Michael
Gast #2614457
Lesenswert?

Hallo Michael,

ich habe das ausprobiert mit dem blinkenden LED unzwar bei 1000ms 
Einschaltverzögerung (siehe code)
blinkt die Led 108 mal in 30 Sekunden.

 PORTC &=~(1<<PC2);      // Gelbe LED aus
 _delay_ms (1000);       // 1sec auslassen
 PORTC |=(1<<PC2);       // Gelbe LED ein


Wie kann ich das so einstellen das es auch wirklich 30 mal blinkt in 30 
sekunden.
Danke nochmals für den vorschlag

Gruß
Gast #2614523
Lesenswert?

108 mal blinken statt 30 mal kann ich mir nur erklären, wenn dein 
Programm aus Sicht der _delay_ms() Funktion mit einer nominalen F_CPU 
von 1000000 arbeitet, aber der AVR in der Realität 3.6 mal schneller 
getaktet wurde.

Der schnellere Takt passt zu #define F_CPU 3686400l in deinem ersten 
Programm.

Leider sieht man dein komplettes Blinkprogramm nicht. Ich könnte wetten, 
da fehlt diese #define Zeile und in deiner Programmierumgebung wird 
irgendwo F_CPU die 1 MHz zugewiesen.

Dein Code ist für ein Blinken auch komisch. Normalerweise lässt man die 
LED mit gleichlangen Zeiten AN/AUS blinken, also in etwa so:

1
#include <avr/io.h>
2
#include <util/delay.h> 
3

4
int main(void)
5
{
6
  DDRC = (1<<PC2);      // Ausgang gelbe LED
7
  while (1) {           // Ewig lang...
8
    PORTC &= ~(1<<PC2); // Gelbe LED aus
9
    _delay_ms(500);     // 1/2 sec auslassen
10
    PORTC |= (1<<PC2);  // Gelbe LED ein
11
    _delay_ms(500);     // +1/2 sec auslassen => Summe 1x Blinken 1s
12
  }
13
}

oder so

1
#include <avr/io.h>
2
#include <util/delay.h> 
3

4
int main(void)
5
{
6
  DDRC = (1<<PC2);      // Ausgang gelbe LED
7
  while (1) {           // Ewig lang...
8
    PORTC ^= (1<<PC2);  // Gelbe LED umschalten
9
    _delay_ms(1000);    // 1 sec warten
10
  }
11
}
Gast #2614560
Lesenswert?

Danke erstmals für die Antwort ich habe das es
erst genau sowie dein 1. Beispiel gemacht mit 1000ms delay also 2.sek 
verzögerung da blinkt es aber immernoch 54 also ca die hälfte  wie bei 
1. sek.

Aber du hast recht bei mir fehlt die define zeile ich probiere es 
nocheinmal.

Gruß
Gast #2614572
Lesenswert?

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <inttypes.h>
#define F_CPU 3686400l

void main (void)
{

DDRC = 0xFF;          //PortB = Ausgänge
PORTC = 0x00;

char i=0;
lcd_init();
while(1)
{       PORTC &=~(1<<PC2);      // Gelbe LED aus
        _delay_ms (500);       // 1sec auslassen
    PORTC |=(1<<PC2);    // Gelbe LED ein
      _delay_ms (500);      // 1sec anlassen
       i++;
      lcd_setcursor(0,1);
        lcd_string ("Zaehlerstand:");
        lcd_setcursor( 0,2 );
        char Buffer[20];
        itoa( i, Buffer, 10 );
        lcd_string( Buffer );
  }
}
Gast #2614609
Lesenswert?

> #define F_CPU 3686400l

muss vor

> #include <util/delay.h>

Du solltest bei deinem Blinkcode auch eine Warnung beim Übersetzen 
bekommen haben.

Entweder, dass F_CPU nicht gesetzt ist (bei deiner gezeigten Anordnung 
der Zeilen) oder dass F_CPU umdefiniert wurde (wenn es vorher gesetzt 
war).
Gast #2614634
Lesenswert?

So das mit dem blinken der Led Stimmt jetzt.
Danke Krapao du hattest recht gehabt.
Das bedeutet das in meinem programm zB. 480us auch 480us sind voran 
liegt es dann. Hat jemand vielleicht noch ne Idee. Ich weiss wirklich 
nicht weiter weil ich da auch kaum hindergrundwissen habe. Ich würde 
mich sehr auf jede Hilfe freuen.
Gruß
Gast #2614646
Lesenswert?

Sauger schrieb:
> Nabend,
>
> Damit du weiterkommst im Anhang ein Beispiel wie ich das Bitgerösel auf
> dem WWB gelöst habe. Die DS18S20 haben eine Eigene Versorgungsspannung.
>
> MfG

Hallo,
ich würde gern dein code benutzen nur habe ich leider nicht soviel 
Hintergrundwissen so dass ich leider nicht alles verstehe.
Gast #2615307
Lesenswert?

Also erstmals vielen Dank Krapao für die Korrektur.

Ich habe den den Sensor so angeschlossen:

Sensor PIN 1 (GRD)--> Atmega8 PIN Low
Sensor PIN 2 (DQ) --> Atmega8 PIN C0
zusaätzlich ein 4,7kOhm von Atmega8 PIN High --> Atmega8 PIN C0
Das LCD zeigt 63,55 und 127,5 abwechselnd an.
Und wenn ich Sensor PIN 3 (VDD) --> Atmega8 PIN High anschliesse dann 
ist das wie ein Kurzschluss und der Sensor wird warm und das LCD geht 
aus.
Deswegen Habe ich Sensor PIN 3 (VDD) nicht angeschlossen.

Kann mir jemand sagen warum der Sensor warm wird und wenn ich den Sensor 
nicht richtig angeschlossen habe was ich falsch gemacht habe.
Ich bin für jede Hilfe dankbar.
Gast #2615384
Lesenswert?

> Sensor PIN 1 (GRD)--> Atmega8 PIN Low
> Sensor PIN 2 (DQ) --> Atmega8 PIN C0

OK.

> Deswegen Habe ich Sensor PIN 3 (VDD) nicht angeschlossen.

Nit gudd. Den Pull Up so anschliessen!
1
Sensor                         Atmega8
2
1 GND  o---------------------o GND
3
2 DQ   o---------+-----------o PC0
4
                 |
5
                 # Pull Up
6
                 # 4.7K
7
                 #
8
                 |
9
3 VDD  o---------+-----------o Vcc
Gast #2615418
Lesenswert?

> Und wenn ich Sensor PIN 3 (VDD) --> Atmega8 PIN High anschliesse dann
> ist das wie ein Kurzschluss und der Sensor wird warm und das LCD geht
> aus.

Du kannst zur Sicherheit einen 330 bis 1K Serienwiderstand in die Vcc 
Leitung zum Sensor machen.

Dadurch hast du eine Strombegrenzung auf 5-15 mA, selbst wenn es einen 
Kurzschluss durch den Sensor gibt.

Dieser Strom sollte immer noch ausreichen, um den Sensor zu betreiben.
Gast #2615434
Lesenswert?

Also ich habe den Sensor genau so angeschlossen aber sobald ich den
Sensor PIN3 VDD ----- VCC Atmega8 anschlisse ist so als würde ich ein 
Kurzschluss verursachen, der Sensor wird warm und LCD wird dunkel.
Was ist eigentlich der unterschied zwichen PIN High am Atmega8 und 
Anschlussversogung VCC?
Danke nochmals für die Hilfe!
Gruß
Gast #2615500
Lesenswert?

PIN High am Atmega8 ist je im Datenblatt des Atmega8 nicht drin.

Wenn du damit meinst "Einen Pin am Atmega8 auf Ausgang stellen und High 
Pegel ausgeben", dann ist der Unterschied, dass dieser Ausgangspin 
weniger Stom liefern kann und belastet werden darf (s. Absolute Maximum 
Ratings) als ein direkter Anschluss an Vcc, die Versorgungsspannung des 
Boards.

Ist das Board/Schaltung (Doku?) vielleicht für die Installationsvariante 
parasitäre Stromversorgung ausgelegt? In diesem Fall ist naturgemäß 
eine Verbindung VDD zu GND vorhanden! Wenn da zusätzlich VDD mit Vcc 
verbunden wird, wird was warm. http://www.wiregate.de/1-wire-bus bzw. 
Figure 4 im Datenblatt des Sensors.

Ein anderes Problem kann ein Lötfehler sein, bei dem eine Lötbrücke 
zwischen GND und VDD am Sensor (bzw. dessen Fassung oder Lötpunkten) 
vorhanden ist. Mit einem Widerstandsmessgerät (Multimeter) sollte sich 
dieser Fall finden lassen. Lötpunkte auch mit Lupe absuchen, Sensor 
rauszuppen/auslöten, Atmega rauszuppen und Widerstände zwischen den Pins 
an den Fassungen/Lötpunkten und GND messen.
Gast #2615611
Lesenswert?

Krapao schrieb:
> PIN High am Atmega8 ist je im Datenblatt des Atmega8 nicht drin.
>
> Wenn du damit meinst "Einen Pin am Atmega8 auf Ausgang stellen und High
> Pegel ausgeben", dann ist der Unterschied, dass dieser Ausgangspin
> weniger Stom liefern kann und belastet werden darf (s. Absolute Maximum
> Ratings) als ein direkter Anschluss an Vcc, die Versorgungsspannung des
> Boards.
>
> Ist das Board/Schaltung (Doku?) vielleicht für die Installationsvariante
> parasitäre Stromversorgung ausgelegt? In diesem Fall ist naturgemäß
> eine Verbindung VDD zu GND vorhanden! Wenn da zusätzlich VDD mit Vcc
> verbunden wird, wird was warm. http://www.wiregate.de/1-wire-bus bzw.
> Figure 4 im Datenblatt des Sensors.


Auf dem Atmega gibt es PIN HI und PIN LO die habe ich gemeint.
Ich probiere das mit dem Durchgangsprüfung und den Widerstände und dann 
melde ich mich wieder

Gruß
Gast #2615784
Lesenswert?

> Auf dem Atmega gibt es PIN HI und PIN LO die habe ich gemeint.

Auf meinen Atmega8s gibt es die nicht. Und auch im Datenblatt gibt es 
keine Pins mit Namen HI oder LO im Kapitel Pin Configurations.

Wenn damit normale Pins außer Pin 7 und 8 beim PDIP Gehäuse gemeint 
sind, die HIGH oder LOW Pegel aus gibt, funktioniert das nicht. Dein 
Programm oben steuert exakt nur einen Pin: PC0 und das ist der Pin mit 
der Datenleitung zum Sensor.

Ich an deiner Stelle würde eine Skizze/Schaltplan machen, welche Leitung 
wo angeschlossen ist, um alle Mistverständnisse auszuräumen. In diesem 
Zusammenhang interessieren auch die Anschlüsse an Pin 20 bis 22 (beim 
PDIP Gehäuse), d.h. AGND, AREF und AVcc, die für die Funktion von PC0 
benötigt werden.
Gast #2615838
Lesenswert?

Als ich das wie oben gezeigt angeschlossen habe also:
Sensor PIN 1 (GRD)--> Atmega8 PIN Low
Sensor PIN 2 (DQ) --> Atmega8 PIN C0
zusaätzlich ein 4,7kOhm von Atmega8 PIN High --> Atmega8 PIN C0
Und  Sensor PIN 3 (VDD) --> Atmega8 PIN High  dann
ist das wie ein Kurzschluss und der Sensor wird warm und das LCD geht
aus. Deswegen habe ich dann denn Anschluss Sensor PIN 3 (VDD) weggelssen 
aber ich denke das ich den Sensor schon weggeschossen habe.

Wie muss ich den Sensor an diesem Board anschliessen?

Gruß
Gast #2615869
Lesenswert?

Langsam gehen mir die Ideen aus...

Also die LO und HI Buchsen sind Abgriffe für GND und Vcc auf der 
Platine. Soweit so gut.

So weit ich meinen trüben Augen trauen kann, ist der Anschluss auch OK.

Im myavr Forum gibt es einen Tipp:
Beim DS18S20 mit der Zeit zwischen den Abfragen hochgehen 
http://myavr.info/myForum/viewtopic.php?t=1235&highlight=ds18s20

Du hast zwar schon _delay_ms(1000) an der Stelle. Aber warte mal noch 
länger.
Gast #2615934
Lesenswert?

Krapao schrieb:

> Du hast zwar schon _delay_ms(1000) an der Stelle. Aber warte mal noch
> länger.

Also das mit verlängern der delay an der eine Stelle hat auch nichts 
gebracht. Ich denke der Sensor funktioniert nicht mehr  richtig 
schließlich ist da ein Kurzschlussstrom geflossen sonst würde er ja 
nicht warm werden.
Ich bestelle einen neuen Sensor und versuche es dann nochmal.
Kannst du mir vielleicht sagen wie ich denn neuen Sensor an meinem Board 
anschlissen soll ohne ihn wieder abzuschiessen oder wie ich denn alten 
sensor prüfen kann ob er kaputt ist?
Und nochmals vielen dank für deine Hilfe.

Gruß
Gast #2618279
Lesenswert?

Ich habe mir ebenfalls einen Sensor beschafft und damit das Programm 
oben getestet. Dabei habe ich festgestellt, dass das Timing nicht dem 
Timing im Datenblatt entspricht. Mein Sensor hat ebenfalls nur 127.5 
ausgegeben. Nach einer kleinen Anpassung funktioniert aber die 
Temperaturmessung. Der geänderte Code ist im Anhang.
Angehängte Dateien:
Gast #2620816
Lesenswert?

So ich hab das mit dem neuen Sensor nun ausprobiert und es funktioniert 
wirklich ich kann es kaum fassen. Ich möchte mich bei allen für eure 
Hilfe bedanken und vorallem Krapao vielen Dank für deine Hilfe ohne die 
wäre ich aufgeschmissen gewesen.

Gruß
Gast #2996700
Lesenswert?

Hallo!
Ich habe den Code von Krapao(temp2.c) verwendet und es wird bei mir am 
Display die ganze Zeit 127,5 angezeigt als Temperatur (was ein sehr 
komischer Wert ist).
Kann mir vielleicht jemand weiterhelfen? Danke

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