mikrocontroller.net

Forum: Compiler & IDEs ADC in ISR modularisieren?


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich modularisiere gerade meinen Programmcode und wollte einmal wissen, 
ob es möglich ist folgendes zu machen:

Ich habe eine overflow ISR vom Timer 1 . In ihr werden verschiedene 
Variablen hochgezählt und unter anderem der ADC ausgelesen.

Da ich mein Programm gerne modularisieren möchte, wäre es schön eine 
eigene adc.c und adc.h zu haben.

Die Preisfrage ist jetzt, ob es möglich ist ein und dieselbe ISR in 2 
verschiedenen .c mit Inhalt zu füllen.

quasi:
main.c
ISR_Timer1(){
variable++;
}

adc.c
ISR_Timer1(){
if (bit_is_set(ADCSRA,6)) ADC_Wert = ADC;
}

Schön wäre es also wenn ich diesen Vektor verwenden könnte und keinen 
neuen oder nen anderen Timer verwenden muß.

Ich danke euch.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So direkt geht da nicht.
Du musst dir die dazu benötigte Infrastuktur selbst herstellen.
Die Frage ist nur, ob du das möchtest, bzw. bereit bist den Preis dafür 
zu zahlen :-)

Man könnte zb
* Jede funktionale Gruppe teilt einem Handler die Adresse seiner 'ISR'
  Funktion mit. Der Handler trägt die in eine Tabelle ein. Aus CPU Sicht
  gibt es nur eine ISR. Aber in dieser ISR wird die Tabelle abgearbeitet
  und nacheinander alle registrierten Funktionen aufgerufen

* Der Handler unterhält keine Tabelle, sondern nur die Adresse der
  ersten aufzurufenden Funktion. Registriert eine funktionale Gruppe
  eine Behandlungsfunktion für einen bestimmte ISR, so merkt sich der
  Handler diese Adresse und liefert gleichzeitig die bisherige Adresse
  der aufzurufenden Funktion zurück. Die funktionale Gruppe wiederrum
  merkt sich diese Adresse und ist verpflichtet am Ende ihrer eigenen
  Behandlung genau die Funktion an dieser Adresse aufzurufen. Kommt der
  Interrupt, so ruft die eigentliche ISR nur die erste Funktion auf.
  Aber da jede Funktion ihren Nachfolger verpflichtend aufrufen muss
  (seine Adresse kennt er ja, die wurd ihr beim registrieren geliefert)
  werden auch hier im Endeffekt alle registrierten Funktionen aufgerufen

  Im Endeffekt hat man damit ebenfalls im Grunde eine Tabelle aller
  registrierten Behandlungsfunktionen, nur ist diese Tabelle über
  das ganze Programm verstreut.

Bei solchen Dingen geht es dann schon in Richtung 'kleines 
Betriebssystem'. Die Verwaltung bzw. die Bereitstellung solcher Konzepte 
ist eine der noblen Aufgaben eines Betriebssystems bzw. das, was mit in 
den Begriff API (Application Programmers Interface) fällt.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Die Preisfrage ist jetzt, ob es möglich ist ein und dieselbe ISR in 2
> verschiedenen .c mit Inhalt zu füllen.

Die Gewinnerantwort ist nein.

Du kannst aber aus der ISR einzelne Funktionen aufzurufen, die in 
unterschiedlichen sourcefiles stehen.

Oliver

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt ich lagere ISR's wie von nem Timer lieber nicht aus und stopf 
sie voll mit externen funktionen. Gut. Obwohl sowas mit 
Funktionsüberladung (??) echt toll wäre.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Oliver (Gast)

>Du kannst aber aus der ISR einzelne Funktionen aufzurufen, die in
>unterschiedlichen sourcefiles stehen.

Was aber zur Folge hat, dass in der ISR ne Menge zusätzlicher push/pop 
stattfinden, zumindest beim AVR GCC. Ausser man defniert die Funktionen 
als inline.

MFG
Falk

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.