Hallo zusammen, ich schreibe derzeit ein Programm für einen Mid-Range PIC-Mikrocontroller (PIC16F873) in C und benutze dafür MPLABX und den kostenfreien Compiler XC8. Der Mikrocontroller wird extern mit 4MHz getaktet und läuft zuverlässig in der Schaltung. Am I2C-Bus hängen ein paar IO-Expander mit denen ich verschiedene Stati visualisiere (die Expander steuern LEDs). Am PortB sind acht Taster angeschlossen. Alle Taster sind Hardware-Entprellt (RC-Glieder und Schmitt-Trigger). Wenn ich die verschiedenen Eingänge mit dem Oszilloskop betrachte und einen Taster betätige, sehe ich saubere Rechteckimpulse (ca.50ms breit, wenn sehr kurz betätigt). Auch im Programmcode lassen sich beliebige Aufgaben mithilfe der externen Taster lösen. Soweit funktioniert alles einwandfrei. Nun habe ich eine kleine State-Maschine programmiert und wundere mich über das verhalten des Microcontrollers. In der main-Funktion des Programms wird die state-maschine aufgerufen. Die state-maschine liest mithilfe der Funktion key_Handler() zuerst alle Eingänge und ein generiert aus dem aktuellen Zustand einen Status und arbeitet darauf hin die notwendigen (vom Status abhängigen) Aktionen ab. Nun zu meiner Frage: Warum macht es einen Unterschied, wo ich (PORTBbits.RB7==1) Abfrage? Wird der Zustand als erstes Abgefragt, registriert das Programm jeden Tastendruck. Wird er als letztes abgefragt, wird nur unregelmäßig die zugehörige Aktion ausgeführt. Kann mir das jemand beantworten? Vielen Dank und freundlichen Gruß musicmiles Anhang: Funktion key_handler() und Funktion key_statemaschine()
1 | void key_handler() |
2 | {
|
3 | if(PORTBbits.RB1==1) |
4 | {
|
5 | state=1; |
6 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
7 | {
|
8 | __delay_ms(1); |
9 | if(PORTBbits.RB1==1) |
10 | {
|
11 | db_cnt = 0; |
12 | }
|
13 | }
|
14 | }
|
15 | |
16 | if(PORTBbits.RB2==1) |
17 | {
|
18 | state=2; |
19 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
20 | {
|
21 | __delay_ms(1); |
22 | if(PORTBbits.RB2==1) |
23 | {
|
24 | db_cnt = 0; |
25 | }
|
26 | }
|
27 | }
|
28 | |
29 | if(PORTBbits.RB3==1) |
30 | {
|
31 | state=3; |
32 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
33 | {
|
34 | __delay_ms(1); |
35 | if(PORTBbits.RB3==1) |
36 | {
|
37 | db_cnt = 0; |
38 | }
|
39 | }
|
40 | }
|
41 | |
42 | if(PORTBbits.RB4==1) |
43 | {
|
44 | state=4; |
45 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
46 | {
|
47 | __delay_ms(1); |
48 | if(PORTBbits.RB4==1) |
49 | {
|
50 | db_cnt = 0; |
51 | }
|
52 | }
|
53 | }
|
54 | |
55 | if(PORTBbits.RB5==1) |
56 | {
|
57 | state=5; |
58 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
59 | {
|
60 | __delay_ms(1); |
61 | if(PORTBbits.RB5==1) |
62 | {
|
63 | db_cnt = 0; |
64 | }
|
65 | }
|
66 | }
|
67 | |
68 | if(PORTBbits.RB6==1) |
69 | {
|
70 | state=6; |
71 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
72 | {
|
73 | __delay_ms(1); |
74 | if(PORTBbits.RB6==1) |
75 | {
|
76 | db_cnt = 0; |
77 | }
|
78 | }
|
79 | }
|
80 | |
81 | if(PORTBbits.RB7==1) |
82 | {
|
83 | state=7; |
84 | for(db_cnt = 0; db_cnt <= 10; db_cnt++) |
85 | {
|
86 | __delay_ms(1); |
87 | if(PORTBbits.RB7==1) |
88 | {
|
89 | db_cnt = 0; |
90 | }
|
91 | }
|
92 | }
|
93 | }
|
94 | |
95 | void key_statemaschine() |
96 | {
|
97 | key_handler(); |
98 | switch(state) |
99 | {
|
100 | case 0:break; |
101 | |
102 | case 1: Anweisung 1; |
103 | break; |
104 | |
105 | case 2: Anweisung 2; |
106 | break; |
107 | |
108 | case 3: Anweisung 3; |
109 | break; |
110 | |
111 | case 4: Anweisung 4; |
112 | break; |
113 | |
114 | case 5: Anweisung 5; |
115 | break; |
116 | |
117 | case 6: Anweisung 6; |
118 | break; |
119 | |
120 | case 7: Anweisung 7; |
121 | break; |
122 | |
123 | default:; |
124 | break; |
125 | }
|
126 | }
|