taskit MoDOS II

Anwendungsbeispiel


Demonstration von Ausgabe und Powermanagement des MoDOS II

Eines der wichtigsten Features beim MoDOS II ist die Möglichkeit Strom zu sparen, da er mit Akkus betrieben wird. Hier ist ein einfaches Beispiel das in der Praxis sehr oft anwendbar ist. Oft wartet ein Programm auf eine Eingabe vom Benutzer. Obwohl nichts geschieht wird trotzdem viel Strom verbraucht. Um nun den Stromverbrauch zu reduzieren kann man das MoDOS II für diese Wartezeit "schlafen" legen bis die Eingabe vom Benutzer getätigt wird, um dann wieder zu "erwachen" und die Eingabe zu verarbeiten.

Geschrieben wurde dieses Programm für PowerBasic 3.2 es sollte aber auch mit anderen Basic Varianten Funktionieren.



Beispiel:



' ***************************************************************** '
' *** Demonstration von Ausgabe und Powermanagement des MoDOSII *** '
' ***************************************************************** '
' * Geschrieben wurde dieses Programm für PowerBasic 3.2          * '
' * es sollte aber auch mit anderen Basic Varianten Funktionieren * '
' * Kompilieren: PBC PM_DEMO.BAS -CE                              * '
' ***************************************************************** '

' -----------  Konstanten und Sonderzeichen definieren  ----------- ' 
ENTER$ = CHR$(13) + CHR$(10)  ' ENTER = Carriage Return + Line Feed

' Die folgenden Konstanten werden benötigt um den Sparmodus zu aktivieren
' sie sind dem MoDOSII Handbuch (Abschnitt: BIOS Referenz) zu entnehmen
%SPEED_VECTOR = &h15     'INT Interrupt
%SPEED_FUNC   = &hC300   'AH Speed Funktion
%MODE_DOWN    = &h0013   'AL Modus POWERDOWN
%VERY_LOW     = &h0000   'BL Sparnivieau

' ------------------  Funktionen bekanntmachen  ------------------- '
' *** Sparmodus aktivieren 
    DECLARE SUB PM_DOWN_MODE()
' *** Text auf den LCD ausgeben 
    DECLARE SUB printc(zeile AS STRING)
' *** Text unter Verwendung der Sparfunktion(PM_DOWN_MODE) einlesen 
    DECLARE FUNCTION PM_GETSTRING() AS STRING
' *** Tastaturpuffer leeren, da sonst das Erwachen durch Interrupt gestört wird 
    DECLARE SUB FLUSH_STDIN()



' -----------------------  Das HAUPTPROGRAMM  --------------------- ' 
DIM ihr_name AS STRING
' Meldung auf dem LCD ausgeben
printc(ENTER$ + "Bitte ihren Namen")
printc(ENTER$ + "eingeben:")
' Name einlesen 
ihr_name$ = PM_GETSTRING
' Name auf dem LCD ausgeben 
printc(ENTER$ + ENTER$ + " Hallo " + ihr_name$ + "!")
printc(ENTER$ + ENTER$ + "mit ENTER beenden")
' Sparmodus aktivieren bis das Programm beendet wird 
DO
    PM_DOWN_MODE
LOOP WHILE INKEY$ <> chr$(13) ' wenn gedrückte Taste ENTER (chr$(13)) ist ->
' Programm beenden 
END
' ---------------------  Ende des HAUPTPROGRAMMs  ----------------- '



' ----------------------  Funktionen definieren  ------------------ '

' *** versetzt den Rechner in den POWERDOWN-Mode
' *** zum Normalbetrieb durch IRQ (4ms) (MATIXTASTATUR UND COM)
' *** das MoDOS ist so konfiguriert das es je Sekunde einen interrupt auslösst 
SUB PM_DOWN_MODE()
    ' falls zuvor eine Textausgabe auf das LCD stattgefunden
    ' hat, wird hier die Aktualisierung erzwungen 
    CALL interrupt &h72             ' LCD BIOS 
    reg 1, %SPEED_FUNC + %MODE_DOWN ' AX Parameter festlegen 
    reg 2, %VERY_LOW                ' BX (BL) Parameter 
    CALL interrupt %SPEED_VECTOR    ' Funktion ausführen 
    delay(0.05)                     ' Aufwachzeit ~5ms 
END SUB

' *** Textusgabe (BIOS Funktion) auf das LCD
' ### Parameter: Ausgabestring
' !!! Stringverknüpfung mit "+" möglich 
SUB printc(zeile AS STRING)
    DIM counter AS INTEGER
    FOR counter% = 1 TO len(zeile$)  ' Schleife: Alle Zeichen einzeln ausgeben 
        reg 1,&h0200                 ' Text ausgeben 
        reg 4,asc(MID$(zeile$, counter%, 1))    ' Paramter: ein Zeichen 
        call interrupt &h21          ' LCD Erweiterungs-BIOS Funktion ausführen 
    NEXT
END SUB

' ******* Ein String einlesen  ****************** '
' Daniel Carl @ taskit GmbH '
' Erstellt: 21.01.2005                            ' 
FUNCTION PM_GETSTRING$()
    DIM keyAS STRING, , inputstring AS STRING
    DIM position AS INTEGER, max_length AS INTEGER
    key$    = ""         ' Tastatureingabe
    position%    = 0     ' Stringposition
    max_length%  = 255   ' maximale Stringlänge
    inputstring$ = ""    ' fertiger String 

    DO
        PM_DOWN_MODE        ' "SCHLAFEN" legen, Aufwachen bei Tastendruck(IRQ)
        key$ = INKEY$       ' gedrückte Taste einlesen
        ' falls während der "Aufwachphase" mehrere Tasten gedrückt wurden diese
        ' löschen, da dies den Ablauf stören würde 
        FLUSH_STDIN

        ' wenn die Eingabe ein Zeichen war, dieses an den String anfügen 
        IF key$ <> "" AND key$ <> CHR$(8) AND key$ <> CHR$(13) THEN ' CHAR 
            ' nur dann anfügen wenn die Maximale stringlänge noch nicht
            ' erreicht ist 
            IF position% = max_length% THEN
                beep
            ELSE
                printc(key$)                       ' Eingabe anzeigen
                inputstring$ = inputstring$ + key$ ' Eingabe anhängen
                position% = position% + 1          ' Stringposition erhöhen
            END IF
            key$ = ""

        ' wenn DEL gedrückt wurde und schon ein Zeichen eingegeben wurde,
        ' dieses löschen 
        ELSEIF key$ = CHR$(8) AND position% <> 0 THEN ' DEL 
            printc(CHR$(8) + " " + CHR$(8))  ' Zeichen von Anzeige löschen 
            position% = position% - 1        ' Stringposition dekrementieren 
            inputstring$ = LEFT$(inputstring$, position%) ' Zeichen löschen 
            key$ = ""
        END IF
    LOOP WHILE key$ <> CHR$(13) ' solange bis ENTER gedrückt wird 

    FUNCTION = inputstring$    ' Eingegeben String zurückgeben 
END FUNCTION

' tastaturpuffer leeren 
SUB FLUSH_STDIN()
    DIM counter AS INTEGER, zeichen AS STRING 
    counter% = 0
    DO
        zeichen$ = INKEY$
        counter% = counter% + 1
    LOOP WHILE counter% <> 256 ' Tastaturpuffer von 256  
END SUB 
taskit Embedded Systems

embedded
systems


deutsch

english

Back to topZurück nach oben  •  Read this page in English

taskit GmbH  /  Tel: +49(0)30 / 611295-0  /  info(at)taskit.de

ISO9001
certified

taskit Embedded Systems - Logo