Hallo zusammen, da ich gerade einen genauen Sekunden Takt (Uhr) brauche habe ich mal den Code von Peter Danneger verwendet. Dank an Peter. Allerdings geht meine Uhr nach ca. 10 Minuten um 2 Sekunden nach. Kann es sein dass der externe Quarz so ungenau ist? Hier der Code. Und es läuft nur dieser Code um Nebeneffekte auszuschliessen. Kein weiterer Timer etc. Fuses usw. passen auch.
1 | #define XTAL 8000000L
|
2 | #define DEBOUNCE 256L
|
3 | #define uchar unsigned char
|
4 | #define uint unsigned int
|
5 | uchar prescaler; |
6 | uint volatile second; |
7 | |
8 | ISR(TIMER1_COMPA_vect) { |
9 | #if XTAL % DEBOUNCE
|
10 | OCR1A = XTAL / DEBOUNCE - 1; |
11 | #endif
|
12 | if( --prescaler == 0 ) { |
13 | prescaler = (uchar)DEBOUNCE; |
14 | second++; |
15 | #if XTAL % DEBOUNCE
|
16 | OCR1A = XTAL / DEBOUNCE + XTAL % DEBOUNCE - 1; |
17 | #endif
|
18 | }
|
19 | |
20 | }
|
21 | |
22 | // Timer Init
|
23 | |
24 | TCCR1B = (1<<WGM12) | (1<<CS10); |
25 | OCR1A = XTAL / DEBOUNCE - 1; |
26 | TCNT1 = 0; |
27 | prescaler = (uchar)DEBOUNCE; |
28 | second = 0; |
29 | |
30 | TIMSK1 = (1<<OCIE1A); |
31 | |
32 | sei(); |
In der main setze ich second auf 0 wenn > 0 und mache eine UART Ausgabe Danke und Grüße