Jep.
Meiner Meinung nach war die Einführung von PIND0, PB0, PB2 und wie sie
alle heissen keine gute Idee.
Man hätte ein einziges BIT0, BIT1, ... oder meinetwegen auch BIT_0
(wegen der Lesbarkeit) machen sollten und gut wärs gewesen.
if( PIND & (1<<BIT_0) ) // ist Bit 0 am PIND gesetzt
ist IMHO genausogut lesbar (wenn nicht sogar besser) und es würde diese
Verwechslungen nicht geben bzw. die Anpass'fehler' würden gleich gar
nicht gemacht werden
if( PIND & (1<<PD0) )
if( PIND & (1<<PB0) )
if( PIND & (1<<PIND0) )
id( PIND & (1<<PINB0) )
ist alles dasselbe, weil alle Makros PD0, PB0, PIND0, PINB0 (und
natürlich auch alle anderen) auf dieselbe 0 expandieren.
Ein bischen relativiert sich das ganze, weil du ein einem realen
Programm die Portnamen bzw. Bitnummern nicht direkt in den Code
reinschreiben sollst, sondern dir dafür Makros machst.
1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 |
|
4 | #define LED_PORT PORTB
|
5 | #define LED_DDR DDRB
|
6 | #deinfe ERROR_LED PB0
|
7 |
|
8 | uint8_t before;
|
9 |
|
10 | void main(void){
|
11 | LED_DDR |= ( 1 << ERROR_LED );
|
12 | DDRD = 0x00;
|
13 |
|
14 | before = PIND & (1<<PIND0);
|
15 | while(1) {
|
16 | if((PIND & (1<<PIND0)) != before)
|
17 | LED_PORT &= ( 1 << ERROR_LED );
|
18 | }
|
19 | }
|
(und natürlich für PIND bzw. das was an diesem Pin hängt, dasselbe. Dann
halt irgendwas mit einer Taste, einem KEY)
Das kommt dann auch der Programmdokumentation zu Gute. Denn bei
LED_PORT &= ( 1 << ERROR_LED );
brauch ich dann eben keinen Kommentar mehr, der mir sagt, dass hier die
'Fehler' Led eingeschaltet wird. Das steht dann schon im Quelltext
selber. Und das ist allemal besser, als ein Kommentar der im schlimmsten
Fall falsch ist.