Forum: Mikrocontroller und Digitale Elektronik XC164-asssembler_schalter_entprellen


von feldi (Gast)


Lesenswert?

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??
56
jmp cc_eq, entprell    
57
58
mov R3,#Wartezeit
59
jmp entprell
60
61
62
poll:
63
64
bmov R0.0,R1.0
65
bmov R1.0, P4.3
66
jmp compare
67
68
69
led:
70
  
71
cmp R1, #0x0001
72
jmp cc_eq, poll
73
         
74
add R2,#1
75
extr #1
76
mov DP1L, #0x0
77
mov P1L, R2
78
extr #1
79
mov DP1L, #0xFF
80
mov R3, #Wartezeit
81
jmp poll
82
83
84
main  ENDP
85
86
87
88
89
90
91
92
93
?PR?MAIN  ENDS
94
95
   ; Datenbereich
96
97
?NC?MAIN  SECTION  DATA WORD 'NCONST'
98
?NC?MAIN  ENDS
99
100
END

von Peter D. (peda)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.