Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

7
voti

Guida programmazione porta parallela in C

Indice

Guida completa programmazione porta parallela in linguaggio c sotto unix

La porta parallela è una periferica del pc che permette di connettere al pc stesso diversi apparecchi come stampanti e altri dispositivi.
Sotto linux non sarà difficile riuscire a scrivere un programma in linguaggio c che sia capace di comandare l'input e l'output sugli 8 bit dati del connettore.
In pratica collegando gli 8 bit di uscita a dei Led (con opportuna resistenza) o verificando lo stato con un tester sarà possibile osservare se i pin hanno un livello alto di tensione (numero 1 logico) di circa 3,5V o un livello basso (massa-0V). Prima di tutto occorre:

  • Disporre di un pc fisso o portatile con porta parallela (è una grande connettore femmina rosa o in alcuni casi verde con 25 fori per il collegamento);
  • Aver installato ubuntu (io ho testato sulla versione 10.10). Questo sistema operativo è gratuito e scaricabile ed installabile da qua ;http://www.ubuntu-it.org/ (necessari 10 Gb di spazio libero sul proprio hdd);
  • Aver installato il compilatore gcc con il comando da terminale sudo apt-get install gcc build-essential ;
  • Aver installato un buon editor per linguaggio c come scite editor (reperibile in ubuntu software center);
  • Aver installato le librerie ncurses.h , asmio.h e io.h con specifico percorso. Le librerie possono essere installate dal programma di gestione dei pacchetti in cui si potrà effettuare una ricerca delle librerie stesse ed installarle;
  • Essere entrati come amministratori nel pc e nel terminale con il comando su e in seguito la password di amministratore vostra;
  • Un po' di conoscenza del linguaggio C (funzioni di base e conoscenza numeri esadecimali) e dell'elettronica di base (cosa è un led o una resistenza e saper calcolare la corrente che passa attraverso di essi, noi lavoreremo con circa 5mA max altrimenti si rischia di bruciare la porta del PC);

Per prima cosa accedere al terminale come root, come descritto in precedenza, poi installare il gcc e infine l'editor per linguaggi di programmazione scite text editor.

Il programma che scriveremo come esempio avrà bisogno delle librerie: stdio.h, stdlib.h e soprattutto io.h di cui dovrà essere specificato l'indirizzo nell'inclusione (se non sono nella cartella base delle librerie) ad esempio

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

le librerie, come già detto sono installabili dal gestore pacchetti oppure se si è un po smanettoni è possibile scaricarle ed infilarle nelle cartelle del gcc in modo da poterle utilizzare senza dover descrivere il persorso. Se si preferisce un modo semplice per utilizzare le librerie è possibile fare in questo modo:
Scaricarle da internet ed inserirle nella stessa cartella dove poi salvere il programma. Nell'inclusione in linguaggio C sostituire le parentesi angolari <> con le virgolette ".

PRIMA FASE: COLLEGAMENTO DELLE USCITE DELLA PARALLELA A DEI LED (MONTATI EVENTUALMENTE SU DI UNA BREAD BOARD)

Accendete il PC su linux-ubuntu.
La parallela ha 25 pin di cui 8 sono utilizzabili per input e output. I pin che ci interessano sono dal 2 al 9 che corrispondono a D0, D1, D2, D3, D4, D5, D6, D7. La D sta per dato. Su ogni dato si può scrivere un bit.

  • Qui potrete trovare uno schema della porta parallela.

La porta parallela può erogare al massimo 5 mA per bit dati quindi tenedo conto che un led ha una V di circa 2V (dipende dal Led e dal colore) si ottiene che R = (3,5- tensione_led)/0,005 = 300 ohm nel mio caso con led da 2V. Dato che in commercio il valore più vicino vale 330 ohm utilizzeremo proprio queste (anche da 270 e 390 vanno bene solamente che i led si accenderanno un po meno o forse troppo con 270);
La massa del PC e del nostro circuito esterno deve essere messa in comunicazione con un cavetto che dalla porta parallela (dal pin 18 al 25) sia collegato alla massa del nostro circuito esterno altrimenti non si accenderà nessun led perchè la corrente non avrebbe modo di tornare al PC);
A questo punto, se non si sta lavorando su bread board, isolare bene le uscite tra di loro cercando di evitare di fare cortocircuiti;

