Lauflicht Schleife

Gast #616347
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
Gast #616354
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
Gast #616375
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
Gast #616381
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
Gast #616389
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
Gast #616404
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
Gast #616493
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.