Irgendwie komme ich nichtmehr weiter ...
Es geht um ein Unterprogramm, welches einen Wert übergeben bekommt und
die Bits 11 - 0 ausließt, je nachdem ob 0 oder 1 einen PortPin setzt und
dann einmal SCLK toogled.
Wenn ich
1 | PORTD|= 1<<SIN;
|
2 | for(int i=0; i<=11; i++) {
|
3 | tSCLK();
|
4 | }
|
mache geht alles.
Wenn ich
1 | //PORTD|= 1<<SIN;
|
2 | int i;
|
3 | for(i=0; i<=11; i++) {
|
4 | if((GS&0x800)) {
|
5 | PORTD|= 1<<SIN;
|
6 | } else {
|
7 | //PORTD&= ~(1<<SIN);
|
8 | PORTD|= 1<<SIN;
|
9 | }
|
10 | tSCLK();
|
11 | GS<= 1;
|
12 | //GS*= 2;
|
13 | }
|
sollte eig. nichts anderes passieren können, aber ich bekomme nur Mist
raus (der SIN wird zeitweise auf 0 geschaltet.
Aus dem erstellten Code werde ich auch nicht ganz schlau weil da
irgendwie ganze Teile fehlen.
Das Programm läuft weder mit wie auch ohne Optimierung.
1 | 0000012c <GSData>:
|
2 |
|
3 | void GSData(volatile int GS) {
|
4 | 12c: df 93 push r29
|
5 | 12e: cf 93 push r28
|
6 | 130: 00 d0 rcall .+0 ; 0x132 <GSData+0x6>
|
7 | 132: cd b7 in r28, 0x3d ; 61
|
8 | 134: de b7 in r29, 0x3e ; 62
|
9 | 136: 9a 83 std Y+2, r25 ; 0x02
|
10 | 138: 89 83 std Y+1, r24 ; 0x01
|
11 | 13a: 20 e0 ldi r18, 0x00 ; 0
|
12 | 13c: 30 e0 ldi r19, 0x00 ; 0
|
13 | }
|
14 | }
|
15 | */
|
16 | int i;
|
17 | for(i=0; i<=11; i++) {
|
18 | if((GS&0x800)) {
|
19 | 13e: 89 81 ldd r24, Y+1 ; 0x01
|
20 | 140: 9a 81 ldd r25, Y+2 ; 0x02
|
21 | 142: 93 ff sbrs r25, 3
|
22 | 144: 02 c0 rjmp .+4 ; 0x14a <GSData+0x1e>
|
23 | PORTD|= 1<<SIN;
|
24 | 146: 91 9a sbi 0x12, 1 ; 18
|
25 | 148: 01 c0 rjmp .+2 ; 0x14c <GSData+0x20>
|
26 | } else {
|
27 | PORTD&= ~(1<<SIN);
|
28 | 14a: 91 98 cbi 0x12, 1 ; 18
|
29 | }
|
30 | tXLAT();
|
31 | }
|
Vielleicht sieht hier ja irgendwer direkt irgendeinen groben Fehler...
Google habe ich bemüht und die Forensuche auch.
*Info: Bei GS<= 1; meldet er das der berechnete Wert nicht verwendet
wird, obwohl er doch beim nächsten Schleifendurchlauf wieder verglichen
werden sollte.
volatile bringt keine besserungen.
Desweiteren verstehe ich auch nicht wie er auf die Idee kommt obwohl
nirgends im Code steht er solle den Pin auf Low setzen dieser auf Low
gesetzt wird.
Die Info das der Teil nicht funktioniert habe ich nicht nachgemessen,
sehe ich auf der angeschlossenen Hardware da nicht alle LED`s
gleichmäßig aufleuchten, sondern teilweise gedimmt sind (Wert < 4095).