Forum: Compiler & IDEs uint32_t zähler und vergleiche


von Jürgen S. (jsachs)


Lesenswert?

Hallo,

bin eben beim testen darüber gestolpert, dass folgendes nicht ging 
(teilcode):
1
int main()
2
{
3
uint32_t count=0;
4
5
while(1)
6
{
7
  count++;
8
  if (count > 0x3ffff)
9
  {
10
    //tue was
11
    //toggle LED
12
    count=0;
13
  }
14
  // tue was anderes
15
}
16
}

ich hatte in der if eine LED die getoggelt wurde, diese ging nicht mehr 
ab einem Wertebereich von 0xffff.
Nur wieso ?

Ich habe das im Moment in 2 uint16_t Zähler gesplittet und es geht 
prima, nur wieso ging es nicht mit dem uint32_t ?

Bevor der Hinweis kommt. Interrupt gehen keine mehr, da ich per Software 
PWM Servoimpulse erzeuge, daher will ich es über solche Zähler lösen und 
unkritische Teile in main machen.

von 2ter Gast (Gast)


Lesenswert?

Jürgen Sachs schrieb:
> Ich habe das im Moment in 2 uint16_t Zähler gesplittet und es geht
> prima, nur wieso ging es nicht mit dem uint32_t ?

Wie sieht der Code denn aus? So kann man doch nur raten...

von Jürgen S. (jsachs)


Lesenswert?

Die Frage verstehe ich nicht.
Das IST der Code.

Es fehlt nur das Setup des Ports
DDRB=0xff;

und das blinken der LED
PORTB^=_BV(PB0)

Ich habe diesen Code nicht mehr, da es nur zu Testzwecken war, und ich 
schon VIEL weiter bin. Mich interessiert das WARUM.

Wie gesagt, nachdem ich den uint32 durch 2 uint16 ersetzt habe, ging 
alles
1
int main()
2
{
3
uint16_t count1=0;
4
uint16_t count2=0;
5
6
while(1)
7
{
8
  count1++;
9
  if (count1 > 0xfe)
10
  {
11
    count1=0;
12
    count2++;
13
  }
14
15
  if (count2 > 0x07)
16
  {
17
    //tue was
18
    //toggle LED
19
    count2=0;
20
    count1=0;
21
  }
22
  // tue was anderes
23
}
24
}

Ich nehme daher an das hat was mit dem 32 Bit Datentyp zu tun. Nun habe 
ich gehofft, das die Wissenden eine Erklärung haben.

von Helfer (Gast)


Lesenswert?

Der Code aus Beitrag "uint32_t zähler und vergleiche" kann 
von einem "agressiven" Optimierer komplett ersetzt werden durch diesen 
funktionsidentischen Code
1
int main(void)
2
{
3
  while(1) {}
4
}

Wenn du allerdings die Portschalterei hinzunimmst, kann der Optimierer 
das nicht mehr so vereinfachen. Deshalb ist die Frage nach dem exakten 
Code wichtig.

Hast du schon die Variante getestet, bei der die beiden Argumente des 
Vergleichs vom gleichen Datentyp sind?
1
int main()
2
{
3
  uint32_t count = 0;
4
5
  while(1)
6
  {
7
    count++;
8
    //                 vv
9
    if (count > 0x3ffffUL)
10
    {
11
      //tue was
12
      //toggle LED
13
      count = 0;
14
    }
15
    // tue was anderes
16
  }
17
}

von 2ter Gast (Gast)


Lesenswert?

Jürgen Sachs schrieb:
> Die Frage verstehe ich nicht.
> Das IST der Code.

So wie dein Code aussieht, toggelt da nichts.

Jürgen Sachs schrieb:
> Ich nehme daher an das hat was mit dem 32 Bit Datentyp zu tun. Nun habe
> ich gehofft, das die Wissenden eine Erklärung haben.
Nein. Es sei denn, der Compiler ist defekt. Es ist ein leichtes für dich 
das Programm mit dem Simulator zu prüfen.

von Karl H. (kbuchegg)


Lesenswert?

Jürgen Sachs schrieb:

> ich gehofft, das die Wissenden eine Erklärung haben.

Es gibt keine spezielle.
Du hast irgendwo einen Fehler gemacht, denn du im Urpsrungsposting nicht 
gezeigt hast. Aus dem was du gezeigt hast, lässt sich kein Fehlerfall 
ablesen. Es gibt keinen Grund, warum der Zähler bei 32 Bit nicht zählen 
sollte.

von Jürgen S. (jsachs)


Lesenswert?

Simulierer kann ich nicht. Ich arbeite unter Linux und da ist das etwas 
"kompliziert". Ich habe es jedenfalls noch nicht hin bekommen..

Ich habe nochmal versucht das nach zustellen. Da ich den Ursprungscode 
nicht mehr habe, durch neu programmieren.
1
#include <avr/io.h>
2
3
int main()
4
{
5
  uint32_t cnt = 0;
6
  DDRC = 0xFF;
7
  while(1)
8
  {
9
    cnt++;
10
    if (cnt > 0x3fffe)
11
    {
12
      PORTC ^= _BV(PC7);
13
      
14
      cnt = 0;
15
    }
16
  }
17
}

Und es tut wie erwartet.
Das Fuchst mich jetzt richtig. Über eine Stunde verbraten und dann aus 
Verzweiflung in unit16 geändert und tut.
Das nächste mal mache ich ein commit ins svn bevor ich das verändere.
Eventuell liegt es auch an der anderen Hardware (schnellerer Takt). Ich 
bin am grübeln ob ich die Zeit für das Zählen nicht unterschätzt habe 
(Ungeduld)

Ich danke Euch soweit.

Sorry
Juergen

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.