Mehrere Module und ein Timer

Gast #1716060
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..
Persönliche Seite #1716154
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.