Forum: Compiler & IDEs Mehrere Module und ein Timer


von Phil (Gast)


Lesenswert?

Hallo,

ich möchte meine Software für einen AVR weitestgehend modularisieren und 
habe dabei das Problem, dass ein Modul (PIR) den selben Timer wie mein 
Modul (UHR) verschlingt.

Es ist ja bekanntermaßen nicht möglich mehrere Definitionen für dieselbe 
ISR zu machen. Also wie macht ihr das? Gibt es einen Workaround?

Dank euch..

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn die Aufrufzeiten für die Module ganzzahlige Vielfache voneinander 
sind, dann einen gemeinsamen Timer ("Systemtimer für die Module meiner 
Library", z.B. 10ms Timer) so schnell laufen lassen, dass Ticks für 
beide Aktionen erreicht werden (grösster gemeinsamer Teiler). Über einen 
Softwarezähler dann die Ereignisse abpassen.

Interrupt-driven
(do_UHR() und do_PIR() haben kurze Laufzeit, d.h. können mit gesperrten 
Interrupts laufen)
1
ISR(Timer...)
2
{
3
  static uint8_t prescaler_PIR = PRESCALER_PIR;
4
  static uint8_t prescaler_UHR = PRESCALER_UHR;
5
6
  if ( --prescaler_PIR == 0 ) 
7
  {
8
    prescaler_PIR = PRESCALER_PIR;
9
    do_PIR();
10
  }
11
12
  if (  --prescaler_UHR == 0 )
13
  {
14
    prescaler_UHR = PRESCALER_UHR;
15
    do_UHR();
16
  }
17
}

Event-driven
(do_UHR() und do_PIR() dauern lang, d.h. Interrupts sollen weiterlaufen)
1
#define PRESCALER_PIR 23
2
#define PRESCALER_UHR 42
3
4
volatile uint8_t event_PIR;
5
volatile uint8_t event_UHR;
6
7
ISR(Timer...)
8
{
9
  static uint8_t prescaler_PIR = PRESCALER_PIR;
10
  static uint8_t prescaler_UHR = PRESCALER_UHR;
11
12
  if ( --prescaler_PIR == 0 ) 
13
  {
14
    prescaler_PIR = PRESCALER_PIR;
15
    event_PIR = 1;
16
  }
17
18
  if (  --prescaler_UHR == 0 )
19
  {
20
    prescaler_UHR = PRESCALER_UHR;
21
    event_UHR = 1;
22
  }
23
}
24
25
int main(void)
26
{
27
  while(1)
28
  {
29
    if ( event_PIR ) 
30
    {
31
      event_PIR = 0;
32
      do_PIR();
33
    }
34
35
    if ( event_UHR ) 
36
    {
37
      event_UHR = 0;
38
      do_UHR();
39
    }
40
  }
41
}

Für eine Library kann man die Abarbeitung der Funktionen flexibel 
halten, wenn man eine Liste führt, in die neue Module/Funktionen sich 
mit Funktionspointer, Eventflagpointer und Prescaler eintragen.

Stichwort: Scheduler

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.