Párhuzamos port vezérlése

 ( Kuvik | 2007. március 25., vasárnap - 12:05 )

Üdv!

Az a problémám, hogy szeretnék néhány egyszerűbb vezérlést megvalósítani párhuzamos portra. Ehhez szükségem lenne az adat be/kivitelre, de sehogy sem akar összejönni. Megnéztem ezt: http://hup.hu/node/18950 nálam nem működtek az ott leírt dolgok. Aztán ezt: http://www.codexonline.hu/CodeX2/alap/notjsbeg/lpt02.htm , ebben assembly betétekkel próbálkoznak, de arra meg azt adja vissza a gcc, hogy

proba2.c: In function ‘main’:
proba2.c:7: error: expected ‘(’ before ‘in’
proba2.c:7: error: ‘in’ undeclared (first use in this function)
proba2.c:7: error: (Each undeclared identifier is reported only once
proba2.c:7: error: for each function it appears in.)
proba2.c:7: error: expected ‘;’ before ‘al’

Igazából azt sem tudom, hogy működik az assembly, csak beszúrtam azt a sort, amit ott találtam, de nem értem pl. azt se, hogy pl. a beolvasott adat milyen változóba kerül?

Valami olyan egyszerű dolgot szeretnék, ami pl. basicben valahogy így néz ki:

kivitel:
ki(adat,port száma)
beolvasás:
változó=be(port száma)

Erre van esetleg valakinek ötlete?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

I/O port programming mini HOWTO
Röviden:

const int PORT_BASE = 0x378;
unsigned char inputdata = inb (PORT_BASE);

PORT_BASE: data port
PORT_BASE+1: status port (r/o)
PORT_BASE+2: control port (w/o)
adat írása outb-vel, ugyanígy. És ha jól emlékszem, csak root jogokkal megy.

Kösz. Még ugyan nem próbáltam, de ha jól értem, az első sor azt csinálja, hogy deklarálja a PORT_BASE-t, aminek az értéke a port címe. A második pedig a beolvasást végzi az inputdata-ba. Két dolgot viszont nem értek:
1. Az inputdata miért char típusú? Nem inkább int kellene, hogy legyen? Vagy mindegy?
2. az inb-be nem lehet közvetlenül beírni a port számát?

1: azért, mert az inb 1 byte-ot olvas. Van automatikus konverzió szélesebb típusra, de felesleges.
2: lehetne

Aha. Kösz. Egyébként ennek milyen header kell? Lehet, hogy hülye kérdés, de ha nem tudom hogy egy utasításhoz milyen header kell, akkor honnan tudhatom meg? A gcc nem ír erre semmit, csak azt, hogy hiba.

Disztribuciotol fuggen kell a manpages-dev csomag. Majd man 2 inb. Ez az ioperm-et ajanlja, amibe benne van hogy a header a sys/io.h

Köszönöm, most már "működik", pontosabban hibaüzenet nélkül lefordul, de amikor futtatni akarom, akkor elszáll ezzel:

Szegmens hiba (core dumped)

Ez mitől van? A mainben egyelőre még csak ennyi van:

unsigned char a = inb (0x378);	
printf("%a/n");

Mint mondtam ez nem túl kulturált megoldás.

root jog kell hozzá.
És iopl 0 ra állítani.

iopl 0-án, futtatás rootként, de még mindig ugyanaz. :(

Előtte kell ioperm is, de ez már le van írva a manualban meg a mini-howto-ban is, amit linkeltem

Nem jobb user level driveren keresztül elérni. mint ahogy a nagy könyvben meg vagyon írva (És én is tettem anno) ?

De, biztos jobb lenne, de egyelőre "most jöttem le a fáról" (legalábbis ami a hardvervezérlést illeti), úgyhogy a "kultúrált megoldások" még fényévekre vannak tőlem. Most még a "csak működjön valahogy" kategóriánál tarok. Persze, ez nem azt jelenti, hogy nem szeretnék más/jobb megoldásokat megismerni, de most úgy tűnik, hogy a jelenlegi célkitűzéseimnek ez a módszer amit most erőltetek, megfelel. Azért köszönöm a segítséget, ha eljutok odáig, akkor megpróbálom majd megtanulni/használni azt is.

Ja, bocs, azt nem még nem rágtam át alaposan...

Kipróbáltam (volna) a howto-ban lévő példaprogramot, de fordításnál elszáll ezzel:

In file included from /usr/include/asm/io.h:7,
                 from proba2.c:3:
/usr/include/asm-i386/io.h:4:26: error: linux/string.h: Nincs ilyen fájl vagy könyvtár

De mi ez? Ha jól értem, nem találja a string.h-t? De azt nem is használom. Vagy kéne? De ha beírom, akkor se megy. Ráadásul a string.h standard header, hogy lehet, hogy "nem találja"? Vagy mi?? :(

kernel-headers , kernel-devel csoamgok a barátaid, szerintem.

Nem ez lesz a megoldás valószínűleg... letöltöttem őket, de ugyanaz. Viszont, ha az <asm/io.h> -t lecserélem <sys/io.h> -ra, akkor viszont jó! Szóval, nem akarom elkiabálni, de úgy néz ki működik. Köszönöm mindenkinek aki segített. Innen már talán egyedül is boldogulok. :)

Nezd meg a /proc/ioports fajlban hogy a parport cime az tenyleg 0x378 e.
Meg mi az a printf("%a/n"); ? Talan valami printf("%X/n", a); kellene.

Ja, télleg, javítva. Nem vagyok egyébként túl gyakorlott...

Szia!

Én használgatok egy programot, ami hasonlót csinál, de most nem találom neten. Ez tulajdonképpen egy PIC-szimulátor, de éppen ezért jó arra, amire használni akarod. PIC16F84-et szimulál és Microsim a neve.

Megvan a honlap is hozzá: http://linuxgazette.net/118/deak.html

ppdev -et használj, ha kulturáltan szeretnéd megoldani.
http://people.redhat.com/twaugh/parport/html/x916.html

Bar nem C, es akkor neked hiaba is mondom, de mi anno lpt portos dolgokat pascallal vezerelunk, es arrol a cuccokat lejegyeztem ide, ha gondolod nezd meg hatha ad otletet.

Kösz. Mondjuk nekem a Pascal szinte teljesen kimaradt. Alig találkoztam vele, talán még a legegyszerűbb iskolapéldákkal is gondom lenne. Basic-el kezdtem még kölyökkoromban, aztán amikor komolyabban kellett csinálni valamit, akkor jött a C meg a Java (meg a MatLab, ha programnyelvnek vesszük).

Az öntözővezérlésemhez ezt használom.
Cronból hívogatom, a kapcsolandó kör megadásával.

Remélem segít.
(Az include sorok nem jól jelentek meg, így az extra 2*2db space eltávolítandó.)

#include < stdio.h >
#include < sys/io.h >

#define PPORT0 0x378

int main( int argc, char **argv ) {
int i;

if( argc < 2) {
printf( "Legalabb 1 ertek nem artana...\n" );
exit( 1 );
}

if( ioperm( PPORT0, 3, 1 ) == -1) {
perror( "ioperm\n" );
exit(1);
}

i = atoi( argv[1] );

if( i == 0 ) {
outb( 0, PPORT0 );
} else {
outb( (char)(1 << --i), PPORT0 );
}
}

STP tedd [ code] [ /code] közé,

Köszi...

Ez volt az első Linuxos C progim. (És a pozíciója nem változott :D )

#include <stdio.h>
#include <sys/io.h>

#define PPORT0 0x378

int main( int argc, char **argv ) {
    int i;

    if( argc < 2) {
        printf( "Legalabb 1 ertek nem artana...\n" );
        exit( 1 );
    }

    if( ioperm( PPORT0, 3, 1 ) == -1) {
        perror( "ioperm\n" );
        exit(1);
    }

    i = atoi( argv[1] );

    if( i == 0 ) {
        outb( 0, PPORT0 );
    } else {
        outb( (char)(1 << --i), PPORT0 );
    }
}