kramann.info
© Guido Kramann

Login: Passwort:










1.2 Ansteuerung des Parallelports in C

  • Folgendes sehr einfache Programm ermöglicht es, über die Konsole Bitmuster einzugeben, die auf den Ausgangsport des Parallelports geschaltet werden und somit als ein- bzw. ausgeschaltete LEDs am Ausgangsport zu sehen sind.
  • Es funktioniert in dieser Form nur unter Linux.
#include<stdio.h>
#include<sys/io.h>
void sende(unsigned zahl)
{
    ioperm(0x378, 3, 1);
    outb(zahl,0x378);
}
int main(int anz,char** args)
{
    int i;
    unsigned zahl=0;
    if(anz!=2)
    {
        printf("Schreibt 8 Bit auf D0..D7 des Parallelports.\n");
        printf("Benutzung (Beispiel):\n");
        printf("schreibemuster 10110011\n");
    }   
    else
    {
        zahl = 0;
        for(i=0;i<8;i++)
        {
            zahl*=2;
            if(args[1][i]=='1')
                zahl++;    
        }
        printf("Sende dezimal %i\n",(int)zahl);
        sende(zahl);
    }
}

Code 1.2-1: Linux-Beispielprogramm in C zur Ansteueurung des Ausgangsports.

  • Das einzig wichtige ist hier die Funktion sende(...) mit den Aufrufen von ioperm(..) und outb(..)

int ioperm(unsigned long Portadresse, unsigned long Byteanzahl, int Einschalten)

  • Mit ioperm(0x378, 3, 1) wird der Zugriff auf die Portadresse 0x378 für eine Anzahl von 3 Bytes aktiviert.
  • Typische Adressen für den Parallelport sind:
  • In einer Geschwindigkeits-optimierten Programmversion sollte ioperm(..) nur einmal am Programmstart aufgerufen werden.
  • 0x278
  • 0x378
  • 0x3BC
  • Ohne den Befehl ioperm(..) kann kein Zugriff auf Schnittstellen-Eingabe und Ausgabe-Befehlem, wie outb(..) erfolgen.

outb(unsigned wert,unsigned long Portadresse)

  • Mit outb(5,0x378) wird die Zahl 5 als Ausgang auf die Portadresse 0x378 geschickt.
  • Die Funktion läßt sich nur mit root-Rechten aufrufen und nach Freigabe des Ports über ioperm(..) oder iopl(..).
  • Im Allgemeinen ist die Portfreigabe und die direkte Verwendung des Befehls nicht zu empfehlen, da damit auch die Möglichkeit eröffnet wird, dass andere Programme auf den Port zugreifen, oder fehlerhafte Aufrufe zu Abstürzen führen.
  • Für die in unserem Rahmen geforderten Hardware-nahen und schnellen Portzugriffe ist dies aber trotzdem sinnvoller, als die Verwendung von open(..)-Befehlen.
  • Das C-Programm wird mit root-Rechten kompiliert mit:
  • gcc -o schreibemuster schreibemuster.c
  • oder
  • gcc -O2 -o schreibemuster schreibemuster.c
  • Es gibt noch eine ganze Reihe weiterer Schnittstellen-Eingabe und Ausgabe-Befehle, die nicht jetzt besprochen werden:
  • outw, outl, outsb, outsw, outsl - Schnittstellen-Ausgabe
  • inb, inw, inl, insb, insw, insl - Schnittstellen-Eingabe
  • outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - unterbrochene Ein-/Ausgabe
  • (s. Linux-Manpages)

Übung

  • Schreiben Sie eine Lauflichtfunktion unter Verwendung einer Schleife als Pausenfunktion.
  • Schreiben Sie einen für Servos geeigneten PWM-Geber, der über den Parallelport arbeitet.
  • Recherchieren Sie eine geeignete C-Funktion, um ein exaktes Timing zu realisieren.
  • Weisen Sie die korrekte Funktionsweise mit Hilfe eines Multimeters oder Osziloskops nach.