Párhuzamos port vezérlése

Fórumok

Ü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ások

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?

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.

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?? :(

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. :)

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

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 );
}
}

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 );
    }
}