mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik For Anweisung


Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
for(CCPR1L=0; CCPR1L=255; CCPR1L++)
{
  Delay10KTCY(1);             
}  

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

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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

"CCPR1L=0"

ist eine Zuweisung und kein Vergleich/Bedingung.

Gerhard

Autor: nümand (Gast)
Datum:

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

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

Autor: LuXXuS 909 (aichn)
Datum:

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

Autor: LuXXuS 909 (aichn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doppelt hält besser!

Autor: Grrrr (Gast)
Datum:

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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

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

so schauts besser aus

Gerhard

Autor: Michael Buesch (mb_)
Datum:

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

Nur wird die Schleife damit auch nicht ausgeführt.

!= ?

Autor: LuXXuS 909 (aichn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, sorry! "<=" wärs gewesen

Autor: PIC Nico (eigo) Benutzerseite
Datum:

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

Autor: Michael Buesch (mb_)
Datum:

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

Dann ists eine Endlosschleife.

Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>255, wie soll dass den gehen bei 8 Bit?

Autor: LuXXuS 909 (aichn)
Datum:

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

Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry falsch gelesen.. Ai jai jai...

Autor: Grrrr (Gast)
Datum:

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

Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for(CCPR1L=0; CCPR1L<255; CCPR1L++)

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

Btw. Danke Holger!

Autor: LuXXuS 909 (aichn)
Datum:

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

Autor: LuXXuS 909 (aichn)
Datum:

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

Autor: Grrrr (Gast)
Datum:

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

Autor: PIC Nico (eigo) Benutzerseite
Datum:

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

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ufff.

Autor: Mark Brandis (markbrandis)
Datum:

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

int main()
{
  unsigned char a;
  for(a=0; a<255; a++)
  {
    printf("%d ", a);
  }
  printf("\n");
  for(a=255; a>0; a--)
  {
    printf("%d ", a);
  }
  return 0;
}

Autor: LuXXuS 909 (aichn)
Datum:

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

Autor: LuXXuS 909 (aichn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Kommt rein und guckt und macht..." :-)

Autor: PIC Nico (eigo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und am Ende wird 'n Schuh drauß =D

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem: Falsches (Sub-)Forum ;-)

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis E. schrieb:
> "Kommt rein und guckt und macht..." :-)

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

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.