Forum: Compiler & IDEs DS18S20, Atmega8, AVR Studio


von Kurt (Gast)


Angehängte Dateien:

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!!

von Sauger (Gast)


Lesenswert?

Nabend,

da du ein LCD hast, gebe doch erst mal das gelesene Scratch Pad aus und 
schau dir dessen Plausibilität an.

MfG

von Kurt (Gast)


Lesenswert?

Bei Auslesen von Sensordaten[0](Scratch Pad)zeigt das LCD auch 0 an und 
wenn ich den Sensor abklemme 255.

von Karl H. (kbuchegg)


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?

von Kurt (Gast)


Lesenswert?

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ß

von Sauger (Gast)


Lesenswert?

Nabend,

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.

dann solltes du auf einen KTY110 am ADC umsteigen.

MfG

von Kurt (Gast)


Lesenswert?

Das geht leider nicht ich muss es mit dieser Hadware realisieren.
Kann mir keiner sagen ob der Code Fehlerhaft ist oder nicht?
Für die Antwort wäre ich sehr dankbar.

von Krapao (Gast)


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

von Sauger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Michael M. (technikus)


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

von Kurt (Gast)


Lesenswert?

Kann mir keiner weiter helfen ich bin echt am verzweifeln.

von Kurt (Gast)


Lesenswert?

Sorry hatte die Beiträge nicht gesehen gehabt ich versuch es 
nachzuvollziehen.

von Kurt (Gast)


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ß

von Kurt (Gast)


Lesenswert?

Hat jemand eine Idee wie ich das so anpassen kann das 1 sek verzögerung 
auch wirklich 1 sek sind.

Gruß

von holger (Gast)


Lesenswert?

>Hat jemand eine Idee wie ich das so anpassen kann das 1 sek verzögerung
>auch wirklich 1 sek sind.

Compiler Optimierung einschalten?

von Kurt (Gast)


Lesenswert?

Sorry bin totaler Anfänger wie mache ich das.

Gruß

von Krapao (Gast)


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
}

von Alex W. (a20q90)


Lesenswert?

In Deinem Code steht etwas von DS1820! Du hast aber einen DS18S20!

von Kurt (Gast)


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ß

von Kurt (Gast)


Lesenswert?

Ich hab es nocheinmal probiert und es ist genau so wie vorher. 108 mal 
statt
30 mal in 30sek. Ich hab noch eine Zählvaribale laufen lassen damit ich 
das besser ablesen feststellen kannm.


Gruß

von Kurt (Gast)


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 );
  }
}

von Kurt (Gast)


Lesenswert?

Hallo Alex,

was meinst du genau?

von Kurt (Gast)


Lesenswert?

Wenn du das  mit den Kommentare gemeint hast einfach ignorieren.

Gruß Ferit

von Krapao (Gast)


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).

von Kurt (Gast)


Lesenswert?

Danke ich probiere es gleich aus

Gruß

von Kurt (Gast)


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ß

von Kurt (Gast)


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.

von Krapao (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang ist der Code aus dem 1. Posting korrigiert. Der Code ist 
simuliert, aber nicht mit einem Sensor gelaufen.

Bist du sicher, dass der Sensor und sein Pull Up Widerstand 
hardwaremäßig richtig angeschlossen sind?

von Kurt (Gast)


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.

von Krapao (Gast)


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

von Krapao (Gast)


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.

von Kurt (Gast)


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ß

von Kurt (Gast)


Lesenswert?

Ich besorg mal ein 500ohm und ein 1kohm und versuch das aus dann melde 
ich mich wieder.
Gruß

von Krapao (Gast)


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.

von Kurt (Gast)


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ß

von Kurt (Gast)


Lesenswert?

Wie kann ich den Sensor überprüfen ich glaube der funktioniert nicht 
mehr nachdem er warm geworden ist.
Ich muss wahrscheinlich einen neuen bestellen.

von Cyblord -. (cyblord)


Lesenswert?

Einzelne DS18B20 kauf ich immer über eBay beim pc_rentner. Preise sind 
ok und der liefert sehr schnell.
Große Mengen auf Vorrat auch über eBay aus HK oder so. 10 Stück für 10 
Euro so grob.

gruß cyblord

von Krapao (Gast)


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.

von Kurt (Gast)


Angehängte Dateien:

Lesenswert?

Hier einpaar Angaben zu meinen Board als PDF und ein Bild wie das 
angeschlossen habe.
 Die Beide PINs wo ich gemeint habe sind unten links auf dem Bild (HI 
und LO)
in der PDF datei.

von Kurt (Gast)


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ß

von Krapao (Gast)


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.

von Kurt (Gast)


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ß

von Bastler (Gast)


Lesenswert?

Kurt schrieb:
> Hier einpaar Angaben zu meinen Board als PDF und ein Bild wie das
> angeschlossen habe.

Wenn du beim Photographieren statt auf die DIP-Schalter des mySmartUSB 
auf den DS18B20 fokussieren würdest, könnte man ein bisschen mehr von 
deiner Verdrahtung  erkennen.

von Kurt (Gast)


Lesenswert?

Hallo Leute,

ich melde mich wieder wenn der neue Sensor da ist.

von Krapao (Gast)


Angehängte Dateien:

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.

von Krapao (Gast)


Lesenswert?

> // #define F_CPU 3686400L
> #define F_CPU 12000000L

Das musst du noch für dein System ändern. Meine 12 MHz mit // 
auskommentieren und deine 3686400 Hz den Kommentar wegmachen.

von Kurt (Gast)


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ß

von Pavlo (Gast)


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

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.