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


von Mario R. (mario001) Benutzerseite


Angehängte Dateien:

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:
1
PORTC &= (1<<PC0);  // Initialisierung (am Programmstart)
2
3
unsigned int i;
4
5
for(i = 0; i < 8192; i++)
6
{
7
    PORTC |= (1<<PCO);
8
9
    if(i == 0)
10
         [.. mach was ..]
11
    if(i == 2048)
12
         [.. mach was anderes ..]
13
14
    PORTC &= ~(1<<PC0);
15
}

(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

von T. Stütz (Gast)


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

von Mario R. (mario001) Benutzerseite


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

von Thomas Pototschnig (Gast)


Lesenswert?

hast du dich da verschrieben?
PORTC &= (1<<PC0);

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

heißen?

von müllo (Gast)


Lesenswert?

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

Viele Grüße
müllo

von Michael Wilhelm (Gast)


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

von Mario R. (mario001) Benutzerseite


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

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.