Digital IO / DIO / GPIO - Zugriff über ANSI C



  • Hi @lle!

    Ich schlage mich seit Tagen mit einem Problem rum, dass einfach nicht gelöst werden will!
    Und zwar hat mein Mainboard einen digitalen IO-Anschluß (8-bit), den ich gerne ansteuern würde. Im Prinzip reicht der Input, es soll nur ein beliebiges Bit ausgelesen werden. Das Problem ist nun, wie greife ich auf den Port zu? Alles außen rum ist erstmal egal, ich brauche nur den aktuellen Wert der einzelnen Eingangspins. Von Seiten des Hersteller gibt es leider gar nichts zu der Schnittstelle, bis auf ein paar Zeilen Assembler. Ich habe probiert diese Zeilen zu compilieren und dann mittels Debug zu schauen, was sich tut, wenn ich die Eingänge auf high oder low setze: Erfolglos! Hier erstmal der Assembler-Code:

    ------------------------------------------------
    Enter the extended function mode, interruptible double-write
    ------------------------------------------------
    MOV DX,2EH
    MOV AL,87H
    OUT DX,AL
    OUT DX,AL
    ---------------------------------------------------------------
    Configurate logical device 7(GP10~GP17), configuration register
    CRF0,CRF1,CRF2
    ---------------------------------------------------------------
    MOV DX,2EH
    MOV AL,07H ; point to Logical Device Number Reg.
    OUT DX,AL
    MOV DX,2FH
    MOV AL,07H ; select logical device 7
    OUT DX,AL ;
    MOV DX,2EH
    MOV AL,F0
    OUT DX,AL
    MOV DX,2FH
    MOV AL,00H ; 01:Input 00:output for GP10~GP17
    OUT DX,AL
    MOV DX,2EH
    MOV AL,F2H ;
    OUT DX,AL
    MOV DX,2FH
    MOV AL,00H ;Set GPIO is normal not inverter
    OUT DX,AL;
    MOV DX,2EH
    MOV AL,F1H
    OUT DX,AL
    MOV DX,2FH
    MOV AL,??H ; Put the output value into AL
    OUT DX,AL
    ------------------------------------------
    Exit extended function mode |
    ------------------------------------------
    MOV DX,2EH
    MOV AL,AAH
    OUT DX,AL
    

    Ansonsten kann man dem Manual noch entnehmen, dass die Ports die Adressen 2Eh und 4Eh bzw. 2Fh und 4Fh haben:

    8.1.1 GPIO Registers
    CRF0 (GP10-GP17 I/O selection register. Default 0xFF)
    When set to a '1', respective GPIO port is programmed as an input port.
    When set to a '0', respective GPIO port is programmed as an output port.
    CRF1 (GP10-GP17 data register. Default 0x00)
    If a port is programmed to be an output port, then its respective bit can be
    read/written.
    If a port is programmed to be an input port, then its respective bit canonly be read.
    CRF2 (GP10-GP17 inversion register. Default 0x00)
    When set to a '1', the incoming/outgoing port value is inverted.
    When set to a '0', the incoming/outgoing port value is the same as in data
    register.
    Extended Function Index Registers (EFIRs)
    The EFIRs are write-only registers with port address 2Eh or 4Eh on PC/
    AT systems.
    Extended Function Data Registers(EFDRs)
    the EFDRs are read/write registers with port address 2Fh or 4Fh on PC/
    AT systems.

    Hat evtl. irgendwer einen kleinen Tip, wie ich es über ANSI-C schaffe, den Zustand eines der Eingangsbits auszulesen? Vielen Dank allen konstruktieven Helfern!
    Grüße, Nummer5



  • Sorry, irgendwie war ich beim Posten wieder ausgeloggt! Der Beitrag ist von mir!

    Grüße, Nummer5



  • naja, in einem C-Programm hast du auch in()- und out()-Funktionen. Wenns da jetzt heißt

    MOV DX,2EH
    MOV AL,07H ; point to Logical Device Number Reg.
    OUT DX,AL
    

    dann heißt es in C halt out(0x2e, 0x07); (oder andersrum)

    Wie genau kommt aufs Betriebssystem an.


Anmelden zum Antworten