Hallo,
ich bin gerade dabei eine Uhr selbst zu bauen.
Das Programm ist schon fertig geschrieben. Die Minuten/Stunden werden
richtig gezählt und an mehreren 7-Segment Anzeigen ausgegeben, nur der
8bit-Timer im CTC Modus scheint nicht richtig zu funktionieren.
Die Suchfunktion im Forum und in Google, sowie das Datenblatt habe ich
mehrfach durchsucht, allerdings kann ich meinen Fehler nicht finden.
Ich verwende einen ATmega88 mit externem 7.2728Mhz Quarz. Der Timer0
(8Bit, im CTC Modus, Prescaler 1024) soll die ISR alle hundertstel
Sekunden aufrufen und diese zählen. Nach einer Minute werden die Minuten
hochgezählt und der Sekundenzähler zurückgesetzt.
Ich hoffe ihr könnt mir helfen.
1 | #include <avr/io.h>
|
2 | #ifndef F_CPU //Vordefinieren fuer delay.h
|
3 | #define F_CPU 7372800UL //Takt ueber externen 7.3728Mhz Quarz
|
4 | #endif
|
5 | #include <util/delay.h>
|
6 | #include <avr/interrupt.h>
|
7 |
|
8 | […]
|
9 |
|
10 | unsigned int sekunden=0; //Zaehler fuer Hundertstel-Sekunden
|
11 | unsigned int minuten=0; //Zaehler fuer Minuten
|
12 | unsigned int stunden=0; //Zaehler fuer Stunden
|
13 |
|
14 | […]
|
15 |
|
16 | ISR(TIMER0_COMPA_vect) //Interrupt Routine
|
17 | {
|
18 | sekunden++; //Sekunden werden um eins addiert
|
19 | if (sekunden==6000) //Wenn eine Minute vorbei...
|
20 | {
|
21 | sekunden=0;
|
22 | minuten++;
|
23 | }
|
24 | }
|
25 |
|
26 | […]
|
27 |
|
28 | int main(void)
|
29 | {
|
30 | TCCR0A |= (1<<WGM01); // CTC Modus
|
31 | TCCR0B |= (1<<CS02) | (1<<CS00); // Prescaler 1024
|
32 | OCR0A = 72-1;
|
33 | // 7372800/(1024*100)=72 --> 1/100 s
|
34 | TIMSK0 |= (1<<OCIE0A); // Output Compare A enable
|
35 | sei(); // interrupt an
|
36 |
|
37 | DDRD = 0b11111111; //Alles Ausgaenge
|
38 | DDRC |= (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4);
|
39 | //PORTC 0,1,2,3,4 Ausgaenge
|
40 |
|
41 | while(1)
|
42 | {
|
43 |
|
44 | // eigentliches Programm
|
45 |
|
46 | }
|
47 | }
|