For Anweisung

OP Persönliche Seite #1637641
Lesenswert?

Hallo,
ich stehe i.M. vor einem total trivialem Problem und denke mir nur "wtf" 
ist der Fehler? Ich möchte in einer For Schleife ein Register einmal von 
0 bis 255 rauf und danach in einer zweiten For Schleife wieder herunter 
zählen mit einer gewissen Zeitschleife, das habe ich mir so gedacht:
1
for(CCPR1L=0; CCPR1L=255; CCPR1L++)
2
{
3
  Delay10KTCY(1);             
4
}  
5

6
for(CCPR1L=255; CCPR1L=0; CCPR1L--)
7
{
8
  Delay10KTCYx(1);
9
}

Aber er will nicht, wie ich will. Kann man in einer (For)-Schleife keine 
Register eines Mikrocontrollers beschreiben sondern nur einfache 
Variablen oder wo liegt der Fehler in meinem Konstrukt? Ich danke schon 
mal im voraus!

Ich verwende einen 4Mhz Quarz und daher sollte ich die Veränderung
auch bemerken, denn das CCPR1L Register ändert das Tastverhältnis der 
PWM.
Wenn ich das Register "zu Fuß" ändere mit einfachem beschreiben klappt 
es wunderbar..

LG Nico
Gast #1637662
Lesenswert?

Du hast gleich zwei Fehler gemacht.

1. Die Bedingung in einer For-Schleife, zwischen den beiden Semikola, 
muss wahr sein, damit die Schleife durchlaufen werden kann. Anders 
ausgedrückt, wird die Schleife nur dann (und wiederholt) durchlaufen, 
wenn und solange die Bedingung wahr ist.

2. Du hast die Bedingung als Zuweisung formuliert. Ein Test auf 
Gleichheit geht mit "==". Der Wert einer Zuweisung ist derjenige auf der 
rechten Seite.
Die erste Schleife wird wegen der Konvention das alles ungleich 0 gleich 
wahr ist, endlos durchlaufen. Die zweite daher nie erreicht. Falls aber 
die zweite erreicht würde, wird sie nie durchlaufen, da per Konvention 
der Wert Null als "falsch" aufgefasst wird.

Nicolas M. schrieb:
> Aber er will nicht, wie ich will.

ist leider keine sehr analytische Fehlerbeschreibung. Das nächstemal 
(das wird wegen des vermutlich falschen Typs von CCPR1L recht bald sein) 
beschreibe bitte das fehlerhafte/unerwünschte Verhalten genau.
OP Persönliche Seite #1637685
Lesenswert?

Hallo, vielen dank schon mal!
Also das mit der Abbruchbedingung "==" ja gut das ist klar jetzt wo Ihr 
es sagt.. natürlich das wären dann wohl die berühmten Tomaten.

Okay mal den Code geändert und so eingefügt:

[c]
for(CCPR1L=0; CCPR1L==255; CCPR1L++)
{
  Delay10KTCY(1);
}

for(CCPR1L=255; CCPR1L==0; CCPR1L--)
{
  Delay10KTCYx(1);
}
[c/]

Bringt er immer noch keinen Erfolg.

@ "Grrrr":
Ich fürchte ich verstehe nicht ganz was du meinst.. Sry..
Also der Fehler ist nach wie vor der selbe, bzw. das Fehlverhalten:

Die LED/PWM hat die ganze Zeit die selber Helligkeit.
Wahrscheinlich wegen des Fehlers, den Grrr beschrieben hat.

Aber was ist denn nun noch falsch ich sage doch in der 1. Schleife,
dass die Startbedingung CCPR1L=255 ist, also wird so gestartet und 
solange inkrementiert bis CCPR1L gleich 255 ist oder nicht?
Gast #1637700
Lesenswert?

Nicolas M. schrieb:
> @ "Grrrr":
> Ich fürchte ich verstehe nicht ganz was du meinst.. Sry..
> Also der Fehler ist nach wie vor der selbe, bzw. das Fehlverhalten:

Der selbe Fehler wie welcher? Du solltest den Fehler beschreiben. Woran 
merkst das der uC nicht das macht was Du willst?

Nicolas M. schrieb:
> Aber was ist denn nun noch falsch ich sage doch in der 1. Schleife,
> dass die Startbedingung CCPR1L=255 ist, also wird so gestartet und
> solange inkrementiert bis CCPR1L gleich 255 ist oder nicht?

Nein. Das ist nicht die "Startbedingung" zwischen den Semikola. In 
Deiner Diktion ist das die "Laufbedingung". Lass Dir nochmal das

Grrrr schrieb:
> 1. Die Bedingung in einer For-Schleife, zwischen den beiden Semikola,
> muss wahr sein, damit die Schleife durchlaufen werden kann. Anders
> ausgedrückt, wird die Schleife nur dann (und wiederholt) durchlaufen,
> wenn und solange die Bedingung wahr ist.

auf der Zuunge zergehen. Langsam. Wie ein Stück Schokolade.
;-)

Und besorg Dir ein C-Buch.
#1637703
Lesenswert?

Michael Buesch schrieb:
> Dennis E. schrieb:
>> Stimmt, sorry! "<=" wärs gewesen
>
> Dann ists eine Endlosschleife.

Nur nochmal dazu:

Beim 8-Biter isses ne Endlosschleife, beim 16-Biter ist die Bedingung ja 
bei 256 nicht mehr erfüllt....oder habe ich heute garkein Gehirnschmalz 
mehr?!
Gast #1637707
Lesenswert?

Nicolas M. schrieb:
> for(CCPR1L=0; CCPR1L<255; CCPR1L++)

Nicolas M. schrieb:
> Also so funktioniert es! Aber wo ist der unterschied zu:

Nicolas M. schrieb:
> for(CCPR1L=0; CCPR1L==255; CCPR1L++)

Das habe ich Dir jetzt schon zweimal geschrieben. Lies es.
#1637712
Lesenswert?

Man kann in der "aufsteigenden for-Schleife" von 0 bis 254 gehen, und in 
der "absteigenden for-Schleife" von 255 bis 1:
1
#include <stdio.h>
2

3
int main()
4
{
5
  unsigned char a;
6
  for(a=0; a<255; a++)
7
  {
8
    printf("%d ", a);
9
  }
10
  printf("\n");
11
  for(a=255; a>0; a--)
12
  {
13
    printf("%d ", a);
14
  }
15
  return 0;
16
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren