Hallo zusammen
hab folgende Aufgabenstellung und ein Bsp-Code dazu.Allerdings ist mir
der Code nicht ganz klar!
Über hilfe wäre ich dankabr!!
Erkennt das Programm einen Signalwechsel auf ‘High‘, muss dies in
gewissen
Zeitabständen noch einige Male abgefragt werden, um zu gewährleisten,
dass das Signal
auch sicher anliegt und nicht prellt.
Sollte während der Zustandsermittlung doch ein Prellen auftreten
(Schalterstellung geht
wieder auf den entgegengesetzten Wert), sollte der bisherige Zustand
verworfen werden
und die Zeitdauer zur Zustandsbestimmung erneut beginnen.
Dies muss solange erfolgen, bis die maximale vorgegebene Anzahl der
Abfragen mit dem
neuen Signalzustand erreicht ist. Erst dann darf der Zähler erhöht
werden.
Mir ist folgendes unklar:(Siehe kommentar)
1
$SEGMENTED CASE MODV2
2
$MODINF (43)
3
$INCLUDE(xc164.inc)
4
5
NCODE CGROUP ?PR?MAIN
6
NCONST DGROUP ?NC?MAIN
7
8
ASSUME DPP1 : NCONST
9
ASSUME DPP3 : SYSTEM
10
11
; Konstantendefinition:
12
13
14
Wartezeit EQU #0xffff
15
Wartezeit2 EQU #0x0002
16
17
?PR?MAIN SECTION CODE WORD 'NCODE'
18
19
; Hauptprogramm:
20
21
main PROC NEAR
22
GLOBAL main
23
24
extr #1
25
mov DP1L, #0xFF
26
mov P1L, #0x00
27
28
mov R0, #0x00
29
mov R1, #0x00
30
mov R2, #0x00
31
mov R3, #Wartezeit
32
mov R4, #Wartezeit2
33
34
bmov R0.0, P4.3
35
bmov R1.0, P4.3
36
37
compare:
38
39
40
cmp R0, R1
41
jmp cc_eq, poll
42
43
44
entprell:
45
46
sub R3, #1
47
cmp R3, #0
48
jmp cc_ne, entprell
49
50
51
jmp cc_eq, led
52
53
bmov R0.0, R1.0 ;wird dies hier überhaupt einmal
54
bmov R1.0, P4.3 ;durchloffen?Die beiden jmp befehle (eq und ne)
55
cmp R0, R1 ;lassene es doch gar nicht dazu kommen!!oder??
feldi schrieb:> Erkennt das Programm einen Signalwechsel auf ‘High‘, muss dies in> gewissen> Zeitabständen noch einige Male abgefragt werden, um zu gewährleisten,> dass das Signal> auch sicher anliegt und nicht prellt.
Prellen kann bei jedem Signalwechsel auftreten, also nicht nur bei High
entprellen, sondern auch bei Low. D.h. einfach dann, wenn der Input
ungleich dem entprellten Zustand ist (XOR-Befehl).
Mehrmals abfragen ist Quatsch, geht viel zu schnell, da entprellt
nichts.
Oder Du nimmst eine astronomisch hohe Anzahl (>100.000), die dann die
CPU-Zeit verschwendet.
Du mußt mit einem Entprellintervall abfragen, also ein Timerinterrupt
ist ideal dafür.
In meiner Praxis haben sich Intervalle von 5 ... 50ms bei einer 4-fach
Abtastung als optimal erwiesen.
Bequemer Weise entprelle ich immer einen ganzen Input-Port, auch wenn
ich nur eine Taste davon benutze. Dadurch bin ich flexibel und brauche
nicht für jede Taste eine eigene Entprellung.
C oder AVR-Assembler:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=189356#189356
Peter