Hallo Liebe Forum Nutzer!
Im folgenden Programm wird mittels 5 Schalter eine Spannung von 1-5 Volt
ausgewählt, danach wird mit einem anderen Schalter ein Interrupt
ausgelöst, der die Bitmaske auf den PORTD überträgt, damit man die reale
Spannung anliegen hat. Nur mein Problem ist es, dass man die Spannung
nicht 0 setzen, kann, also wenn alle Schalter aus sind und der Interrupt
auslöst. Wenn kein Schalter an ist, und ich den Interrupt auslöse,
bleibt die Spannung gleich dem vorherigen Wert.
Schonmal vielen Dank für deine Hilfe!
1 | #ifndef F_CPU
|
2 | #define F_CPU 16e6 //Takt der CPU einstellen, 16MHz
|
3 | #endif
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 |
|
8 | #define S1INIT (DDRC &=~(1<<PC0)) // DDRB Bit2 löschen (als Eingang konfigurieren)
|
9 | #define S1STATUS (PINC & (1<<PC0)) // PortB Bit2 lesen (high-aktiv)
|
10 |
|
11 | #define S2INIT (DDRC &=~(1<<PC1)) // DDRB Bit3 löschen (als Eingang konfigurieren)
|
12 | #define S2STATUS (PINC & (1<<PC1)) // PortB Bit3 lesen (high-aktiv)
|
13 |
|
14 | #define S3INIT (DDRC &=~(1<<PC2)) // DDRB Bit2 löschen (als Eingang konfigurieren)
|
15 | #define S3STATUS (PINC & (1<<PC2)) // PortB Bit2 lesen (high-aktiv)
|
16 |
|
17 | #define S4INIT (DDRC &=~(1<<PC3)) // DDRB Bit3 löschen (als Eingang konfigurieren)
|
18 | #define S4STATUS (PINC & (1<<PC3)) // PortB Bit3 lesen (high-aktiv)
|
19 |
|
20 | #define S5INIT (DDRC &=~(1<<PC4)) // DDRB Bit3 löschen (als Eingang konfigurieren)
|
21 | #define S5STATUS (PINC & (1<<PC4)) // PortB Bit3 lesen (high-aktiv)
|
22 |
|
23 | uint8_t output; //Byte Variable output
|
24 |
|
25 | ISR(PCINT1_vect){ //Interrupt Service Routine
|
26 |
|
27 | PORTD = output; //Ausgänge setzen
|
28 | }
|
29 |
|
30 | int main(void){
|
31 |
|
32 | DDRD = 0xFF; //PORTD output
|
33 |
|
34 | sei(); //Enable Global Interrupts ("cli();" zum deaktivieren)
|
35 |
|
36 | PCICR = 1<<PCIE1; //Pin Change Interrupt Control Register, PCIE1 flag HIGH
|
37 | PCMSK1 = 1<<PCINT13; //Pin Change Mask Register 1, Pin Change Interrupt on PCINT11 (PC5)
|
38 |
|
39 | S1INIT;
|
40 | S2INIT;
|
41 | S3INIT;
|
42 | S4INIT;
|
43 |
|
44 | while (1){
|
45 |
|
46 | //1 Volt
|
47 | switch(S1STATUS){
|
48 |
|
49 | case 1: output = 51;
|
50 | break;
|
51 | }
|
52 |
|
53 | //2 Volt
|
54 | switch(S2STATUS){
|
55 |
|
56 | case 1: output = 102;
|
57 | break;
|
58 | }
|
59 |
|
60 | //3 Volt
|
61 | switch(S3STATUS){
|
62 |
|
63 | case 1: output = 153;
|
64 | break;
|
65 | }
|
66 |
|
67 | //4 Volt
|
68 | switch(S4STATUS){
|
69 |
|
70 | case 1: output = 204;
|
71 | break;
|
72 | }
|
73 |
|
74 | //5 Volt
|
75 | switch(S5STATUS){
|
76 |
|
77 | case 1: output = 255;
|
78 | break;
|
79 |
|
80 | }
|
81 | }
|
82 | }
|