uint32_t zähler und vergleiche

OP #2208783
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.
OP #2209309
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.
Gast #2209397
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
}
Gast #2209399
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.
OP #2209612
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren