Forum: Mikrocontroller und Digitale Elektronik For Anweisung


von PIC N. (eigo) Benutzerseite


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

von Gerhard (Gast)


Lesenswert?

Hi

"CCPR1L=0"

ist eine Zuweisung und kein Vergleich/Bedingung.

Gerhard

von nümand (Gast)


Lesenswert?

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

for(CCPR1L=255; CCPR1L==0; CCPR1L--)
{
  Delay10KTCYx(1);
}

von LuXXuS 9. (aichn)


Lesenswert?

Nicolas M. schrieb:
> for(CCPR1L=0; CCPR1L=255; CCPR1L++)
> {
>   Delay10KTCY(1);
> }
>
> for(CCPR1L=255; CCPR1L=0; CCPR1L--)
> {
>   Delay10KTCYx(1);
> }

Jo!

mach mal: for (CCPR1L=0; CCPR1L==255; CCPR1L++)

von LuXXuS 9. (aichn)


Lesenswert?

Doppelt hält besser!

von Grrrr (Gast)


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.

von Gerhard (Gast)


Lesenswert?

Hi

for(CCPR1L=0; CCPR1L<255; CCPR1L++)
{
  Delay10KTCY(1);
}

for(CCPR1L=255; CCPR1L>0; CCPR1L--)
{
  Delay10KTCYx(1);
}

so schauts besser aus

Gerhard

von Michael B. (mb_)


Lesenswert?

Dennis E. schrieb:
> mach mal: for (CCPR1L=0; CCPR1L==255; CCPR1L++)

Nur wird die Schleife damit auch nicht ausgeführt.

!= ?

von LuXXuS 9. (aichn)


Lesenswert?

Stimmt, sorry! "<=" wärs gewesen

von PIC N. (eigo) Benutzerseite


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?

von Michael B. (mb_)


Lesenswert?

Dennis E. schrieb:
> Stimmt, sorry! "<=" wärs gewesen

Dann ists eine Endlosschleife.

von PIC N. (eigo) Benutzerseite


Lesenswert?

>255, wie soll dass den gehen bei 8 Bit?

von LuXXuS 9. (aichn)


Lesenswert?

Jajaja...heut sind die Kreise bei mir eckig! Hört nicht auf mich : ) Ich 
weiß von nichts! Zumindest heute nicht mehr - die Thematik mit dem Jonas 
heute hat mir den letzten Verstand geraubt.

von PIC N. (eigo) Benutzerseite


Lesenswert?

Sorry falsch gelesen.. Ai jai jai...

von Grrrr (Gast)


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.

von PIC N. (eigo) Benutzerseite


Lesenswert?

1
for(CCPR1L=0; CCPR1L<255; CCPR1L++)

Also so funktioniert es! Aber wo ist der unterschied zu:
1
for(CCPR1L=0; CCPR1L==255; CCPR1L++)

Btw. Danke Holger!

von LuXXuS 9. (aichn)


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?!

von LuXXuS 9. (aichn)


Lesenswert?

CCPR1L==255 wird nie wahr, weil du es mit '0' initialisierst.

von Grrrr (Gast)


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.

von PIC N. (eigo) Benutzerseite


Lesenswert?

Gut jetzt hab ich es! Vielen Dank!
Sorry hatte deinen letzten Beitrag zu spät gelesen..

von Grrrr (Gast)


Lesenswert?

Ufff.

von Mark B. (markbrandis)


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
}

von LuXXuS 9. (aichn)


Lesenswert?

Der geht rein und guckt und setzt das Register auf 0. Dann vergleicht er 
die Bedingung...ist die Zahl = 255 - ist sie nicht, also raus aus der 
Schleife.

Mit dem Vergleich auf < 255 kommt ein wahr raus und es geht weiter.

von LuXXuS 9. (aichn)


Lesenswert?

"Kommt rein und guckt und macht..." :-)

von PIC N. (eigo) Benutzerseite


Lesenswert?

Und am Ende wird 'n Schuh drauß =D

von Mark B. (markbrandis)


Lesenswert?

Außerdem: Falsches (Sub-)Forum ;-)

von P. S. (Gast)


Lesenswert?

Dennis E. schrieb:
> "Kommt rein und guckt und macht..." :-)

Wir hatten einen Professor, der hat so die gesammte Algorithmen & 
Datenstrukturen-Vorlesung bestritten.... :-/

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.