Problem mit Taster
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
-
-
Hm, wird vielleicht ein Alarm in messen_b ausgelöst, der durch einen Alarm in regelung wieder zurück gesetzt wird?
Das toggeln von Alarm finde ich nicht so praktisch, wenn Alarm, dann Alarm=1, kein Alarm, dann Alarm=0. 2* Alarm immer noch Alarm, 2*Alarm toggeln, kein Alarm. Verständlich?Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Wo wird die sub sensor aufgerufen?Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ja - OK das mit dem toggeln ist Geschmackssache, hat aber nichts direkt mit dem nicht Auslösen des Alarms zu tun!
Ich kann mir nicht vorstellen des es mit der Regelung zusammenhängt.
Ich bin am Ende meiner Weisheit!
Warum funktioniert der Alarm wenn ich eine Sub (Fehler) mit "If Err = 1" aus der main aufrufe?
Funktioniert natürlich übrigens auch wenn ich die Sub (Fehler) aus der main mit "If Fehler.0 = 1" aufrufe! -
In der sub vergleich kann Alarm wieder getoggelt werden, in der sub regelung nicht, hast Recht. Die sub sensor ersetzt doch jetzt die sub fehler. Die wird doch nirgens aufgerufen, oder ich hab's übersehen.
Jetzt mach mal einen Test: setze in der sub messen_b nach dem toggle Alarm mal ein wait 5 ein. Sollte ein Fehler aufgetreten sein, dann wird Alarm gegeben und 5 Sekunden gewartet. Würde jetzt in der später folgenden sub vergleich der Alarm getoggelt werden, weil da auch auf einen Fehler reagiert wird, dann wird der Alarm nicht gleich dadurch ausgeschaltet.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
@fredred hier mal eine schöne Beschreibung zum Thema stack, stackpointer...
mikrocontroller.net/articles/AVR-Tutorial:_StackRaum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ja die Sub Sensor ist derzeit "Ausser Dienst" Es müsste aber trotzdem ein Alarm durch die sub messen_b ausgelöst werden wenn ich den Sensor ausstecke!
Die Sub Fehler habe ich auf Sub Sensor umbenannt weil ich sonst die flag "Dim fehler as bit" nicht machen hätte können!
OK den Test mit dem Wait 5 mache ich morgen .... und melde mich dann wieder was dann passiert.
Danke und gute Nacht für heute -
Hier wäre es imho mal ein Auge auf ein Tool angebracht.
Ein Programmablaufplan gibt ein Grundgerüst und macht Fehler sichtbar. -
Danke für die Idee mit dem Programmablaufplan! Habe zwar kein Tool aber ich habe nur mal auf Papier die Sub Messen_b aufgezeichnet.
Dann war mir klar dass das so nicht funktionieren kann.
Habe nun das ganze anders gelöst - und - bis jetzt funktioniert es prima!
Ich kann ja nur den Sensor ausstecken und nach etwa 4 Sekunden ertönt der Alarm mit der Meldung dass der Sensor fehlt bzw. nicht reagiert!
Aber wie kann ich Testen ob bei falscher Checksum auch Alarm ausgelöst würde? (Unabhängig davon ob sinnvoll oder nicht)
Hier die neue Variante des Programms
Heizen_Kuehlen_0910.bas -
avralfred schrieb:
Danke für die Idee mit dem Programmablaufplan! Habe zwar kein Tool...
Tool zum Erstellen von Struktogrammen (Nassi-Shneiderman-Diagrammen)
zu deinem Programm
In der sub messen_b wird versucht, den Fühler auszulesen, wenn es klappt, dann alles ok, wenn nicht, wird erst beim nächsten Durchlauf nochmals versucht. Derweil zählst du woanders (timerinterrupt sekunden_tick) bis 5, wenn ein Fehler aufgetreten ist und reagierst dann. Ist irgendwie unübersichtlich.
Um die checksum zu testen könntest du den Übertragungsweg 'schlechter' machen, den pullup vergrößern, oder einen Widerstand in die Leitung einbauen. Irgendwann wird die Übertragung nicht mehr klappen, aber ob das dann an einer falschen checksum liegt, oder der Fühler nicht mehr erkann wird, keine Ahnung.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Danke, werde mir das Tool mal genauer ansehen!
OK das Hochzählen der Versuche kann ich in die Sub Messen_b verlegen - ist sicher übersichlicher.
Aber sonst könnte ich das ganze jetztso lassen, oder? -
Wenn alles funktioniert und es den Fischen gut geht, ja. (ohne Gewähr)Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Ja die Temperatur schwankt nur zwischen 25,3 und 25,4 °C!
Die Regelung (mit den Fehlern) habe ich schon etwa 1 Monat in Betrieb und bis auf das Tasterproblem keine Schwierigkeiten damit gehabt.
DANKE noch mal an alle und bis irgendwann
Alfred -
Ich werd mit den Nassi-Schneidermann nicht warm, benutze eher das klassische Blockdiagramm:
friedrich-folkmann.de/papdesigner/Hauptseite.html -
Danke werde dann warscheinlich das Blockdiagramm verwenden - das habe ich für die Analyse div. Arbeitsabläufe in der Arbeit auch benutzt!
-
Ein kleiner Fehler hat sich noch eingeschlichen gehabt: Wenn die Checksum nicht gepasst hat ist der Zähler "Versuche" gestartet
und hat auch nicht mehr aufgehört wenn beim nächsten durchlauf die Checksum wieder gepasst hat!
Nun läuft das System Stabil und ohne "Fehlalarme"
Quellcode
- Sub Messen_a
- 1wreset 'Bus Initialisieren / Zurücksetzen
- 1wwrite &HCC 'Skip ROM = Alle Slaves/Sensoren ansprechen
- 1wwrite &H44 'Messvorgang anstossen
- End Sub
- Sub Messen_b
- 1wreset 'Bus Initialisieren / Zurücksetzen
- 1wverify Dsid1(1) 'prueft ob ID des Sensors verfuegbar ist
- If Err = 1 Then 'wenn nicht verfuegbar dann
- Flag_versuche.0 = 1 'Fehler aufgetreten, bit 0 setzen
- Else 'Sensor ist wohl vorhanden
- 1wwrite &HBE 'Auslesen des Scratchpads
- Sc(1) = 1wread(9) 'Daten in ein Array lesen, beschreibt Sc(1) bis Sc(9)
- If Sc(9) = Crc8(sc(1) , 8) Then 'wenn Checksum passt die jeweilige Funktion ausführen
- Flag_versuche.0 = 0 'und bit 1 zuruecksetzen
- If Dsid1(1) = 16 Then Dg = Dg_ds18s20() '=10h Familie
- If Dsid1(1) = 40 Then Dg = Dg_ds18b20() '=28h Familie
- Dg_s1 = Dg / 10 'in Dezimalgrad umwandeln
- 'Dg_s1 = Dg_s1 + 0.1 'ev. Korrekturwert
- If Sc(9) <> Crc8(sc(1) , 8) Then
- Flag_versuche.1 = 1
- End If 'Checksum passt nicht - Fehler, bit 1 setzen
- End If
- End If
- 'Minimum- und Maximumwert der Wassertemperatur "merken"
- If Min1 > Dg_s1 Then Min1 = Dg_s1
- If Max1 < Dg_s1 Then Max1 = Dg_s1
- If Flag_versuche.0 = 1 Or Flag_versuche.1 = 1 Then
- Incr Versuche
- Else
- Versuche = 0
- End If
- If Versuche > 5 Then Versuche = 0
- End Sub
-
Noch ein Fehler
die Zeilen 443..445 dürfen natürlich nicht da stehen, wo nur hingesprungen wird, wenn die checksum ok ist.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Also einfach nach Zeile 442 End if und das aus Zeile 446 z.B. entfernen!
-
Oder besser so?
Quellcode
- Sub Messen_a
- 1wreset 'Bus Initialisieren / Zurücksetzen
- 1wwrite &HCC 'Skip ROM = Alle Slaves/Sensoren ansprechen
- 1wwrite &H44 'Messvorgang anstossen
- End Sub
- Sub Messen_b
- 1wreset 'Bus Initialisieren / Zurücksetzen
- 1wverify Dsid1(1) 'prueft ob ID des Sensors verfuegbar ist
- If Err = 1 Then 'wenn nicht verfuegbar dann
- Flag_versuche.0 = 1 'Fehler aufgetreten, bit 0 setzen
- Else 'Sensor ist wohl vorhanden
- 1wwrite &HBE 'Auslesen des Scratchpads
- Sc(1) = 1wread(9) 'Daten in ein Array lesen, beschreibt Sc(1) bis Sc(9)
- If Sc(9) = Crc8(sc(1) , 8) Then 'wenn Checksum passt die jeweilige Funktion ausführen
- Flag_versuche.0 = 0 'und bit 1 zuruecksetzen
- If Dsid1(1) = 16 Then Dg = Dg_ds18s20() '=10h Familie
- If Dsid1(1) = 40 Then Dg = Dg_ds18b20() '=28h Familie
- Dg_s1 = Dg / 10 'in Dezimalgrad umwandeln
- 'Dg_s1 = Dg_s1 + 0.1 'ev. Korrekturwert
- Else
- If Sc(9) <> Crc8(sc(1) , 8) Then
- Flag_versuche.1 = 1
- End If
- End If 'Checksum passt nicht - Fehler, bit 1 setzen
- End If
- 'Minimum- und Maximumwert der Wassertemperatur "merken"
- If Min1 > Dg_s1 Then Min1 = Dg_s1
- If Max1 < Dg_s1 Then Max1 = Dg_s1
- If Flag_versuche.0 = 1 Or Flag_versuche.1 = 1 Then
- Incr Versuche
- Else
- Versuche = 0
- End If
- If Versuche > 5 Then Versuche = 0
- End Sub
-
Was im Bereich des else ist, gilt sowieso für den Fall, das die checksum nicht stimmt. Also brauchst du das nicht mehr mit den if..überprüfen. Ist nur doppeltgemoppelt.Raum für Notizen
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------