Forum: Mikrocontroller und Digitale Elektronik Lauflicht Schleife


von Frank (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

ja.

entweder:
for (char i = 8; i>= 0; i--)

oder:
for (char i = 9; i> 0; --i)

von Danny P. (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Vergiss meine Vorschläge. Hatte nen Denkfehler...

von Danny P. (Gast)


Lesenswert?

@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

von Thomas (Gast)


Lesenswert?

Bin grad erst aufgestanden. Bitte einfach ignorieren...

von Danny P. (Gast)


Lesenswert?

mh, evt so?

for (char i = 7; i>= 0; i--){


greetz

von L. R. (badinode)


Lesenswert?

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.

von Danny P. (Gast)


Lesenswert?

sehr schön... 4 Sekundne schneller gewesen :D

von Frank (Gast)


Lesenswert?

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

von Danny P. (Gast)


Lesenswert?

und wenn du i mal als uint_8 initialisierst?

von Jörg X. (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

Hallo

Habe es jetzt so gemacht.
for (char i = 7; i>= 1; i--){

PORTD = (1 << i);}
Damit läufts komischerweise?!
Frank

von Jörg X. (Gast)


Lesenswert?

> Damit läufts komischerweise[...]
bis zur "letzten" LED (bei 1<<0) ?
oder nur die an Pin 7 bis 1 ;)

scnr Jörg

von Frank (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

@Jörg X
Mit deinem Code Beispiel laufen die LED immer hoch, egal ob ichh >> oder 
<< nehme?!
Frank

von Frank (Gast)


Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.