NON MI ASSUMO NESSUNA RESPONSABILITÀ' IN CASO DI CORTOCIRCUITI CHE POTREBBERO DANNEGGIARE LA SCHEDA MADRE IN MODO IRREPARABILE. TUTTI I COLLEGAMENTI DEVONO ESSERE EFFETTUATI CON PC SPENTO.

SECONDA FASE: CREAZIONE DEL PROGRAMMA PER SCRIVERE UN BYTE (8 BIT) DI DATI SULLA PARALLELA

Aprire scite text editor o un'altro programma di editor in C e salvare il file con un nome come parallela.c . Nella stessa cartella o directory dove avete salvato il file dovrete inserire le librerie (file .h) come ncurses.h e io.h. Ecco un esempio di programma da inserire in scite editor o equivalenti per testare la parallela:

#include <stdio.h>
#include <stdlib.h>
#include </usr/include/sys/io.h>     /*questo se io.h è stata installata con gestore pacchetti altrimenti utilizzare #include "io.h"                      /*se il file di libreria è nella stessa cartella del programma da noi scritto                         altrimenti usate le parentesi angolari*/
#define PORT 0x378                        /*assegno il nome PORT all'indirizzo della parallela*/


int main (void) {
int uid = getuid();          /*controllo che utente sono*/
                           /*se non sono root acquisisco i privilegi con un setreiud() */
if (uid)   
setreuid(0,0);

/*Attivo la porta e i permessi di scrittura sulla porta*/
if (ioperm(PORT,3,1)<0) {    
         exit(1);
}

/*Torno ad essere un utente normale*/
setreuid(uid,uid);

/*Faccio un ciclo infinito dove accendo per un secondo tutto le uscite e poi le spengo per un altro secondo*/
while(1)
{
outb(0xFF,PORT);
sleep(1);
outb(0x00,PORT);
sleep(1);
}

return 0;
}

Finito di scrivere il programma compilarlo ed eseguirlo premento prima F7 e poi F5.
Se vi saranno segnalati dei warning nel pannello di uscita come implicit declaration of function ..... non fateci caso funzionerà tutto lo stesso.
Con questo programma è possibile far lampeggiare tutte le uscite simultaneamente.
La funzione sleep ci permette di bloccare il programma per un secondo mentre outb permette di scrivere sulla porta. Il primo parametro di outb, 0xFF, indica il valore da scrivere sulla porta mentre il secondo indica su quale indirizzo, infatti all'inizio del programma, PORT è definito come 0x378 che è proprio l'indirizzo della LTP 1 (porta parallela 1).
Se si possiedono più porte parallele basterà cercare il loro indirizzo in memoria e sostituirlo a 0x378 oppure aggiungerla come seconda periferica ed avere così la disponibilità di 16bit (2 Byte).
Divertitevi a cambiare i primi parametri di outb aggiungendone alti e facendo giochi di luce. Poi con un po' di esperienza si potranno usare le porte per comandare motori circuiti e non solo dei semplici led.

TERZA FASE: ESECUZIONE DEL PROGRAMMA DA TERMINALE:

Aprire il terminale di unix da applicazioni>accessori.
Digitare il comando su e dare invio. Quando appare la scritta password inserire la password di amministrazione e dare invio (anche se non la mostra in realtà sta la scrivendo).
Ora digitare gcc -o nome_del_programma.o nome_del_programma.c e dare invio (nome del programma è il nome con cui avete salvato il file in precedenza e questa riga di codice crea un file eseguibile con lo stesso nome del programma in C che avete salvato in precedenza).
Infine digitare ./nome_del_programma.o e dare invio (questo comando esegue il programma che da linguaggio C è stato trasformato in eseguibile dal PC). I led dovrebbero aver cominciato a lampeggiare. (con nome_del_programma è inteso il nome con cui avete salvato il file).

