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?
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:
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:
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
-t lecserélem
-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 )