Technische Informatik; Hardwarenahe Programmierung

Interrupt Erweitert

Inhalt

Using Flags

Damit auch Codeteile wie wait, printf, blockierende Systemaufrufe, o.ä. mit ISR verwendet werden können, werden Flags für diese Zwecke eingesetzt. D.h. in der ISR selbst wird ein Flag, das eine globale Variable ist, gesetzt und dieses Flag wird z.B. in der Endlosschleife while(1) in main ständig abgefragt und der Codeteil ausgeführt, wenn in der ISR dieses Flag gesetzt wurde. Das Löschen des Flags nicht vergessen, wie im folgenden Beispiel in der Funktion checkFlag():

#include "mbed.h"
//#define BUTTON1 p14       // push joystick pin

InterruptIn button(BUTTON1);
DigitalOut myled(LED1);
bool _pressed = false;      // definition of the flag _pressed      

int checkFlag() {
    if( _pressed ) {
        _pressed = false;   // delete flag
        return 1;
    }
    return 0;
}

void risingISR() {            
    _pressed = true;        // set flag _pressed
}

void callISR() {            // function callISR instead an ISR          
    myled = ! myled;        // now you can use ... 
    printf("Pressed\n");    // ... printf
    wait_ms(500);           // ... wait
    myled = ! myled;        // etc.
}


int main() {
    printf("Hello Interrupt-Flag v0.1\n");
    button.rise(&risingISR);                // call ISR in OS2
    //button.rise(callback(&risingISR));    // callback in OS5
 
    while(1) {
        if(checkFlag())     // if set then call the function ISR
            callISR();
        wait_ms(10);        // only for simulator
  }
}

Import programapp-InterruptIn-Flag

Rising ISR function with flags and call ISR

RTC auf Mbed LPC1768

Die Echtzeituhr (RTC) wird zum Verfolgen der Uhrzeit und zum Verwalten eines Kalenders verwendet. Bei vielen Anwendungen müssen Uhrzeit und Datum für das Auftreten bestimmter Ereignisse aufgezeichnet werden. RTCs sind in solchen Anwendungen nützlich und praktisch in Datenprotokollierungsanwendungen. Sie werden auch in Geräten wie Computern, Laptops und Mobiltelefonen verwendet. RTCs können im Mikrocontroller oder auch extern z.B. über den I2C-Bus angesteuert werden und werden üblicherweise von externen Batterien gespeist, sodass Zeit und Datum auch bei Stromausfall erhalten bleiben. RTCs verfügen über mehrere Register, in denen Uhrzeit und Datum gespeichert sind.

Auf dem mbed-Application-Board befindet sich eine Echtzeituhr, die das Datum und die Uhrzeit anzeigt. Es bietet UNIX-Zeitstempel und gibt die Zeit in Sekunden seit dem 1. Januar 1970 zurück. Die time-Library bietet Mechanismen zum Einstellen und Lesen der aktuellen Uhrzeit auf der Basis des RTCs des Mikrocontrollers sowie einige Standard-C-Manipulations- und -Formatierungsfunktionen. Sie initialisiert und setzt die Zeit des RTC auf die Zeit, die durch die Anzahl der Sekunden seit dem 1. Januar 1970 (dem UNIX-Zeitstempel) dargestellt wird. Errechnet kann dieser Wert über den UNIX Epochenkonverter.

set_time.cpp

#include "mbed.h"
int main() {
    set_time (1576268292);  // https://www.epochconverter.com/
    while (true) {
        time_t seconds = time(NULL);
        printf ("Time as seconds since January 1, 1970 = %d\n", seconds);        
        printf ("Time as a basic string = %s", ctime(&seconds));
        char buffer [32];
        strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds));
        printf ("Time as a custom formatted string = %s", buffer);        
        wait (1);
    }
}

Aufgaben

  1. Realisiere nach obigem Schema mit Flags für Funktionen von Ticker, Timeout und Counter.

All wikipages