Forum: Compiler & IDEs 999.999 runterzählen mit ATMega16


von Stefan Z. (derdespot)


Lesenswert?

Hallo Leute,

ich möchte eine Zahl --> 999.999 (neunhundert99tausendend999) 
runterzählen. Die Zahl habe ich vorher per Tastendruck (jede Stelle 
hoch/runter ok --> nächste Stelle) in ein char-Array eingelesen. Nun ist 
meine Frage wie ich diese Zahl runterzählen kann... Eine Möglichkeit 
wäre mit verschachtelten Schleifen zu arbeiten... z.B.

do{

    Cycles[5] = Cycles[5] - 1;
    set_cursor(5,1);
    lcd_data(Cycles[5]);

    long_delay(100);

  }while(Cycles[5]!=48);

    if(Cycles[4]!=48){

      Cycles[4] = Cycles[4] - 1;
      set_cursor(4,1);
      lcd_data(Cycles[4]);

      Cycles[5] = Cycles[5] + 9;
      set_cursor(5,1);
      lcd_data(Cycles[5]);
    }

Dies auf alle 6 Stelle anzuwenden würde jedoch viel zu lange dauern. 
Gibt es eine Möglichkeit das Array in eine long Zahl zu wandeln und 
diese dann einfach per -- Befehl runterzuzählen????

Vielen Dank schonmal für die Antworten!

von Frank L. (hermastersvoice)


Lesenswert?

die Stellen entsprechen ihrer Wertigkeit addieren und das 
Ergebnisregister (bzw. die Variable) runterzählen.

bye

Frank

von Sven P. (Gast)


Lesenswert?

Ja. Die Möglichkeit gibts, genauso wie es hier im Forum [ c ] gibt, um 
C-Code farblich hervorzuheben.
1
char digits[4];
2
uint16_t counter = 0;
3
uint8_t i;
4
5
for (i = 0; i < 4; i++) {
6
  counter *= 10;
7
  counter += digits[i];
8
}

Sowas in dem Dreh.

von Stefan Z. (derdespot)


Lesenswert?

Okay aber uint16_t --> 16Bit 2hoch16 = 65.536 Meine Zahl ist aber 
999.999 Ich brächte mindestens 17 Bit (-: für das Ergebnisregister

von Sven P. (Gast)


Lesenswert?

Stefan Z. wrote:
> Okay aber uint16_t --> 16Bit 2hoch16 = 65.536 Meine Zahl ist aber
> 999.999 Ich brächte mindestens 17 Bit (-: für das Ergebnisregister

Und? nimm halt uint32_t ...

von Stefan Z. (derdespot)


Lesenswert?

super! Es funktioniert anscheinend... Aber leider kann die LCD_Display 
Funktion so große Zahlen nicht anzeigen. Ich verwende die Funktion 
lcd_string() aus dem gcc Tuturial --> oder geht das bei euch?

char Buffer[20];

zyklen_einlesen();

set_cursor(0,2);

lcd_data(Cycles[0]);
lcd_data(Cycles[1]);
lcd_data(Cycles[2]);
lcd_data(Cycles[3]);
lcd_data(Cycles[4]);
lcd_data(Cycles[5]);

uint32_t cycles_neu = 999999; // zum Test der LCD fkt
itoa( cycles_neu , Buffer, 10 );
set_cursor(0,1);
lcd_string(Buffer);

von Sven P. (Gast)


Lesenswert?

Das Problem liegt vermutlich eher in "itoa". Probier dein Glück mal mit 
"ultoa".

von Stefan Z. (derdespot)


Lesenswert?

ich danke dir --> ultoa hat funktioniert! echt klasse wie schnell man 
hier im Forum hilfe bekommt! DANKE!!!!

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.