Ich möchte an meinem STK500 ein Lauflicht programmieren welches ausgelöst wird wenn man den switch2 drückt. Es soll aus 3 zusammenhängenden Lichtern bestehen die im Abstand von 2 ausgeschalteten Lichtern mehrmals durch die 8 LED`s laufen. um die ausgeschalteten Lichter zu erzeugen benutze ich den bitweisen NOT Operator da man mit dem shift Operator nur so verschieben kann das eine 0 ergänzt wird ich brauche aber eine 1: 0b01110000 mit shift Operator um 1 verschieben = 0b00111000 Um eine 1 zu bekommen ende ich also zuerst den NOT Operator an: 0b01110000 mit NOT Operator invertieren: = 0b10001111 und dann verschieben = 0b01000111 dann wieder mit NOT invertieren = 0b10111000 Jetzt sollte ich eigentlich eine 1 ergänzt haben Pustekuchen.Es kommt trozdem eine 0. (Heißt die LED`s bleiben nach der ersten Pause alle an und es entsteht kein Lauflicht => So sieht es aus 0b11111100 und so sollte es aussehen 0b10001100) Hier noch der Code (Vorderer Teil fehlt ( Variablen include usw.)
1 | if(PIND == 0b11111011){ // Wenn SW2 (der mit PIND verbunden ist) gedrückt wird startet der code. |
2 | x=0; //Falls der Code schonmal aktiviert wurde x resetten |
3 | PORTB = 0b01111111; //Bis sich das Muster der Lichter wiederholen soll die bit´s einzeln bestimmen. |
4 | _delay_ms(100); //"" |
5 | PORTB = 0b00111111; //"" |
6 | _delay_ms(100); //"" |
7 | PORTB = 0b00011111; //"" |
8 | _delay_ms(100); //"" |
9 | PORTB = 0b10001111; //"" |
10 | _delay_ms(100); //"" |
11 | PORTB = 0b11000111; //"" |
12 | _delay_ms(100); //"" |
13 | while(x<3) //Die nächsten 3 Lampen sollten an sein.Funktioniert auch. |
14 | { //PORTB ist jetzt = 0b00011000 |
15 | x=x+1; //Damit die Schleife 3 mal ausgeführt wird x in jedem durchlauf erhöhen |
16 | xa = 3; |
17 | xm = 2; |
18 | |
19 | while(xa > 0) //Die nächsten 3 Lampen sollten an sein.Funktioniert auch. |
20 | {
|
21 | PORTB = (PORTB >> 1);//die Bits bei PORTB bei jedem Durchlauf 1 nach rechts verschieben |
22 | xa = xa-1; |
23 | _delay_ms(100); |
24 | } //PORTB ist jetzt = 0b00011000 |
25 | |
26 | while(xm > 0) //Die nächsten 2 Lampen sollen aus bleiben also kann ich nicht einfach den shift Operator nehmen |
27 | { //denn der würde 0 ergänzen aber ich brauch eine 1. Also drehe ich den Wert in PORTB mit |
28 | b = PORTB; //dem NOT ( ~ ) Operator verschiebe ihn dann und drehe wieder zurück.Das Resultat davon ist, |
29 | b = ~b; //dass nicht eine 0 sondern eine 1 links ergänzt wird, der Rest des Wertes aber gleich bleibt. |
30 | a = (b >> 1); //So sollte es sein.In Wirklichkeit steht in PORTB dann aber 0b00000110. |
31 | a = ~a; |
32 | PORTB = a; |
33 | xm = xm-1; |
34 | _delay_ms(100); |
35 | }
|
36 | |
37 | }
|
38 | }//if |
39 | }//while(1) |
40 | }//main |
Mfg Mangosniper