Counter nur bis 255

Wie kann man es machen dass der Counter bis 3600 sec zählt? Jetzt zählt der nämlich nur bis 255. Oder, wie kann man es anders Programmieren, als ich es mir jetzt ausgedacht habe?

  uint8_t wendung;
  uint8_t wendung_std = 0;
  uint8_t g_thread_counter = 0; 


  
 /* ===================================================================================================
 * Wendung
 * ==================================================================================================== 
 */
void FUNC_wendung(void)
  {
    /* --------- INIT --------- */
    LCDML.FuncInit();
    /* --------- LOOP --------- */
    if(LCDML.Timer(g_timer_wait, 1000))
    {
      char lcdline[17];
      lcd.clear();   
      lcd.print(F("Jede:"));// F Macro => Flashspeicherung des Strings 
      lcd.setCursor(6,0);
      sprintf(lcdline,"%0d",wendung_std); 
      lcd.print(lcdline);
      lcd.setCursor(0,1);
      lcd.print(F("Stunden wenden"));// F Macro => Flashspeicherung des Strings 
  wendung = wendung_std*3600;
    }
    if(LCDML.checkButtons())
    {
      if(LCDML.g_button_up >= 1) {
        LCDML.g_button_up = 0;
      wendung_std++;
      }    
      if(LCDML.g_button_down >= 1) {
        LCDML.g_button_down = 0;
        wendung_std--;
      }
    }
     /* --------- STOP  --------- */
    if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0)) 
    {      
    }   
  }
/* *********************************** */
/* Thread_wendung
/* *********************************** */

  void simpleThread_setup(Thread_wendung)
  {   
    g_thread_counter = 0;  
  }

  boolean simpleThread_loop(Thread_wendung)
  { 
    Serial.print(F("Counter: "));
    Serial.println(g_thread_counter);
      g_thread_counter++;
    
    if(g_thread_counter > wendung) {
      Serial.println(wendung);
    Serial.println(F("drehen"));
      
      // Counter zurücksetzen
    g_thread_counter = 0; 
    
    simpleThread_restart(Thread_wendung);
  }
  }

Vielleicht indem Du eine 16 bit Variable zB vom Typ INT nimmst und nicht solche vom 8Bit Typ.

Grüße Uwe

Etwas ausführlicher: Ein uint8_t-Typ (=byte) verbraucht im Speicher 8 Bit und kann somit genau einen von 2^8=256 Werten speichern. Da die Zählung bei 0 beginnt, ist der größte Wert 255, dann fängt es (leider ohne Warnung) wieder bei 0 an. Für größere Zahlen als 255 verwendet man z.B. int, der 2Byte=16Bit Speicher verbraucht und Zahlen von -32768 bis 32767 aufnehmen kann. Ohne Vorzeichen wählt man den Typ word (auch 2Byte=16Bit) mit einem Zahlenbereich von 0 bis 65535.

Danke für die Erklärung. Bei int, wird da nicht was im Ram Speicher abgelegt/gespeichert?

Kann man mein code besser machen? zB dass mit wendung=wendung_std*3600 Kann man da nicht ein int sparen?

skorpi08:
Danke für die Erklärung.
Bei int, wird da nicht was im Ram Speicher abgelegt/gespeichert?

Was glaubst Du, wo wird die Variable vom Typ uint8_t oder uint16_t gespeichert. :wink: :wink: :wink: Ein Microcontroller hat nur das RAM um Variablen zu speichern ( theoretisch hätte er auch noch EEPROM und FLASH aber beide sind zu lamgsam beim Abspeichern und haben begrenzte Anzahl von Schreibzyklen).

UNSIGNED INT ist ein Variablentyp der auf dem Arduino 16 bit groß ist. Auf anderen CPU/Microcontrollern kann ein INT größer oder kleine sein.
uint16_t ist eine absolute schreibweise für eine 16 bit Variable. Diese ist auf allen Systemen immer 16 Bit groß. Bei Arduino ist UNSIGNED INT und uint16_t das gleiche.

Grüße Uwe

ub60: Etwas ausführlicher: ...

Hallo ub60 jemandem, der uint8_t als Variablentyp verwendet, hätte ich das Wissen zugetraut, daß meine Antwort ausreichen wäre. Danke für die ausführliche Erklärung. Grüße Uwe