SPERO CHE LA GUIDA SIA STATA DI VOSTRO GRADIMENTO SE AVETE DUBBI O DOMANDE NON ESITATE A CONTATTARMI AL INDIRIZZO DI POSTA ELETTRONICA

  • dilielloneluca@yahoo.it,
  • mandatemi un messaggio o contattatemi nel forum!!

MAGARI CERCHERO' DI FARE UNA GUIDA SIMILE ANCHE PER WINDOWS XP.

copiright@Luca Di Liello

11

Commenti e note

Inserisci un commento

di ,

Allora.....la porta parallela, come ogni altro componente del computer, viene mappata in memoria all'accensione del pc stesso. Mappata vuol dire che le verrà dato un indirizzo che servirà per trovarla quando il computer deve fare delle operazioni con essa. Di solito questo indirizzo è 0x378 (ox vuol dire che è esadecimale) quando la parallela è integrata sulla scheda madre. La porta parallela ha anche il nome di LTP1 se è la numero 1 altrimenti LTP2 ecc.. Quando attacchi un nuovo dispositivo al tuo computer subito gli viene assegnato un indirizzo libero in memoria tramite il quale verrà rintracciato nel caso servirà comunicare con questo nuovo dispositivo. Quando collegherai l'adattatore usb-parallela un indirizzo in memoria verrà riservato. Questo indirizzo si può controllare da gestione dispositivi su windows e su linux non ricordo la procedura esatta. Troverai scritto qualcosa simile a "Intervallo di memoria o indirizzi: 0000000BCA820-0000000BCA82F Siccome la porta parallela ha una parola da 1 solo byte (cioè ha solo 8 bit per trasferire i dati) è sufficiente un solo indirizzo per trovarla in memoria. Come già detto normalmente questo è 0x378. Se quella nuova che colleghi ha 0x00000000000245 per esempio tu nel programma dovrai cambiare l'indirizzo su cui scrivere sostituendolo con 0x245 nella define all'inizio del programma stesso. Spero di aver migliorato un po le cose altrimenti cerca qualche semplice spiegazione in rete sulla mappatura delle risorse di un pc e come funzionano gli indirizzi. E' come una grande città, ci vogliono degli indirizzi per ricordare dove tutte le cose vengono messe. Se non si sa l'indirizzo il postino non sa dove portare il dato......ogni nuova casa avrà un nuovo indirizzo per essere collegata.

Rispondi

di ,

non ho capito ma non per colpa tua e che sono digiuno di linux però sarebbe utile risolvere questo problema visto che la porta parallela sta diventando introvabile.

Rispondi

di ,

No scusami quello di base della parallela integrata sulla mobo è di solito 0x378 e non 0x300 Pardon

Rispondi

di ,

No mi spiace ma io ho fatto tutto su un fisso abbastanza vecchiotto che ho a casa col pentium III e la parallela di base. Comunque con l'adattatore che dici, quando è collegato ed hai installato i driver, vai su gestione dispositi di Linux e nelle impostazioni cerchi "intervallo di memoria" e sostituisci quel numero esadecimale che trovi, per esempio 0x345, nella define del programma dove dai il nome a PORT. In questo modo non scriveremo più sull'indirizzo di base della parallela dei pc fissi che è 0x300 ma su quello che hai messo te e spero che funzionerà. Spero che tu abbia capito :)

Rispondi

di ,

Davvero molto interessante , hai provato per caso a vedere se il tutto funziona con un adattatore usb-parallela in quanto oggi trovare una porta parallela su un pc portatile e non, è difficile.

Rispondi

di ,

Indentare

Rispondi

di ,

Scusami cosa vuol dire indentare?

Rispondi

di ,

Bravo, ottimo lavoro, se riesci a indentare il codice sarebbe più facile da capire. Continua così!

Rispondi

di ,

Grazie ora spero che sarà utile a qualcuno come me a cui piacciono i sistemi meccanici-elettronici

Rispondi

di ,

No, non era accettabile. La nostra redazione lo ha sistemato

Rispondi

di ,

Scusate ma il sito mi ha attaccato tutto il codice C e non si capisce molto bene come l'originale ma è accettabile credo

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.