Hallo zusammen.
Ich habe ein Problem und keinen Schimmer was da falsch läuft.
Mein Timer1 wird so konfiguriert, dass er jede Sekunde ein Interrupt
auslöst:
Da ich weiß, dass LCD-Ansteuerung und Temperatursensor auslesen lange
dauert habe ich mal ein cli() und ein sei()-Befehl eingebaut.
Trotz allem wird mir nach dem 3. Lesevorgang und nur bei Temperatur 1
-0.1 °C angezeigt.
Temperatur 2 liefert immer einen korrekten Wert.
Wenn ich den Timer deaktiviere und in der While-Schleife nur
ausführe, dann erhalte ich von beiden Fühlern korrekte Werte.
Warum also schießt mir der Timer, trotz cli(), in die Auswertung der
Fühler?
Jemand eine Idee?
Gruß
Der Praktikant
-0.1 das dürfte Hex als 0xFFFF über die Leitung gehen.
Wie versorgst du den DS18B20, bzw. wie sieht die Abfrage des Sensors
aus?
Der UNterschied dürfte darin liegen, dass du in dem einen Fall nur alle
5 Sekunden den Sensor abfrägst, während du im anderen Fall den Sensor
mehr oder weniger ständig abfrägst. So wie das aussieht, bist du im 5
Sekunden Fall aber zu schnell - der erste Sensor ist noch nicht fertig.
Mit dem Timer, schätze ich mal, hat das ganze nur indirekt zu tun. Wenn
du in deinen 2-ten Fall das 5 Sekunden Intervall mittels delay_ms(5000)
einrichtest, kriegst du dann dasselbe Ergebnis?
//temp_lsb = byte[0]; // Byte 0 enthält die Temperatur
20
return((buffer[1]<<8|buffer[0])*0.0625);
21
22
23
}
Das mit dem delay_ms(5000) bringt nichts, da hier nur gewartet wird.
Wie? Ich bin im 5 Sekunden Fall zu schnell? Vielleicht habe ich das
falsch formuliert. Statt alle 5 Sekunden kann ich auch jede Sekunde,
oder alle 30 s die asuwertung machen. Das Ergebnis ist das Gleiche und
damit hat der Timer sehr wohl etwas damit zu tun
Fall 1: Der Timer ist Aktiv -> TIMSK |= (1<<OCIE1A);
Im zweiten Fall findet die Auswertung permanent statt. Wie lange das
dauert wird durch die einzelenen Wartezeiten bestimmt.
Im ersten Fall haut mir der Interrupt jede Sekunde dazwischen. D. h.
wenn er gerade beim Lesen des Fühlers ist, unterrbricht der Timer.
ABER.
Ich habe ein cli() eingebaut, damit mir der Timer nicht mehr
dazwischkloppen kann. Nur geht das irgendwie nicht.
Ich wollte nur kurz mitteilen, dass das Problem gelöst wurde.
Ähem. Scheint wohl so, dass der Programmierer den Buffer der
itoa-Funktion zu, öhm zu kleine dimensioniert hat.
Ich hasse diese ständigen Layer 8 Probleme
Einen guten Rutsch an alle, die das hier noch lesen.
Ähhh? Das LCD wird nicht im Timer angesteuert.
Wie ganz oben beschrieben setze ich im Interrupt nur ein Flag das ich in
meiner Hauptschleife auswerte.
Nicht den Anfangsbeitrag lesen ist ein grottenschlechter Stil. ;-)