Moin moin liebe Community,
ich bin zwar nicht ganz unbedarft, allerdings ist es nun doch schon
wieder ein paar Monate her, dass ich im Thema uC voll drin war. (Und
ausserdem mit Keil gearbeitet habe)
Ich bin gerade dabei ein kleines Programm zu schreiben und brauche dafür
nun den Timer, sodass während den funktionsaufrufen eine Pause entsteht.
Grundgedanke war dieser:
- Timer Starten
- in der ISR eine sekundenflag setzen wenn Millisekunde = 1000
- im Hauptprogramm if-abfrage auf die Sekundenflag
- ausführen der funktion
Ich habe mich nun an dem Beispiel hier im AVR-Tut orientiert, aber mir
schmiert gerade ständig die IDE ab wenn ich das Programm durchlaufen
lassen möchte.
Irgend eine Idee woran das liegen kann?
Anbei mein Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | void Ringlauf();
|
5 | //Globale Variablen festlegen
|
6 | int millisekunde;
|
7 | bool sekunde;
|
8 |
|
9 | int main(void)
|
10 | {
|
11 | // Timer 0 konfigurieren
|
12 | TCCR0A |= 0x02; // CTC Modus
|
13 | TCCR0B |= 0x02; // Prescaler 8
|
14 | // ((1000000/8)/1000) = 125
|
15 | OCR0A = 125-1;
|
16 |
|
17 | // Compare Interrupt erlauben
|
18 | TIMSK0 |= 0x01; //TOIE
|
19 |
|
20 | // Global Interrupts aktivieren
|
21 | sei();
|
22 |
|
23 | while(1)
|
24 | {
|
25 | if (sekunde == true) {
|
26 | Ringlauf();}
|
27 | }
|
28 | }
|
29 |
|
30 | void Ringlauf()
|
31 | {
|
32 | //COde zur Übersichtlichkeit entfernt
|
33 | };
|
34 |
|
35 | ISR (TIMER0_COMPA_vect)
|
36 | {
|
37 | millisekunde++;
|
38 |
|
39 | if (millisekunde == 1000) {
|
40 | sekunde = true;
|
41 | }
|
42 | }
|