@ Felix G. (Gast)
>Minuten nur einstellig und zählt die Sekunden in Zehnerschritten bis
>1000 hoch. Keine Ahnung warum. Außerdem läuft das ganze zu schnell.
>Danke im Vorraus,
> TCCR1A = (1<<WGM01); // CTC
Falsch! Falsches Bit, falsche Register.
Eher so.
TCCR1B |= (1<<WGM12) | (1<<CS10); // Prescaler 1, CTC Mode
> if (milli == 1000) //Sekunden inkrementieren
>{milli = 0;
> sekunden ++;
OK
>_delay_ms(10);
Was soll der Unsinn?
>char sekundenascii [2]; //int to ascii
>itoa (sekunden, sekundenascii, 10);
Wird bissel knapp mit den Sekunden. Denn die brauchen DREI Bytes, zwei
für die Zahl, eins für das Abschlusszeichen NULL.
Ausserdem definiert man Variablen nicht mitten im Quelltext. Das gehört
an den Anfang.
Ausserdem hast du ggf. noch ein Problem, nämlich der nichtatomare
Vergleich und Zugriff auf milli, siehe Interrupt. Das macht man
anders, mit einem Flag. Siehe unten.
1 | #include <avr/io.h>
|
2 | #include <inttypes.h>
|
3 | #include <stdlib.h>
|
4 | #include <stdint.h>
|
5 | #ifndef F_CPU
|
6 | #define F_CPU 16000000UL
|
7 | #endif
|
8 | #include <avr/interrupt.h>
|
9 | #include <util/delay.h>
|
10 | #include <lcd.c>
|
11 | uint16_t milli;
|
12 | volatile uint8_t flag;
|
13 | uint8_t sekunden ;
|
14 | uint8_t minuten ;
|
15 | uint8_t stunden ;
|
16 |
|
17 | int main (void) {
|
18 |
|
19 | char tmp_str[3];
|
20 |
|
21 | lcd_init (LCD_DISP_ON);
|
22 | TCCR1B = (1<<WGM12) | (1<<CS10); // Prescaler 1, CTC
|
23 | OCR1A = (16000 - 1 ); //alle 1 millisek
|
24 |
|
25 | // Compare Interrupt erlauben
|
26 | TIMSK |= (1<<OCIE1A);
|
27 |
|
28 | sei();
|
29 |
|
30 | while (1) {
|
31 |
|
32 | if (flag == 1) { //Sekunden inkrementieren
|
33 | flag = 0;
|
34 | sekunden ++;
|
35 | if (sekunden == 60) { //restliche Zähler inkrementieren
|
36 | minuten ++;
|
37 | sekunden = 0;
|
38 | if (minuten == 60 ) {
|
39 | stunden ++;
|
40 | minuten = 0;
|
41 | if (stunden == 24) {
|
42 | stunden = 0;
|
43 | }
|
44 | }
|
45 | }
|
46 |
|
47 | lcd_clrscr(); //Ausgabe jede sekunde
|
48 | itoa (stunden, tmp_str, 10);
|
49 | lcd_puts (tmp_str);
|
50 | lcd_data (':');
|
51 |
|
52 | itoa (minuten, tmp_str, 10);
|
53 | lcd_puts (tmp_str);
|
54 | lcd_data (':');
|
55 | itoa (sekunden, tmp_str, 10);
|
56 | lcd_puts (tmp_str);
|
57 | }
|
58 | }
|
59 | }
|
60 |
|
61 | ISR(TIMER1_COMPA_vect)
|
62 | {
|
63 | milli++;
|
64 | if (milli==1000) {
|
65 | milli=0;
|
66 | flag=1;
|
67 | }
|
68 | }
|
MfG
Falk