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!!
Nabend, da du ein LCD hast, gebe doch erst mal das gelesene Scratch Pad aus und schau dir dessen Plausibilität an. MfG
Bei Auslesen von Sensordaten[0](Scratch Pad)zeigt das LCD auch 0 an und wenn ich den Sensor abklemme 255.
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
Sorry hatte die Beiträge nicht gesehen gehabt ich versuch es nachzuvollziehen.
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ß
Hat jemand eine Idee wie ich das so anpassen kann das 1 sek verzögerung auch wirklich 1 sek sind. Gruß
>Hat jemand eine Idee wie ich das so anpassen kann das 1 sek verzögerung >auch wirklich 1 sek sind. Compiler Optimierung einschalten?
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 | }
|
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ß
#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 ); } }
Wenn du das mit den Kommentare gemeint hast einfach ignorieren. Gruß Ferit
> #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.
> 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 |
> 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ß
Ich besorg mal ein 500ohm und ein 1kohm und versuch das aus dann melde ich mich wieder. 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ß
Wie kann ich den Sensor überprüfen ich glaube der funktioniert nicht mehr nachdem er warm geworden ist. Ich muss wahrscheinlich einen neuen bestellen.
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 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.