Moin,
bin wieder an meinem MK2-Board am Gange.
Ich habe im Vorfeld ein funktionierendes Programm geschrieben, dass
einen Taster als Schalter verwendet, um eine LED ein- bzw.
auszuschalten. Es soll auch nichts anderes passieren, auch wenn ich die
Taste gedrückt halte. Dazu habe ich die negative Flanke verwendet. Ich
erwähne es deshalb, weil ich Teile davon in meinem neuen Programm
verwende. Nun bin ich mutiger geworden:
Neues Projektchen:
Verwendung von 8 Tastern um 8 LEDs ein-auszuschalten (wie oben). Aber
die 8 Taster sollen nicht 8 Inputbits belegen, sondern nur 4. Ich wollte
es binär lösen.
Taster 1 = Bit 0
Taster 2 = Bit 1
Taster 3 = Bit 0 + Bit 1
etc.
Hier der Code:
1 | /*-----------------------------------------------------------------------------
|
2 |
|
3 | ON - OFF switch with pushbutton
|
4 |
|
5 | 8 pushbuttons for switching 8 different LEDs by using only 4 input bits
|
6 |
|
7 | Negative slope is used for changing LED status
|
8 |
|
9 | -----------------------------------------------------------------------------*/
|
10 |
|
11 |
|
12 |
|
13 | // pushbutton on PORTB 0-3
|
14 | // LED on PORTC 0-5 und PORTA 2-3
|
15 |
|
16 |
|
17 | #include <avr/io.h>
|
18 | #include <util/delay.h>
|
19 |
|
20 | int t=0;
|
21 | int sig0=1;
|
22 | int sig1=1;
|
23 | int sig2=1;
|
24 | int sig3=1;
|
25 | int sig_alt0=1;
|
26 | int sig_alt1=1;
|
27 | int sig_alt2=1;
|
28 | int sig_alt3=1;
|
29 |
|
30 | int main (void)
|
31 | {
|
32 |
|
33 | DDRB &= ~( (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) ); // set PORT B 0,1,2 and 3 for input other keep unchanged
|
34 | DDRC = 0xFF; // set PORTC as OUTPUT for LED
|
35 | DDRA |= (1<<DDA2) | (1<<DDA3); // // set PORTCA 2-3 as OUTPUT for LED
|
36 | PORTB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3); // set PullUp for INPUT
|
37 |
|
38 |
|
39 | while(1)
|
40 | {
|
41 |
|
42 | sig0=(PINB & (1<<PB0)); // Read signal of PIN0
|
43 | sig1=(PINB & (1<<PB1)); // Read signal of PIN1
|
44 | // sig2=(PINB & (1<<PB2)); // Read signal of PIN2
|
45 | // sig3=(PINB & (1<<PB3)); // Read signal of PIN3
|
46 |
|
47 |
|
48 | if ((sig0==0 && sig_alt0!=0) && sig1==1 && sig2==1 && sig3==1) t=1; // negative slope of signal? --> pushbutton No.1 pressed
|
49 | if ((sig1==0 && sig_alt1!=0) && sig0==1 && sig2==1 && sig3==1) t=2;
|
50 | // if ((sig0==0 && sig_alt0!=0) && (sig1==0 && sig_alt1!=0) && sig2==1 && sig3==1) t=3; // negative slope on PINB0 AND PINB1 ?
|
51 | // if ((sig2==0 && sig_alt2!=0) && sig0==1 && sig1==1 && sig3==1) t=4;
|
52 | // if ((sig0==0 && sig_alt0!=0) && (sig2==0 && sig_alt2!=0) && sig1==1 && sig3==1) t=5;
|
53 | // if ((sig1==0 && sig_alt1!=0) && (sig2==0 && sig_alt2!=0) && sig0==1 && sig3==1) t=6;
|
54 | // if ((sig0==0 && sig_alt0!=0) && (sig1==0 && sig_alt1!=0) && (sig2==0 && sig_alt2!=0) && sig3==1) t=7;
|
55 | // if ((sig0==0 && sig_alt0!=0) && (sig1==0 && sig_alt1!=0) && (sig2==0 && sig_alt2!=0) && (sig3==0 && sig_alt3!=0)) t=8;
|
56 |
|
57 |
|
58 |
|
59 | switch (t)
|
60 | {
|
61 | case 1:
|
62 | _delay_ms(20);
|
63 | if ((PINC & (1<<PC0))==0 ) // status of green LED
|
64 | { // if OFF
|
65 | PORTC |= (1<<PC0); // green LED ON
|
66 | _delay_ms(100);
|
67 | }
|
68 |
|
69 | else
|
70 | { // if ON
|
71 | PORTC &= ~(1<<PC0); // green LED OFF
|
72 | _delay_ms(100);
|
73 | }
|
74 | break;
|
75 |
|
76 | case 2:
|
77 | _delay_ms(20);
|
78 | if ((PINC & (1<<PC1))==0 ) // status of yellow LED
|
79 | { // if OFF
|
80 | PORTC |= (1<<PC1); // yellow LED ON
|
81 | _delay_ms(100);
|
82 | }
|
83 |
|
84 | else
|
85 | { // if ON
|
86 | PORTC &= ~(1<<PC1); // yellow LED OFF
|
87 | _delay_ms(100);
|
88 | }
|
89 | break;
|
90 |
|
91 |
|
92 | /* case 3:
|
93 | _delay_ms(20);
|
94 | if ((PINC & (1<<PC2))==0 ) // status of red LED
|
95 | { // if OFF
|
96 | PORTC |= (1<<PC2); // red LED ON
|
97 | _delay_ms(100);
|
98 | }
|
99 |
|
100 | else
|
101 | { // if ON
|
102 | PORTC &= ~(1<<PC2); // red LED OFF
|
103 | _delay_ms(100);
|
104 | }
|
105 | break;
|
106 | */
|
107 | } // end of switch
|
108 |
|
109 | t=0;
|
110 | sig_alt0=sig0;
|
111 | sig_alt1=sig1;
|
112 | sig_alt2=sig2;
|
113 | sig_alt3=sig3;
|
114 |
|
115 | } // end of while(1)
|
116 | } // end of main
|
Ich bin mir sicher, dass es eleganter und kürzer geht. Aber mir geht es
darum, meine Ausführung zum Funktionieren zu kriegen und zu verstehen,
warum etwas nicht funktioniert. Wenn alles klappt, dann wollte ich mich
ransetzen und Kürzungen etc. einbringen.
Ich bin Schritt für Schritt vorgeangen. Wenn ich die Zeile 43 durch //
rausnehme, dann funktioniert das Ganze. Eben nur mit einem Taster1
(PINB0) und einer LED (PINC0).
Wenn ich aber den Code, so wie er oben ist abrabeiten lasse, dann
funktioniert die Sache mit Taster2 (PINB1) und LED (PINC1) aber der
Taster1 funktioniert nicht mehr.
Wenn ich die Zeile 50 aktiv mache, dann funktioniert kein Taster mehr.
Laut Simulation springt der Controller immer zwischen den Zeilen 42 und
59. Es scheint ihn nicht zu interessieren, dass sich sig0 bzw. sig1
geändert haben.
Ich hoffe, es kann mir jemand helfen. Ich sitze bereits seit gestern
dran und finde einfach den Fehler nicht.
Danke im Voraus.
_______________
Tue deinem Körper etwas Gutes, damit die Seele Lust hat darin zu wohnen
!