Forum: Mikrocontroller und Digitale Elektronik Arduino: Multitasking durch Zeitscheiben mit Timer Library?


von Christian J. (elektroniker1968)


Angehängte Dateien:

Lesenswert?

Hallo,

inzwischen wächst mein Arduino Programm größer und größer und es sind 
schon 5 Tabs, bzw muss der Code langsam streng strukturiert werden um 
später noch erweiterbar zu sein. Da der Regler des Arduino megas nicht 
ausreicht muss ein 2A 2C/DC Wandlerbaustein jetzt die Versorgung 
übernehmen, ich speise 5V direkt in die 5V Vcc Leiste des Boards ein und 
umgehe damit die externen Steckeranschlüsse des USB und Klinke. Da ich 
einen Ästhetik Tick habe ist das Ganze auf einem Brett ordentlich 
montiert.

Das ganze Programm arbeitet nach dem Schema

1. Auslesen aller Eingabeeinheiten
2. Entscheidungen treffen anhand der Werte
3. Bedienen der Ausgabeeinheiten

so wie bei einer SPS auch.

Ich benutze eine "Timer Funktion" von
http://playground.arduino.cc/code/timer

Ich leite zwei Instanzen der Timer Klasse ab:
1
Timer tim_sensor; // Timer Instanz erzeugen
2
Timer tim_pin_irq;

um
a) Sensoren auszulesen jede Sekunde (DHT11, RTC Clock an I2C Bus)
b) alle 50ms eine Pseudo Interrupt-on-Change an Pins per Polling 
durchzuführen um Tasten zu erkennen.

Das Init einer Timer "ISR" geschieht mit
1
timer_event_id1 = tim_sensor.every(1000, Sensor_isr);  
2
timer_event_id2 = tim_pin_irq.every(100, ISR_Check_Int_Pins);

Und oh Wunder .... beide Routine werden automatisch aufgerufen in jedem 
Loop Durchlauf, aber eben mit
1
tim_sensor.update();
2
tim_pin_irq.update();

Ich dachte erst, dass es nicht ginge zwei Instanzen zu erzeugen, die 
sich auf einen Hardware Timer abbilden aber.... es wird überhaupt kein 
Timer Interrupt verwendet, sondern ein Zeitscheibenverfahren in dem 
Zeiger auf die Funktionen übergeben werden. Die Timerfunktion vergibt 
eine Event ID an jeden Aufrufer und guckt nach bei welchem Event grad 
die Zeit abgelaufen ist und ruft es dann zyklisch auf. Damit die Zeiten 
stimmen darf in der Loop() auch kein Delay stehen.

Meine Frage: Gibt es auch eine echte Timerprogrammierung für den 
Arduiono, der die echten Ressourcen der Timer verwendet? D.h. der eine 
Funktion wirklich interruptgesteuert zyklisch aufruft und zb Funktion 
bereitstellt wie Set_timer(0), Read_timer() usw.

Gruss,
Christian

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.