Matze schrieb:
1 | switch(y)
|
2 | {
|
3 | case 0: PORTA |= (1 << PA0);
|
4 | case 1: PORTB |= (1 << PB0);
|
5 | (...)
|
Die "case"-Label sind Einsprungpunkte. Sie beenden nicht die
Codesequenz, die davor steht. Im Moment wird bei y == 0 jeder der Pins
gesetzt, bei y == 1 wird PB0 bis PD5 gesetzt, bei y == 2 PB1 bis PD5
(und so weiter).
Wenn du willst, dass bei y == 0 nur PA0 gesetzt wird, bei y == 1 nur
PB0 (usw.), musst du den switch jeweils über "break" verlassen:
1 | switch(y)
|
2 | {
|
3 | case 0: PORTA |= (1 << PA0); break;
|
4 | case 1: PORTB |= (1 << PB0); break;
|
5 | case 2: PORTB |= (1 << PB1); break;
|
6 | case 3: PORTB |= (1 << PB2); break;
|
7 | case 4: PORTB |= (1 << PB3); break;
|
8 | case 5: PORTB |= (1 << PB4); break;
|
9 | case 6: PORTD |= (1 << PD1); break;
|
10 | case 7: PORTD |= (1 << PD2); break;
|
11 | case 8: PORTD |= (1 << PD3); break;
|
12 | case 9: PORTD |= (1 << PD4); break;
|
13 | case 10: PORTD |= (1 << PD5); break;
|
14 | }
|
Tipp: Lies dir das Kapitel deines C-Buchs über Kontrollstrukturen besser
noch mal durch.
Außerdem kannst du alle Portbits eines Ports auf einmal zurück setzen:
1 | PORTA &= ~(1<<PA0);
|
2 | PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4));
|
3 | PORTD &= ~((1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5));
|
Da Portregister als volatile deklariert sind, darf der Compiler hier
nichts zusammenfassen. So hast du 10 read-modify-writeback-Operationen
statt der minimal möglichen 3.
Grüße
Stefan
Edit: Nur fürs Protokoll: Ja, beim letzen Label (case 10:) ist der Break
obsolet (das Ende des switch-Konstrukts ist eh erreicht). Schadet aber
auch nicht.