Karl Heinz schrieb:
> Robert A. schrieb:
>
>> Das ist wohl die bescheurteste Zustandsabfrage der IO Pins am MCP23008
>> wenn diese als Augang konsifguriert worden sind?!
>>
>> Geht es auch eleganter?
>
> Wenn sie als Ausgang konfiguriert sind, dann haben sie ja wohl die
> Werte, die du als letztes an die Ausgänge geschrieben hast (ausser du
> hast ein elektrisches Problem). Merk dir, was du zuletzt ausgegeben hast
> und du brauchst den MCP nicht befragen.
Falls du allerdings 'Eingang' anstatt 'Ausgang' meintest.
Was spricht dagegen, das ganze mit ein bischen Makromagie verschwinden
zu lassen? Zumal:
1 | uint8_t regvalue = mcp23008_reg_read(TASTER_I2C_DEVICE,MCP23008_GPIO);
|
2 | i2c_stop();
|
3 | show_value(regvalue);
|
was macht der i2c_stop da?
Warum macht den der reg_read nicht automatisch?
Persönlich halte ich nicht viel davon, im Funktionsnamen die
Bauteilbezeichnung einzubringen. Denn das hilft mir als aussenstehender
nicht wirklich weiter. Was mir aber weiter hilft, das ist wenn ich zb
weiss, dass in diesem Baustein zb die Konfigurationsschalter sitzen.
Warum dann nicht
1 | #define KONFIG_KEYS mcp23008_reg_read(TASTER_I2C_DEVICE,MCP23008_GPIO)
|
2 |
|
3 | ....
|
4 |
|
5 |
|
6 | while( 1 ) {
|
7 | _delay_ms(100);
|
8 | lcd_command(LCD_CLEAR);
|
9 |
|
10 | show_value( KONFIG_KEYS );
|
11 | }
|
über den LCD_CLEAR kann man geteilter Meinung sein, aber abgesehen davon
ist das so unelegant dann auch wieder nicht.
Oder man definiert sich eine Funktion, die die Aufrufargumente vom MCP
ergänzt
1 | uint8_t ConfigKeys()
|
2 | {
|
3 | return mcp23008_reg_read(TASTER_I2C_DEVICE, MCP23008_GPIO);
|
4 | }
|
5 |
|
6 | ....
|
7 |
|
8 | while( 1 ) {
|
9 | _delay_ms(100);
|
10 | lcd_command(LCD_CLEAR);
|
11 |
|
12 | show_value( ConfigKeys() );
|
13 | }
|
Eleganz liegt im Auge des Betrachters. In der Programmierung besteht
Eleganz des öfteren darin, den Code so gut lesbar wie möglich zu machen.
Erreicht wird das dadurch, dass man Details an anderen Stellen
'versteckt'. Mich interessiert nicht, wie die Config Keys abgefragt
werden, welches Device dazu zuständig ist. Ich ruf einfach die Funktion
auf und die Funktion weiss über die Details Bescheid.
Damit ist
1 | show_value( ConfigKeys() );
|
die 'eleganteste' Methode, um die Werte von den Dip-Switches auszulesen
und anzuzeigen. Wenn mir die Darstellung nicht gefällt, dann ist
'show_value()' dafür zuständig; wenn die Dip-Switches 'umziehen' dann
ist ConfigKeys() dafür zuständig. Saubere Arbeitstrennung und bei
Veränderungen leicht anpassbar.