Viele haben schon mal vor dem Problem gestanden , eine Hysterese bzw. einen Schwellwert auslesen zu müssen.
Das ist im Grunde nicht schwer und viele programmieren dies auf einfachste Weise wie z.B. :
Schleife :
If Wert_xyz >= Schwellwert then .....
If Wert_xyz < Schwellwert then .....
goto Schleife
grundsätzlich und für den Menschen logisch.
In den meisten Fällen funktioniert das auch , insbesondere wenn "nur" LED's zu schalten sind.
In Wahrheit kann dies aber zu ungewollten Effekten führen und für das ein oder andere Baueil sogar schädlich enden.
Wenn jetzt z.B. die Schleife durchlaufen wird, der Wert_xyz IST größer als der Schwellwert , .....
wird eine Ausführung je nach Code gemacht, da hier jetzt das then erfolgt.
Aber ...... wenn jetzt beim nächsten (Schleifen)-Durchgang der Wert_xyz sich nicht geändert hat und somit immer
noch >= dem Schwellwert ist , wird wieder das then zutreffen und es wird wieder die gleiche Ausführung wie zuvor erfolgen.
Wenn diese Ausführung z.B. das Wechseln von 2 LED Zuständen ist ( High/Low) , tut denen das nicht so "weh"
und wenn die Picaxe schnell genug ist , bekommt das menschliche Auge das auch nicht wirklich mit.
Ist es aber ein anderes Bauteil, was evtl. etwas empfindlich darauf reagiert , das ständig AN geschaltet wird , obwohl
es ja schon AN ist , ..... kann das unter Umständen solch Bauteil in Mitleidenschaft ziehen.
Darum sollte man die Hysterese etwas konkreter gestalten in dem man zwar wie gehabt fragt :
If Wert_xyz >= Schwellwert then .....
aber dann noch mal explizit nachfragt , ob eine zugehörige Ausführung schon erfolgt ist .
Denn dann muß diese nicht wiederholt erfolgen.
Beispiel :
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#rem
Pinbelegung
----
V+ -| |- GND
| |
Serin -| |- c.0/Serout
| |
ADC/c.4 -| |- c.1 LED rot
| |
c.3 -| |- c.2 LED grün
----
#endrem
#picaxe 08m2
let dirsc=%00000111
symbol Schwellwert = w0
symbol ADC_Messung = w1
symbol rot = b4
symbol gruen = b5
symbol aus = 0
symbol an = 1
Schwellwert=100
Do
readadc10 c.4,ADC_Messung ' Spannung am Poti messen
if ADC_Messung>=Schwellwert then ' wenn Spannung >= Schwellwertvorgabe ...
if rot=aus then ' wenn rote LED noch NICHT an ...
gosub schalte_rot ' Sprung zur Routine : schalte_rot
endif
endif
if ADC_Messung<Schwellwert then ' wenn Spannung < Schwellwertvorgabe ...
if gruen =aus then ' wenn grüne LED noch NICHT an ....
gosub schalte_gruen ' Sprung zur Routine : schalte_gruen
endif
endif
loop
end
schalte_rot:
rot=an ' merken das rote LED jetzt an ist
gruen=aus ' merken das grüne LED jetzt aus ist
high c.1 ' rote LED anschalten
low c.2 ' grüne LED ausschalten
return
schalte_gruen:
gruen=an ' merken das rote LED jetzt aus ist
rot=aus ' merken das grüne LED jetzt an ist
low c.1 ' rote LED ausschalten
high c.2 ' grüne LED anschalten
return
In diesem Codebeispiel wird erst dann ausgeführt wenn :
a) entsprechender Schwellwert erreicht
b) noch keine entsprechende Ausführung erfolgte
Das verschnellert zum Einen den Code und zum Anderen schützt es das(die) Bauteil(e)
die angeschlossen sind und geschaltet werden sollen.