Le funzioni di basicVVIO

Attenzione

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

Alcune delle costanti e delle macro in basicVVIO.h

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.

Le funzioni disponibili in basicVVIO.c

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.

word16 VVIOversion (void);

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;

void SlowDown (word16 slow)

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.

int16 LPT_Inizialize (word16 slot, word16 LPT)

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:

int16 LPT_WriteData (word16 slot, word16 data)

Scrive otto bit nel registro "data" della porta parallela

I parametri:

int16 LPT_WriteControl (word16 slot, word16 strobe, word16 linefeed, word16 inizialize, word16 select)

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.

int16 LPT_GetStatus (word16 slot)

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

int16 MAX147_InizializeBus (word16 slot, word16 LPT)

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.

int16 MAX147_GetData (word16 slot, word16 ch)

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.

int16 CD4094_Inizialize (word16 slot, word16 LPT)

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:

int16 CD4094_Write (word16 slot, word16 ch, word16 data, word16 immediate)

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)

Le funzioni disponibili in basicVV.c

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

int16 CD4094_NextStepBipolar (word16 slot, word16 motor, int16 microstep)

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.

int16 CD4094_NextStepUnipolarPack (word16 slot, word16 ch, word16 motor, int16 step) 

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

Scarica il file VVIO.tgz

I circuiti supportati dal progetto VVIO sono:

La documentazione è disponibile alle seguenti pagine:

Le vecchie funzioni di basicVVIO - OBSOLETO


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima