Forum: Mikrocontroller und Digitale Elektronik Timer Simulation in Atmel Studio


von Sören K. (foxalem)


Lesenswert?

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
}

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

volatile int millisekunde;
volatile bool sekunde;
1
ISR (TIMER0_COMPA_vect)
2
{
3
  millisekunde++;
4
  
5
  if (millisekunde == 1000) {
6
    sekunde = true;
7
    millisekunde = 0;
8
  }
9
}

von Sören K. (foxalem)


Lesenswert?

Danke für die Verbesserung.

Ist bisher nicht aufgefallen, da das Programm ja nichtmal in die ISR 
hineingeht. Ich hab das gefühl der Timer läuft garnicht.

von holger (Gast)


Lesenswert?

Welchen Controller benutzt du?

von Sören K. (foxalem)


Lesenswert?

Entschuldigung das ich diese Information vorenthalten habe.
Einen ATMEGA328P, bisher nur in der Simulation, bald auch in Real aufm 
AVR-Dragon.

von Amateur (Gast)


Lesenswert?

Üblicherweise initialisiert man Variablen wie z.B.:
sekunde
millisekunde

Die Variable:
millisekunde
muss beim Wunschwert zurückgesetzt werden, sonst wird falsch gezählt.

von holger (Gast)


Lesenswert?

>  // Compare Interrupt erlauben
>  TIMSK0 |= 0x01;    //TOIE

Das erlaubt den Overflow Interrupt. Compare A wäre

  TIMSK0 |= 0x02;

von Sören K. (foxalem)


Lesenswert?

Danke Holger ;) dass war der Knackpunkt.

von Timmo H. (masterfx)


Lesenswert?

Man würde es selbst schneller sehen wenn man sowas nutzt wie
1
TIMSK0 |= (1<<OCIE0A);

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.