Questa pagina l'ho scritta molto tempo fa e contiene materiale obsoleto
L'uso è sconsigliato e non posso più fornire alcun supporto
Questa libreria è una raccolta di funzioni che permettono gestire in modo semplice alcuni dei circuiti che ho pubblicato sul sito www.vincenzov.net. Ad oggi sono supportati solo pochi circuiti (... diciamo che si tratta di una pre-release) ma se l'idea funziona penso di estendere il codice in modo significativo.
Questa pagina è parte del progetto VVIO: una libreria per l'I/O
La libreria è scritta in ANSI C (alcuni accorgimenti permettono di superare le particolarità di vari dialetti C), sono distribuite esclusivamente come codice sorgente e sono state scritte per essere indipendente dal sistema operativo utilizzato. L'hardware di riferimento è l'x86 e non prevedo estensioni ad altri sistemi.
La libreria è utilizzabile direttamente in ambiente MS-DOS ed in genere in sistemi operativi che non possiedono il concetto di device driver e di protezione dell'accesso all'I/O: basta compilarlo insieme al proprio programma, che deve essere necessariamente scritto in C.
Ho implementato un supporto per MS-Windows, compatibile con praticamente tutti i linguaggi a 32 bit.
In futuro penso di scrivere anche device driver per Linux (ma non chiedetemi quando!). E' possibile comunque utilizzare basicVVIO usando la funzione gcc ioperm().
Di seguito la descrizione di alcune macro e costanti che potrebbero essere utili nello scrivere programmi ad alto livello; altre definizioni possono essere trovate nel file "basicVVIO.h".
Si noti che non viene effettuato alcun controllo sugli argomenti delle macro!
IsHigh (dato, n) - Ritorna il valore del bit di dato in posizione n.
Esempio di uso: esegui un codice { ... } se il bit meno significativo di pippo vale 1:
if (IsHigh(pippo, 0)) { ... };
Set (dato, n) - Pone a 1 il bit n in dato
Reset (dato, n) - Pone a 0 il bit n in dato
Invert (dato, n) - Inverte il valore del bit n in dato
VERSION - Gli otto bit più significativi sono la versione principale della libreria, gli otto meno significativi la revisione.
MAX_LPT - Il valore massimo dell'identificativo delle porte parallele (default = 5, valori ammessi da zero a cinque inclusi)
LPT_ERROR, SELECT, PAPEROUT, ACK, BUSY - La posizione nel registro di stato della porta parallela di alcuni pin. Esempio: sapere il valore del pin "busy" contenuto in status:
busy = IsHigh(status, BUSY);
STROBE, LINEFEED, INIZIALIZE, SELECTIN - La posizione nel registro di controllo della porta parallela di alcuni pin.
Il file basicVVIO.c contiene una serie di funzioni che interagiscono direttamente con l'hardware. Se sono utilizzate in un programma per sistemi operativi che prevedono il concetto di protezione delle operazioni di ingresso / uscita (p.e. Windows NT oppure Linux) è necessario compilarlo come "driver" o utilizzare accorgimenti che ne permettono comunque il funzionamento.
Tutte le funzioni (escluse ovviamente quelle di tipo void) ritornano un codice di errore, sempre negativo, il cui significato è descritto nel file VVIOerrors.h.
Ritorna un codice che rappresenta la versione della libreria. Gli otto bit più significativi sono la versione principale, gli otto meno significativi la revisione.
Esempio di utilizzo:
versione = VVIOversion() >> 8;
revisione = VVIOversion() & 0xFF;
Rallenta le funzioni di scrittura sull'hardware, permettendo l'utilizzo di dispositivi particolarmente lenti con parallele particolarmente veloci.
I parametri:
Nota: l'effetto è globale ma è possibile modificare "run time" questo parametro per adeguarsi alle diverse periferiche.
Nota preliminare: per comprendere queste prime funzioni è necessario conoscere il funzionamento della porta parallela. Su www.vincenzov.net è disponibile un tutorial.
Questa funzione inizializza le variabili interne di una porta parallela, ponendo tutte le uscire a zero. Si noti che eventuali settaggi come SPP della porta o la richiesta di accesso esclusivo devono essere fatti al BIOS o sistema operativo prima di invocare la funzione.
I parametri:
Scrive otto bit nel registro "data" della porta parallela
I parametri:
Scrive 4 bit sui pin corrispondenti al registro di controllo della porta parallela.
I parametri:
Nota: 1 identifica una tensione "alta" sul pin esterno, indipendentemente dalla presenza dell'inverter hardware presente su alcuni pin.
Legge cinque bit dal registro di stato. Se il valore ritornato è maggiore o
uguale a zero, esso contiene l'immagine del registro di stato di cui sono
significativi solo 5 bit (gli altri valgono 0):
0, 0 , 0 , 0, 0, 0 , 0 , 0 busy, ack, paper_out, select, error, 0, 0, 0.
Il seguente codice, per esempio, restituisce il valore del bit "busy". Esso fa uso della macro "IsHigh" e della costante "P_BUSY", definite in basicVVIO.h
status = VVIO_LPT_GetStatus(lpt);
busy = IsHigh(status, BUSY);
I parametri:
Nota: 1 identifica una tensione "alta" sul pin esterno, indipendentemente dalla presenza dell'inverter hardware presente su alcuni pin
Nota: se il valore ritornato è negativo, si tratta di un codice di errore e il significato dei bit non è quello indicato
Nota preliminare: le seguenti due funzioni fanno riferimento al circuito mini-datalogger a cui si rimanda per la descrizione dell'hardware.
Questa funzione inizializza alcune variabili interne ed alimenta il circuito esterno. Si noti che eventuali settaggi come SPP della porta parallela o la richiesta di accesso esclusivo devono essere fatti al sistema operativo prima di invocare la funzione.
I parametri.
Legge un campione dal convertitore AD.
I parametri:
Ritorna un intero compreso tra 0 e 4095. Se il valore ritornato è minore di 0, si tratta di un codice di errore.
Nota preliminare: le seguenti due funzioni fanno riferimento al circuito Iso-Buffer a cui si rimanda per la descrizione dell'hardware.
Questa funzione inizializza alcune variabili interne. Si noti che eventuali settaggi come SPP della porta parallela o la richiesta di accesso esclusivo devono essere fatti al sistema operativo prima di invocare la funzione.
I parametri:
Scrive una parola di 16 bit su uno dei "canali" connessi alla porta parallela. Il significato di questa parola dipende dall'hardware effettivamente collegato ai registri SIPO.
I parametri:
Esempio d'uso:
CD4094_Write(1, 1, 0x0001, 0); // Aggiorna le variabili interne per il
canale 1
// Il bit meno significativo vale "1", tutti gli altri "0"
CD4094_Write(1, 2, 0x5678, 0); // Aggiorna le variabili interne per il canale 2
CD4094_Write(1, 5, 0xABCD, 1); // Aggiorna le variabili interne per il
canale 5 e
// scrive fisicamente tutti i canali (i canali 3, 4 e 6
// non cambino gli eventuali valori precedenti)
Il file basicVV.c contiene una serie di funzioni che non interagiscono direttamente con l'hardware e quindi non necessitano la compilazione come device driver, cosa che rimane comunque possibile.
Le funzioni, escluse ovviamente quelle di tipo void, ritornano un codice di errore, sempre negativo, il cui significato descritto nel file VVIOerrors.h
Per la descrizione dell'hardware si faccia riferimento alla pagina sul driver a micropassi ed eventualmente al tutorial sui motori passo-passo.
Calcola i valori da scrivere sull'hardware per far compiere al motore passo-passo bipolare una singola rotazione, di ampiezza programmabile. Si noti che non è effettuata alcuna operazione di I/O, da fare con la già descritta funzione CD4094_Write() come mostrato nell'esempio sotto riportato.
I parametri:
Esempio d'uso: rotazione di 1/16 di passo in verso "negativo" del motore 5 sulla parallela 1
packedData = CD4094_NextStepBipolar(1, 5, -4);
if (packedData < 0) {/*Gestione degli errori*/}
CD4094_Write (1, 5, packedData, 1);
Nota: per la rotazione del motore a velocità costante è necessario invocare la funzione ad intervalli regolari.
Per la descrizione dell'hardware si faccia riferimento alla pagina sul driver per motori passo unipolari ed eventualmente al tutorial sui motori passo-passo.
Calcola i valori da scrivere sull'hardware per far compiere ad un motore passo-passo unipolare una rotazione di ampiezza pari ad un passo (o a 1/2 di passo). Si noti che non è effettuata alcuna operazione di I/O da fare con la già descritta funzione CD4094_Write() come mostrato nell'esempio sotto riportato.
I parametri:
Esempio d'uso: rotazione di un passo in verso "negativo" del motore 0 della scheda 3 sulla parallela 1
packedData = CD4094_NextStepUnipolarPack (1, 3, 0, -2);
if (packedData < 0) {/*Gestione degli errori*/}
CD4094_Write (1, 3, packedData, 1);
Nota: per la rotazione del motore a velocità costante è necessario invocare la funzione ad intervalli regolari.
Tutti i file appartenenti al progetto VVIO sono contenuti nel file compresso VVIO.tgz.
licenza | La licenza d'uso che ho utilizzato |
basicVVxx.x | Il codice sorgente delle librerie |
DLL\ | La DLL per l'ambiente Windows |
SYS\ | Il device driver per WindowsNT/2000/Xp e relativi file di supporto |
I circuiti supportati dal progetto VVIO sono:
La documentazione è disponibile alle seguenti pagine:
VVIO - Versione 0.2a - Agosto 2003
Copyright © 2003, Vincenzo Villa
La licenza d'uso da leggere ed accettare prima di utilizzare il prodotto
MS-DOS, Windows 95, 98, Me, NT, 2000, Xp, VisualBasic, VisualC
sono marchi registrati da Microsoft Corporation
Delphi e TurboC sono marchi registrati da Borland Software Corporation
LabWindows/CVI è marchio registrato da National Instruments Corporation
Linux è marchio registrato da Linus Torvald
gcc e GNU sono marchi registrati da Free Software Foundation, Inc
Questo documento è disponibile nella sua forma integrale sul sito https://www.vincenzov.net.