Hallo!
Ich habe hier ein (mir unverständliches) Problem mit der
atoi-Anweisung. Ich möchte auf einem LCD eine Uhr anzeigen. Dazu werden
per Interrups (jede sekunde) 3 globale Variablen wie folgt hochgezählt:
1 | /* Globale Variablen definieren */
|
2 |
|
3 | volatile uint8_t ValueS;
|
4 | volatile uint8_t ValueM;
|
5 | volatile uint8_t ValueH;
|
6 | volatile uint8_t TimeChanged;
|
7 |
|
8 | /* ISR für den Compare Match 1A Interrupt*/
|
9 | SIGNAL(SIG_OUTPUT_COMPARE1A)
|
10 | {
|
11 | /* Uhrzeit weiterzählen */
|
12 | if (++ValueS == 60)
|
13 | {
|
14 | ValueS = 0;
|
15 | if (++ValueM == 60)
|
16 | {
|
17 | ValueM = 0;
|
18 | if (++ValueH == 24)
|
19 | ValueH = 0;
|
20 | }
|
21 | }
|
22 |
|
23 | /* Als Sekundenanzeige die LED's blinken lassen */
|
24 | PORTB = ~PORTB;
|
25 |
|
26 | /* Änderungsmarker für Zeitanzeige hochzählen */
|
27 | TimeChanged++;
|
28 | }
|
Im Hauptprogramm wird das Änderungsflag überprüft (TimeChanged > 0) und
dann die aktuelle Uhrzeit angezeigt:
1 | int main(void)
|
2 | {
|
3 | char buffer[15]; /* Puffer für Stringumwandlung */
|
4 |
|
5 | init_io(); /* IO's initialisieren */
|
6 | init_timer(); /* Timer initialisieren */
|
7 | lcd_init(LCD_DISP_ON); /* LCD-Display initialsieren */
|
8 |
|
9 | /* Grundbild auf LCD ausgeben */
|
10 | lcd_puts(" Thorstens BasUhr");
|
11 | lcd_gotoxy(6,2);
|
12 | lcd_puts("00:00:00");
|
13 |
|
14 | /* Endlose Hauptschleife */
|
15 | for (;;)
|
16 | if( TimeChanged > 0 )
|
17 | {
|
18 | lcd_gotoxy(6,2);
|
19 | itoa(ValueH, buffer, 2);
|
20 | lcd_puts(buffer);
|
21 | lcd_gotoxy(9,2);
|
22 | itoa(ValueM, buffer, 2);
|
23 | lcd_puts(buffer);
|
24 | lcd_gotoxy(12,2);
|
25 | itoa(ValueS, buffer, 2);
|
26 | lcd_puts(buffer);
|
27 | TimeChanged = 0;
|
28 | }
|
29 | }
|
Auf dem Display erscheint aber statt meiner Uhrzeit z.B. bei den
Sekunden nicht etwa 1, 2, 3, 4, 5, 6, 7, usw., sondern
0, 1, 10, 11, 100, 101, 110, 111, 1000, usw.
Was mach ich da denn falsch? Wieso wandelt mit itoa das so merkwürdig
um?
Hat da einer eine Idee zu?
Vielen Dank
MfG Thorsten