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