www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lauflicht Schleife


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja.

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

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

Autor: Danny P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss meine Vorschläge. Hatte nen Denkfehler...

Autor: Danny P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin grad erst aufgestanden. Bitte einfach ignorieren...

Autor: Danny P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh, evt so?

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


greetz

Autor: L. R. (badinode)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for (char i = 0; i< 8; i++)
=> Port 0 bis 7
for (char i = 8; i> 0; i--)
=> Port 8 bis 1

Du musst
for (char i = 7; i >= 0; i--)

schreiben damit das geht.

Autor: Danny P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehr schön... 4 Sekundne schneller gewesen :D

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Danny P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn du i mal als uint_8 initialisierst?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int8_t i;
uint8_t leds = 0x01; //Startmuster
for(i=0; i< 8; i++){
  leds <<= 1;
  // und die andere Richtung:
  // leds >>= 1;
  PORTX = leds;
  }
Aber das "rotiert" noch nicht

hth. Jörg

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

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

Autor: Jörg X. (Gast)
Datum:

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

scnr Jörg

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uin8_t leds = 0x05;
int8_t i;
for(i=0; i < 8; i++){
  // die rausgeschobenen bits wieder reinnehmen:
  leds = (leds >> 1) | (leds << 7);
  // andere Richtung, aber wirklich ;)
  //leds = (leds << 1) | (leds >> 7);
  }
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.