Arexx RP6 V2 Build your own robot kit RP6 V2 User Manual
Product codes
RP6 V2
RP6 ROBOT SYSTEM - 4. Programmierung des RP6
4.4.10. Programmablauf und Interrupts
Wir hatten weiter oben schon gesagt, das ein Programm generell Anweisung nach An-
weisung von oben nach unten ausgeführt wird. Dann gibt es natürlich noch die norma-
Wir hatten weiter oben schon gesagt, das ein Programm generell Anweisung nach An-
weisung von oben nach unten ausgeführt wird. Dann gibt es natürlich noch die norma-
le Flusssteuerung mit Bedingungen und Schleifen, sowie Funktionen.
Neben diesem normalen Programmablauf gibt es allerdings noch sog. „Interrupts“. Die
Neben diesem normalen Programmablauf gibt es allerdings noch sog. „Interrupts“. Die
verschiedenen Hardwaremodule (Timer, TWI, UART, Externe Interrupts etc.) des Mi-
krocontrollers können Ereignisse auslösen, auf die der Mikrocontroller so schnell wie
krocontrollers können Ereignisse auslösen, auf die der Mikrocontroller so schnell wie
möglich reagieren muss. Dazu springt der Mikrocontroller – (fast) egal wo er sich ge-
rade im normalen Programm befindet – in eine sog. Interrupt Service Routine (ISR),
rade im normalen Programm befindet – in eine sog. Interrupt Service Routine (ISR),
in der dann schnellstmöglich auf das Ereignis reagiert werden kann. Keine Sorge, Sie
müssen sich hier nicht noch selbst drum kümmern, für alle benötigten ISRs wurde das
müssen sich hier nicht noch selbst drum kümmern, für alle benötigten ISRs wurde das
bereits in der RP6Library erledigt. Aber damit Sie wissen worum es geht und was die-
se seltsamen „Funktionen“ in der Library sollen, erwähnen wir es hier kurz.
Die ISRs sehen wie folgt aus:
se seltsamen „Funktionen“ in der Library sollen, erwähnen wir es hier kurz.
Die ISRs sehen wie folgt aus:
ISR ( <InterruptVector> )
{
<Anweisungsblock>
}
z.B. für den linken Encoder am externen Interrupt Eingang 0:
ISR (INT0_vect)
{
{
// Hier werden bei jeder Signalflanke zwei Zähler erhöht:
mleft_dist++; // zurückgelegte Distanz
mleft_dist++; // zurückgelegte Distanz
mleft_counter++; // Geschwindigkeitsmessung
}
Man kann diese ISRs nicht direkt aufrufen! Das geschieht immer automatisch und
meist kann man nicht vorhersagen wann es genau passiert! Es kann zu jeder Zeit in
meist kann man nicht vorhersagen wann es genau passiert! Es kann zu jeder Zeit in
jedem beliebigen Programmteil passieren (ausser in einem Interrupt selbst oder wenn
Interrupts deaktiviert sind). Dann wird die ISR ausgeführt und danach wieder an die
Interrupts deaktiviert sind). Dann wird die ISR ausgeführt und danach wieder an die
Stelle zurückgesprungen an der das Programm unterbrochen wurde. Daher muss
man, wenn man Interrupts einsetzt, alle zeitkritischen Dinge auch in den jeweiligen
man, wenn man Interrupts einsetzt, alle zeitkritischen Dinge auch in den jeweiligen
Interrupt Service Routinen erledigen. Pausen die man anhand von Taktzyklen errech-
net hat, können sonst zu lang werden wenn sie von einem oder mehreren Interrupt
net hat, können sonst zu lang werden wenn sie von einem oder mehreren Interrupt
Ereignissen unterbrochen werden.
In der RP6Library werden Interrupts verwendet um die 36kHz Modulation für die In-
In der RP6Library werden Interrupts verwendet um die 36kHz Modulation für die In-
frarotsensorik und Kommunikation zu erzeugen. Außerdem für die RC5 Dekodierung,
Timing und Delay Funktionen, um die Encoder auszuwerten, für das TWI Modul (I²C-
Timing und Delay Funktionen, um die Encoder auszuwerten, für das TWI Modul (I²C-
Bus) und noch ein paar andere kleinere Dinge.
- 77 -