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!!
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?
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ß
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
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.
> 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
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
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
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ß
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:
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ß
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ß
> #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).
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ß
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.
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?
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.
> 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.
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ß
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.
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ß
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
> 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.
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.
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ß
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 hochgehenhttp://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.
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ß
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.
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.
> // #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.
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ß
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