lightninglord schrieb:
>>PS: Du möchtest das variable Schieben der 1 mit j auf jeden Fall weg
>>haben. Die Operation ist nämlich ziemlich teuer und man kann sie ganz
>>leicht umgehen.
>
> Hätteste mir nen kleinen Tip, mein C ist etwas eingerostet.
Gesehen über die Schleife, was ergibt denn i<<j wenn sich j langsam von
0 bis 8 aufbaut.
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
Nun muss man das aber nicht über 1<<j jedesmal neu errechnen. Es gneügt
doch, wenn man sich vor der Schleife eine Maske mit einer 1 zurechtlegt
und diese Maske in jedem Schleifendurchlauf um 1 nach links schiebt.
1 | uint8_t mask = 0x01;
|
2 |
|
3 | digi_data[i] = 0;
|
4 | for( j = 0; j < 8; ++j ) {
|
5 | if( DIGI_PIN & ( 1<<DIGI_DA) )
|
6 | digi_data[i] |= mask;
|
7 |
|
8 | mask = mask << 1;
|
9 | }
|
und schon ist aus dem variablen Schieben ein konstantes Schieben um
jeweils 1 geworden. (Ganz abgesehen davon, dass das dann in Summe
weniger Schiebevorgänge sind :-)