Anzeige:
Ergebnis 1 bis 7 von 7

Thema: C-Code mit gcc kompilieren

  1. #1
    vb60freak
    Gast

    Exclamation C-Code mit gcc kompilieren

    hi, ich hab ein kleines problem mit der kompilierung von c-code mit dem kompiler gcc. das programm funktioniert so wie es hier ist unter windows einwandfrei (da kompiliert mit MS-VC++ !!) nur unter linux (suse 7.0) macht die kompilierung probleme. das programm steuert ein 2x20 display an. kompilierungsfehler im asm-teilstück...

    kann mir da jemand weiterhelfen ?

    gruß vb60freak

    Quellcode:

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <tchar.h>



    unsigned char ContrPort;

    void delay(int milliseconds){
    int i;
    for ( i = 0; i < 40000; i++ )
    {}
    }

    void Out32(short PortAddress,unsigned char Value){
    __asm{
    push dx
    mov dx,PortAddress
    mov al,Value
    out dx, al
    pop dx
    }
    }

    void SendLCD(unsigned char Bit){
    //{sequenzielles der 8-bit daten, instructionscodes über Strobe-Leitung (Hardware)
    // Zeitverzögerung zur Anpassung des PCs an die Geschwindigkeit des LCD-Displays}
    Out32(888,Bit);
    delay(1);
    Out32(890,ContrPort); //Strobe toggeln
    delay(1);
    Out32(890,ContrPort+1); //Strobe toggeln
    delay(1);
    }

    void init(void){
    //{Initialisierung des Displays}

    ContrPort=10; //Commands Set
    SendLCD(48); //Set
    delay(5); //Warten > 4.1ms
    SendLCD(48); //Set
    delay(1); //Warten >100us
    SendLCD(48); //Set
    SendLCD(56); //8 bit
    SendLCD(8); //Set_Display + Cursor_Off + Blink_Off
    SendLCD(1); //Clear Display
    SendLCD(6); //Set_Entry_Mode + Increment_Address + Shift_Display_Off
    SendLCD(12); //display ON, cursor OFF, blink Off
    ContrPort=14; //Data Set
    }


    void write(char tl1[40],char tl2[40]){ //Displaydaten aufbereiten > in Variable sammeln und in einzelne Chars vereinzeln
    int LCDCode, Zaehler, Zaehler2, tl1len, tl2len ,x;
    char LCDDaten[80];
    init(); //Initialisierung des Displays
    Zaehler = 0;
    Zaehler2 = 0;
    x=0;
    tl1len = strlen( tl1 );
    tl2len = strlen( tl2 );
    while( Zaehler != (tl1len)) {
    LCDDaten[Zaehler] = tl1[Zaehler];
    Zaehler++;
    }
    while( Zaehler != 40) {
    LCDDaten[Zaehler] = ' ';
    Zaehler++;
    }
    while( Zaehler2 != (tl2len)) {
    LCDDaten[Zaehler] = tl2[Zaehler2];
    Zaehler++;
    Zaehler2++;
    }
    while( Zaehler2 != 40) {
    LCDDaten[Zaehler] = ' ';
    Zaehler2++;
    Zaehler++;
    }
    Zaehler = 0;
    while( Zaehler < 80) {
    LCDCode = __toascii( LCDDaten[Zaehler] ); //Daten für Display aufbereiten ASCII > 8-bit
    SendLCD(LCDCode);
    Zaehler++;
    }
    }

    void main(void){

    write("Hallo Welt !"," ");
    }


    [CODE]

  2. #2
    Registrierter Benutzer
    Registriert seit
    22.03.2001
    Beiträge
    650
    Assembler ist sehr Plattform- und Compilerspezifisch; das muss immer extra portiert werden und vermutlich liegt es daran.

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.09.2002
    Ort
    Bruchsal
    Beiträge
    164
    Das Sprachkonstrukt __asm {} ist eine Microsoft-Erweiterung und steht im gcc nicht zur Verfügung, nachzulesen in der MSDN.
    Dürfen Linux-Programme überhaupt Daten an IO-Ports senden (das was die Assemblerroutine macht)?
    Lichtblick: Dein Programm scheint die Druckerschnittstelle anzusprechen (888=0x378), das geht unter Linux über die Gerätedateien in /dev/

    Die Funktion delay() ist übrigens unvollständig, und eine Schleife ist nicht wirklich dazu geeignet, den Prozess schlafen zu legen, benutze stattdessen nanosleep()

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von The Ripper

    Dürfen Linux-Programme überhaupt Daten an IO-Ports senden (das was die Assemblerroutine macht)?
    Mit den nötigen Rechten, ja.



    Lichtblick: Dein Programm scheint die Druckerschnittstelle anzusprechen (888=0x378), das geht unter Linux über die Gerätedateien in /dev/
    Ich hab mal in einem Labor ein LCD über Parallel Port eines Mikrocontrollers angesprochen.
    Auf eine PC sollte es reichen, einzelne Bits am Parallelport zu ändern und dem Treiber zu überlassen, wei er das macht.

    Unter Linux kann man sowas zB mit parapin machen: http://www.circlemud.org/~jelson/software/parapin/

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    vb60freak
    Gast

    Question wie ???

    ne idee, wie ich das programm umändern könnte, wenn ich über die gerätedef. von /dev/lp0 gehe ??

    gruß vb60freak

  6. #6
    Registrierter Benutzer
    Registriert seit
    08.11.2002
    Ort
    Hennef
    Beiträge
    106
    Auch wenn der Compiler das programm ohne
    Fehler durchorglen sollte, wird das nicht funktionieren.

    benutze die io Funktionen die man im Userspace
    benutzen sollte für solche Sachen.

    man ioperm
    man outb

    gruß
    Geändert von pik7 (30-11-2002 um 16:04 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    22.03.2001
    Beiträge
    650
    Vom Parallelport gibt es mehrere Versionen: EPP, ECP, Standard und die haben jeweils mehrere Register an verschiedenen Adressen. Standard hat man immer.
    Wenn man weiss wohin die Daten müssen, kann man die z. B. mit outb(vAlUe,pOrT) schreiben, aber es geht auch mit 16-Bit-Zugriffen auf zwei benachbarte Register gleichzeitig (mit 4 Registern u. 32-Bit-Zugriff müsste es auch gehen).
    Unter www.linuxmagazin.de findet man einige Artikel zum Parallelport.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •