Ich denke nicht, dass das hier
> inline void Schiebe_1Bit(){
>
> SHIFTPort |= (BIT << SI);
das macht, was du willst.
if( BIT )
SHIFTPort |= ( 1 << SI );
else
SHIFTPort &= ~( 1 << SI );
Und an dieser Stelle darf das auszugebende Bit ruhig Funktionsargument
sein und muss keine globale Variable sein. Die Aufrufe der Funktion und
ob da jetzt eine 1 oder eine 0 ausgegeben werden soll, wird dann um
einiges klarer
1 | inline void Schiebe_1Bit( uint8_t Bit ){
|
2 |
|
3 | if( Bit )
|
4 | SHIFTPort |= ( 1 << SI );
|
5 | else
|
6 | SHIFTPort &= ~( 1 << SI );
|
7 |
|
8 | _delay_ms(MAX_DELAY);
|
9 |
|
10 | SHIFTPort &= ~(1 << SCK);
|
11 | _delay_ms(MAX_DELAY);
|
12 | SHIFTPort |= (1 << SCK);
|
13 | _delay_ms(MAX_DELAY);
|
14 | }
|
Die Aufrufe sehen dann so aus:
1 | while(1)
|
2 | {
|
3 | Schiebe_1Bit( 1 );
|
4 | Schiebe_1Bit( 1 );
|
5 | Schiebe_1Bit( 0 );
|
6 | Schiebe_1Bit( 1 );
|
7 | Schiebe_1Bit( 0 );
|
8 | Schiebe_1Bit( 1 );
|
9 | Schiebe_1Bit( 0 );
|
10 |
|
11 | ...
|
und du musst in Gedanken nicht mehr mitverfolgen, wie jetzt gerade BIT
steht um zu wissen, ob da jetzt ein 1 Bit oder ein 0 Bit ausgegeben
wird.
PS: Beim RCK musst du natürlich das 0-setzen auch ändern.