Hallo Ich arbeite mich gerade in C ein. Ich habe an einem Me8 an PORTD 8 LED angeschlossen, die als Lauflicht laufen sollen. Mit for (char i = 0; i< 8; i++){ PORTD = (1 << i);} Lasse ich die LED hoch laufen. Funzt auch Prima, nur bei for (char i = 8; i> 0; i--){ PORTD = (1 << i);} , läuft er zwar runter aber die erste LED (also Zustand 1) wird nicht mehr angesteuert??? Verläßt er schon vorher die Schleife? Gruss Frank
ich quäl mich auch grad mit C rum :) aber ev hilfts ja schon... so wie ich das verstehe setzt du i=8 aber den Pin PORTD.8 gibt es ja nicht... meiner Meinung nach müsstest du i mit 7 laden. und die Schleife verlässt er solang sobald i nicht mehr grösser als 0 ist... da 0 nicht grösser als 0 ist wird PORTD.0 nicht mehr erreicht... greetz
@Thomas: und das funktiniert? in deinen Beispielen beginnt die Schleife mit i=8... aber durch PORTD = (1 << i);} würde das nicht vorhandene 8. Bit doch gesetzt? greetz
1 | for (char i = 0; i< 8; i++) |
=> Port 0 bis 7
1 | for (char i = 8; i> 0; i--) |
=> Port 8 bis 1 Du musst
1 | for (char i = 7; i >= 0; i--) |
schreiben damit das geht.
Hallo Danke für die schnellen Antworten. Ich habe es mal abgeändert. Jetzt kriege ich diese Warnung: main.c:75: warning: comparison is always true due to limited range of data type Er zählt jetzt zwar bis 1 runter, bleibt da aber hängen?? Frank
eben nicht als uint8_t sondern als int8_t -- der unsigned Typ wird ja nicht negativ und bleibt immer >=0 ;) Aber evtl. geht's auch so:
1 | int8_t i; |
2 | uint8_t leds = 0x01; //Startmuster |
3 | for(i=0; i< 8; i++){ |
4 | leds <<= 1; |
5 | // und die andere Richtung:
|
6 | // leds >>= 1;
|
7 | PORTX = leds; |
8 | }
|
Aber das "rotiert" noch nicht hth. Jörg
Hallo Habe es jetzt so gemacht. for (char i = 7; i>= 1; i--){ PORTD = (1 << i);} Damit läufts komischerweise?! Frank
> Damit läufts komischerweise[...] bis zur "letzten" LED (bei 1<<0) ? oder nur die an Pin 7 bis 1 ;) scnr Jörg
Ne, muss meine Aussage zurück nehemen. Da ich in einer Endlosschleife hoch und runter zähle geht die erste LED natürlich an beim hochzählen, aber nicht beim runterzählen. Also so gehts auch nicht. Aber es fällt nicht auf. Frank
Hallo Wenn ich i als int deklariere geht es. Aber warum? Int hat doch nur ein grösseren Wertebereich? Char geht doch aber auch bis 0, oder??? Kann mir das mal einer erklären? Danke im voraus! Frank
oups, der Teil aus meinem Beispiel mit der anderen Richtung sollte eher gar nicht gehen (außer mit einem anderen Startmuster, z.B. 0x80). Wenn das Muster "rundherum" laufen soll, brauchst du sowas:
1 | uin8_t leds = 0x05; |
2 | int8_t i; |
3 | for(i=0; i < 8; i++){ |
4 | // die rausgeschobenen bits wieder reinnehmen:
|
5 | leds = (leds >> 1) | (leds << 7); |
6 | // andere Richtung, aber wirklich ;)
|
7 | //leds = (leds << 1) | (leds >> 7);
|
8 | }
|
Ein Timer-Interrupt ist natürlich viel besser als die for-Schleife, wenn man die Bewegungen des Musters sehen will. >>Char geht doch aber auch bis 0 hängt vom compiler ab normalerweise sind chars mit Vorzeichen, lässt sich beim GCC mit "-funsigned-char", oder beim AVR-Studio in den Projektoptionen abschalten. hth. Jörg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.