Variable für PIN-Input und Interrupt richtig definieren
Ich programmiere einen Atmel-Controller in C mit AVRStudio 5.0 und
möchte gerne vier Werte über Interrupteingänge einlesen, die mit
Schaltern/Tastern bedient werden. Jeweils zwei Öffner und zwei
Schließer.
Wenn sich an einem Pin ein Wert ändert (Pin-Change Interrupt) möchte ich
aber alle vier Werte einlesen um daraus Aktionen abzuleiten.
Meine Vorgehensweise ist zur zeit folgende:
1 | #define _S_aus 0x01 //PD0 / SCL/INT0 // Schalter "aus"
|
2 | #define _T_ein 0x02 //PD1 / SDA/INT1 // Taster "ein"
|
3 | #define _NA2 0x04 //PD2 / RXD1/INT2 // NOT-Aus 2
|
4 | #define _NA1 0x08 //PD3 / TXD1/INT3 // NOT-Aus 1
|
5 |
|
6 |
|
7 | /*globale Variablen */
|
8 |
|
9 | volatile uint8_t _ein_aus = (_NA1|_NA2|_T_ein|_S_aus);
|
10 |
|
11 | /* Interrupts */
|
12 |
|
13 | ISR(INT0_vect) // Interrupt Vector INT0
|
14 | {
|
15 | // keine Aktion erforderlich???
|
16 | }
|
17 |
|
18 | int main (void)
|
19 | {
|
20 | if ((_ein_aus <= 0xB) & (_ein_aus >= 4)
|
21 | {
|
22 | //Fehlerfall
|
23 | // Code hier
|
24 | }
|
25 | else
|
26 | {
|
27 | switch (_ein_aus)
|
28 | {
|
29 | case 0:
|
30 | case 1:
|
31 | case 2:
|
32 | case 3:
|
33 | //NOT-AUS FAll
|
34 | //Code hier
|
35 | break;
|
36 | case 0xD:
|
37 | // etwas ausschalten
|
38 | break;
|
39 | case 0xE:
|
40 | // etwas einschalten
|
41 | break;
|
42 | default:
|
43 | // nicht definiert, keine Aktion
|
44 | break;
|
45 | //
|
46 | }
|
47 | }
|
48 | }
|
- In der Interrupt - Routine muss ich nichts hineinschreiben, da ich in
der main nur meine Variablen auswerten möchte und meine Variable
(_ein_aus) als volatile deklariert ist - richtig?
- Muss ich alle ISRs (INT1...INT3) definieren, wie INT0 oben?
- Ist die globale Variable für diesen Fall richtig definiert? als
Volatile?
- Ist die globale Variable richtig verknüpft? (_NA1|_NA2|_T_ein|_S_aus)
?
Natürlich werde ich noch die Interrupt-Register setzen, das fehlt hier
im Code.