www.mikrocontroller.net

Forum: Compiler & IDEs Mehrere Module und ein Timer


Autor: Phil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)
ISR(Timer...)
{
  static uint8_t prescaler_PIR = PRESCALER_PIR;
  static uint8_t prescaler_UHR = PRESCALER_UHR;

  if ( --prescaler_PIR == 0 ) 
  {
    prescaler_PIR = PRESCALER_PIR;
    do_PIR();
  }

  if (  --prescaler_UHR == 0 )
  {
    prescaler_UHR = PRESCALER_UHR;
    do_UHR();
  }
}

Event-driven
(do_UHR() und do_PIR() dauern lang, d.h. Interrupts sollen weiterlaufen)
#define PRESCALER_PIR 23
#define PRESCALER_UHR 42

volatile uint8_t event_PIR;
volatile uint8_t event_UHR;

ISR(Timer...)
{
  static uint8_t prescaler_PIR = PRESCALER_PIR;
  static uint8_t prescaler_UHR = PRESCALER_UHR;

  if ( --prescaler_PIR == 0 ) 
  {
    prescaler_PIR = PRESCALER_PIR;
    event_PIR = 1;
  }

  if (  --prescaler_UHR == 0 )
  {
    prescaler_UHR = PRESCALER_UHR;
    event_UHR = 1;
  }
}

int main(void)
{
  while(1)
  {
    if ( event_PIR ) 
    {
      event_PIR = 0;
      do_PIR();
    }

    if ( event_UHR ) 
    {
      event_UHR = 0;
      do_UHR();
    }
  }
}

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.