Hallo Leute!
Habe ein kleines Problem, folgendes:
Habe mir vor schon etwas längerer Zeit 'nen DS1820 besorgt.
Nun habe ich das Vorhaben wieder aufgenommen ihn auszulesen!
Und ja, ich weiß das etliche Beiträge/Infos dazu herrschen,
doch komme ich da absolut auf keinen grünen Zweig! :(
Also ich bekomm' ein Present-Signal, will ich jedoch das Scratchpad nach
einer Messung auslesen, beomm' ich lauter 0x00's :\
Nutze 'nen ATMega32, dieser ist mit 1MHz getaktet.
Wär' echt nett, wenn ein etwas Erfahrener mal über meine Funktionen
schauen könnte!
### thermo.h ###
Wär' super wenn mir mal Jemand sagen könnte, warum da was nicht so
funktioniert...
Und bitte fordert mich nicht auf zu googlen etc.
Habe 'ne Menge gesucht, aber nichts von dem vielen Zeug
half mir(ja, erstaunlicher Weise...).
Bis auf das Datenblatt und eine Doku über die 1-Wire
Kommunikation natürlich, jeweils bereitgestellt von Maxim.
Vielleicht geh ich auch irgendwie falsch an die Sache ran.
Wenn noch was von Nöten ist, dann reich ich es gerne nach
Danke schon mal im Voraus für (hoffentlich) die Hilfe! : )
Gruß, der ATMegaNoob ;)
>> Wär' super wenn mir mal Jemand sagen könnte, warum da was nicht so> funktioniert...
Das sieht nicht so gut aus. Dieser Codefetzen hat Syntaxfehler (ein }
fehlt) und lange Berechnungen (1Wire-Reset + 1Wire-Abfrage +
LCD-Ausgabe) in der Interrupt-ISR sind fragwürdig.
Also ehm ja, das } ist auf jedenfall da, auf das if folgt ein else mit
der LCD-Ausgabe "Therm nicht gefunden". Sorry das ich es nicht
mitkopiert habe, irritiert schon sehr.
Stefan B. schrieb:> (1Wire-Reset + 1Wire-Abfrage +> LCD-Ausgabe) in der Interrupt-ISR sind fragwürdig.
warum fragwuerdig?
> Also ich bekomm' ein Present-Signal, will ich jedoch das Scratchpad nach> einer Messung auslesen, beomm' ich lauter 0x00's
Bekommst du das Signal tatsächlich (mit Oszilloskop überprüft?)
oder ist die Datenleitung vielleicht immer auf 0 und dein
Programm sagt somit immer "Thrm gefunden, Messe..." ?
Wenn dein Programm sich in der ISR befindet, können keine anderen
Interrupts abgearbeitet werden.
Das betrifft u.U. die Funktionsfähigkeit der in der ISR aufgerufenen
Funktionen, z.B. wenn I/O mit Hardwareinterrupts arbeitet (TWI, ADC,
Timer, UART, ...). In deinem Codefetzen ist das vermutlich nicht
relevant. Sicher kann ich es nicht sagen, weil nicht alles gezeigt ist.
Das betrifft ausserdem die Zuverlässigkeit bei der Reaktion auf
Interrupt auslösende Ereignisse. Trifft die interruptauslösende
Bedingung zu, während das Programm in der ISR ist, wird max. ein solches
Ereignis in die "Interruptwarteschlange" eingereiht. Weitere Ereignisse
der gleichen Interruptquelle werden weggeworfen.
Danke erstmal fuer eure Antworten!
@Chester: Nein, ein Oszi habe ich nicht, ich habe es aber dahingehend
gecheckt, dass wenn ich den DS1820 vom Bus nehme die Meldung "Therm
nicht gefunden" kommt (eben der codefezten, den ich vergessen habe).
Also nehme ich stark an, das es doch der DS1820 ist, der den Bus runter
drueckt und die Reset-Routine schonmal soweit stimmt.
@Stefan: Ja, das der uC dahingehend "blockiert" ist, ist mir bewusst,
ueberall wird ja auch vor langen Abarbeitungen in den Interrupt-Routinen
gewarnt. Da bei mir aber wirklich nichts anderes laeuft [bis auf eine 2.
ISR fuer den 2. Taster, aber da passiert nichts kritisches
(Pollin-Board)] denk/hoff ich, dass mir das nicht in die Quere kommen
duerfte.
Ich kann ja mal mein komplettes "Projekt" (eher Bausteller) in der
naechsten Zeit hochladen, wenn es erforderlich ist...
Bitte um Feedback dahingehend und natuerlich weiter um Hilfe!
...frustriert naemlich nun schon ziehmlich lol..
Gruss ATMegaNoob
Solche Frustrationen verringere ich persönlich indem ich mich vom
Kleinen zum Grossen vortaste.
In deinem Beispiel würde ich zuerst ein "stinknormales" main() mit einer
Arbeitsschleife benutzen und in der Arbeitsschleife die Abfrage des
Sensors machen. Der Vorteil - das ganze Interruptgedöns kann nicht
stören. Tausend potentielle Bugs weniger...
Wenn das funktioniert, würde ich den Interrupt draufpacken. Im Prinzip
dann also eventgesteuert arbeiten - in der ISR wird ein Flag (volatile)
gesetzt, dass der INT0 aufgetreten ist und in der Arbeitsschleife wird
das Flag abgefragt und darauf reagiert (Sensorabfrage und Ausgabe).
Bzw. noch wahrscheinlicher ein ähnliches Projekt mit Interrupt aufsetzen
bei dem durch den Interrupt nur eine LED (oder die LCD-Anzeige) betätigt
wird. Mit dieser Projektstufe kann die richtige Initialisierung des INT0
sowie die grundsätzliche Funktion überprüft werden ohne dass der Sensor
eine Rolle spielt. Wenn das funktioniert, würde ich versuchen die
Sensorabfrage draufzupacken.
Wenn du das Projekt hochlädst (was ich für sinnvoll halte), gehe nochmal
darauf ein, wie du den Sensor angeschlossen hast und was du beim
Programmlauf beobachtest ("Also ich bekomm' ein Present-Signal..." ???).
Im Moment sieht es für mich so aus, als ob du den DS1820 parasitär
versorgst und als Pull-Up Widerstand den internen Pullup des PD7
benutzt. Wenn das so ist:
Im Datenblatt des DS18S20 (S.5 2. Abschnitt) ist aber die Rede davon
einen starken Pullup (4,7 kOhm) zu benutzen - das ist der interne
Pullup des PD7 nicht; der ist mit ca. 50 kOhm dafür zu hochohmig
(schwach). Das würde zum Bild passen, dass durch die zu hohe parasitäre
Stromaufnahme des DS1820 bei zu hochohmigem AVR-internem Pull-Up die
DQ-Leitung am PD7-Eingang des AVR nie logisch HIGH wird und du beim
Lesen des Scratchpads nur '0'-Bits liest bzw. der Sensor sogar nicht
arbeitet, da zu wenig Strom (5V/50KOhm = 0,1mA statt bis zu 1 bis 1,5 mA
wie erforderlich).
>Also nehme ich stark an, das es doch der DS1820 ist, der den Bus runter>drueckt und die Reset-Routine schonmal soweit stimmt.
Ich tippe auf ein Timing-Problem, das aber ohne oszi schwer zu
überprüfen ist...
Folgendes würde ich auf jeden Fall einbauen. Nach dem der DS1820 die
Leitung auf 0 zieht muss er sie auch danach wieder
freigeben, sonst ist da was faul.
also folgendes ausprobieren
LOL!
Ja ja, die kleinen netten Fehler! ;)
Habe den DS wohl um eine Buchsenreihe verschoben falsch angeschlossen...
:X
Also folgender Stand: Beim Auslesen des LSB-Bytes kommen tatsaechlich
Werte raus!
Und wenn ich das Ding mit dem Finger erwaerme, steigt es auch :)
Ich werde das ganze nochmal richtig ueberpruefen(vorallem mit dem
PullUp), und werd dann ggf. mein komplettes Projekt Up'en, ausser ihr
seid der Meinung das Forum braucht sowas nichtmehr.
Wie auch immer, wuerde gern Eure Hilfe in Anspruch nehmen, um das Ganze
zu optimieren.
@Stefan: Ich werd mir das ansehen, und sehr wahrscheinlich auch was von
deiner potentiellen Vorgehensweise implementieren, das es mir doch auf
den erstem Blick sympathischer scheint!
Danke fuer Eure Hilfe bis hierhin!
(Nun erstmal reggen :) )
Gruss ATMegaNoob