www.mikrocontroller.net

Forum: Compiler & IDEs For-Schleife ärgert mich ...


Autor: Mario Richter (mario001) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

mich ärgert hier gerade eine For-Schleife ... Eigentlich dachte ich,
ich wüsste inzwischen, wie man damit umgeht, aber offenbar doch nicht.


Also, mein Programm sieht im Prinzip folgendermaßen aus:
PORTC &= (1<<PC0);  // Initialisierung (am Programmstart)

unsigned int i;

for(i = 0; i < 8192; i++)
{
    PORTC |= (1<<PCO);

    if(i == 0)
         [.. mach was ..]
    if(i == 2048)
         [.. mach was anderes ..]

    PORTC &= ~(1<<PC0);
}

(Im Anhang das vollständige Programm, die For-Schleife findet sich in
der Routine DirectReadout.)

Eigentlich müsste man doch davon ausgehen können, dass die Routine
exakt 8192-mal ausgeführt wird, oder ? Hänge ich aber einen
Frequenzzähler an PC0, kann ich genau 8191 positive Flanken messen -
also eine weniger !

Bin langsam echt am Durchdrehen hier ...

Grüße, Mario

Autor: T. Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach mal vor die for-schleife ein

PORTC &= ~(1<<PC0);

es könnte ja sein, das das Bit PC0 schon gesetzt ist => dadurch KEINE
Flanke => 8191

oder lass den Frequenzzähler auf neg.Flanke

die for schleife muß 8192 mal durchlaufen werden (außer du springs aus
der schleife raus)

Gruss

Autor: Mario Richter (mario001) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für den Tip, hat aber leider nichts gebracht :-( Es sind immer
noch nur 8191 Takte. Ich werd das ganze wohl doch mal einzeln
durchsteppen müssen und sehen, was passiert ...

Grüße, Mario

Autor: Thomas Pototschnig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du dich da verschrieben?
PORTC &= (1<<PC0);

Sollte es nicht entweder
PORTC &= ~(1<<PC0);
oder
PORTC |= (1<<PC0);

heißen?

Autor: müllo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simuliere doch erstmal mit weniger Schleife und schaust dann, ob immer
noch eine Flanke fehlt. (-> ist leichter durchzusteppen!!!)

Viele Grüße
müllo

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prüfe mal, ob der Pin am Eingang deiner for-Schleife schon auf 1 liegt,
evtl. im Programablauf. Oder, vor der Schleife löschen, damit definitiv
der erste Durchlauf einen Takt erzeugt.

MW

Autor: Mario Richter (mario001) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ihr kommt im Leben nicht drauf, was der Fehler war !

Es handelt sich um einen BUG IN DER SOFTWARE DES FREQUENZZÄHLERS !!
Wenn man ihn auf Impulsmessung schaltet und zurücksetzt, dann
verschluckt er den ersten eintreffenden Impuls ...

Ich habe jetzt mal meine For-Schleife zwei Durchläufe machen lassen,
nach dem ersten hatte ich 8191 im Display, nach dem zweiten 16383 (=
8191 + 8192). Den endgültigen Beweis hat mir dann das Oszi geliefert,
ich hab die Schleife auf 5 runtergeschraubt und hatte bei jedem
Durchlauf 5 wunderschöne Impulse auf dem Schirm, auf dem Zähler aber
erst den Wert 4, dann den Wert 9, 14, 19 ...

Grüße und Danke nochmals für Eure Tips und Hilfen,

Mario

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.