Abend zusammen,
ich schmore gerade über folgendem Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 | #include "lcd-routines.h"
|
5 | #include <stdlib.h>
|
6 |
|
7 |
|
8 | //Variablen für die Zeit
|
9 | volatile unsigned int millisekunden=0;
|
10 | volatile unsigned int sekunde=0;
|
11 |
|
12 | int main(void)
|
13 | {
|
14 | TCCR2 =(1<<WGM21) | (1<<CS00) | (1<<CS01); //Prescaler 64 / OCR0 125: 8MHz:64:125 = 1KHz
|
15 | OCR2=125;
|
16 | TIMSK|=(1<<OCIE2);
|
17 | sei(); //3)Interrupts aktivieren
|
18 |
|
19 | while(1)
|
20 | {
|
21 | }
|
22 |
|
23 | return 0;
|
24 | }
|
25 |
|
26 | ISR (TIMER2_COMP_vect) //4)Führe diese ISR bei Overflow von TCNT0 aus
|
27 | {
|
28 | millisekunden++;
|
29 | if (millisekunden == 1000)
|
30 | {
|
31 | sekunde ++;
|
32 | millisekunden = 0;
|
33 | }
|
34 | // ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
|
35 | // WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
|
36 | char Buffer_ms[20]; // in diesem {} lokal
|
37 | itoa( millisekunden, Buffer_ms, 10 );
|
38 | // ... ausgeben
|
39 | char Buffer_s[20]; // in diesem {} lokal
|
40 | itoa( sekunde, Buffer_s, 10 );
|
41 | // ... ausgeben
|
42 | lcd_init();
|
43 | set_cursor(7,1);
|
44 | lcd_string( Buffer_ms );
|
45 | set_cursor(0,1);
|
46 | lcd_string( Buffer_s );
|
47 | }
|
und kann mir nicht erklären warum der zu langsam zählt.
Taktfrequenz ist 16MHz, fuses dafür sind gesetzt.
Eigentlich sollte es ja laut der Formel:
16 000 000 64 250 = 1000
in einer sekunde 1000 interrupts geben. und da 1sec = 1000ms sollte des
j stimmen...
kann mir vll jemand helfen?
Mfg, Pat