Arne(Anfänger) schrieb:
> Ich wollte mal gerne einen Timer0 mit dem setzen eines Interrupts
> ausprobieren. Jedoch verstehe ich nicht ganz ob ich den TCNT0
> vordefinieren muss oder nicht.
Nein. musst du nicht.
TCNT0 ist das Register in dem die Hardware zählt.
Wenn du also dieses Register beobachten würdest, würde es ständig seinen
Wert ändern - es zählt hoch.
Sobald der Timer einen Vorteiler eingestellt bekommt, zählt er in TCNT0.
That's it. Mehr gibt es (momentan) dazu eigentlich nicht zu sagen.
> Also das Programm lässt sich im AVR Studio linken und auch zum Atmega8
> übertragen, aber ich befürchte ich habe da noch ein grundsätzliches
> Verständnisproblem.
Woraus schliesst du das?
> Ich wäre sehr Dankbar wenn sich kurz einer die Zeit nehmen würde und mir
> den rechten Weg weisen würde ;)
Das ist schon ok so.
Zum Programm:
Gewöhn dir von Anfang an gleich an, nach Möglichkeit immer korrektes
Standard-C zu benutzen. In C gibt es keine Möglichkeit in einer Funktion
eine andere Funktion zu definieren. main() ist eine Funktion und die ISR
ist auch eine Funktion. Daher kann die ISR nicht innerhalb von main()
definiert werden, sondern ist eine eigenständige Funktion ausserhalb von
main()
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | volatile unsigned int millisekunden=0;
|
5 | volatile unsigned int sekunde=0;
|
6 |
|
7 | ISR (TIMER0_OVF_vect) // Timer0 overflow Interrupt
|
8 | {
|
9 | millisekunden++;
|
10 |
|
11 | if(millisekunden==1000)
|
12 | {
|
13 | sekunde++;
|
14 | millisekunden=0;
|
15 | }
|
16 | }
|
17 |
|
18 | int main()
|
19 | { // IO konfigurieren
|
20 | DDRC=0x00;
|
21 | DDRD=0xff;
|
22 |
|
23 | // Timer0 konfigurieren
|
24 | TCCR0 =(1<<CS02)|(1<<CS01);
|
25 | TIMSK |= (1<<TOIE0); // Timer Overflow Interrupt freischalten
|
26 |
|
27 | sei(); // Interrupts freigeben
|
28 | while(1) // Endlose Hauptschleife
|
29 | {
|
30 | if(sekunde==1)
|
31 | {
|
32 | PORTD|=(1<<PD5);
|
33 | PORTD|=(1<<PD6);
|
34 | }
|
35 | }
|
36 |
|
37 | return 0;
|
38 | }
|
Und achte auch auf deine Codeformatierungen. Ich finde es immer wieder
spannend, dass Neulinge gerne jede Zeile in einer Wurscht dahinschreiben
aber anscheinend als Ausgleich dafür jede Menge Leerzeilen einfügen. Die
Leerzeilen bringen nichts, ausser dass sie den Code in die Länge ziehen.
Aber ein paar Leerzeichen zwischen den "Wörtern" würden den Lesefluss
erheblich vereinfachen. Denn schliesslich sind wir alle von Kindesbeinen
darauf trainiert worden, dass zumindest im Deutschen zwischen den
Wörtern ein Leerraum steht und nicht einfach nur alle Buchstaben
aneinandergefügt werden.
1 | ISR (TIMER0_OVF_vect) // Timer0 overflow Interrupt
|
2 | {
|
3 | millisekunden++;
|
4 |
|
5 | if( millisekunden == 1000 )
|
6 | {
|
7 | sekunde++;
|
8 | millisekunden = 0;
|
9 | }
|
10 | }
|