AUTOMATISMI ESTERNI COMANDATI TRAMITE LA PARALLELA
Utilizzare l'interfaccia parallela (lpt) del computer avere a disposizione una linea di dati in output a 8 bit e' veramente elementare. Basta considerare queste semplici cose: 1 i pin da 2 a 9 della connettore parallelo corrispondono ai -dati- da 0 a 7 (i bytes che vengono inviati normalmente durante le operazioni di stampa ad esempio) Per settare uno o piu' di questi pin sul valore zero o uno e' sufficiente usare l'istruzione portb(Assegnamento,dato) dove dato e' il bytes da inviare. ad esempio 255 mettera' a 1 tutti i bit relativi ai dati da d0 a d7.. Dato d7 d6 d5 d4 d3 d2 d1 d0 255 1 1 1 1 1 1 1 1 137 1 0 0 0 1 0 0 1 6 0 0 0 0 0 1 1 0 ecc... "Assegnamento" e' l'indirizzo di assegnamento della porta parallela che si intendera' usare. Solitamente questo indirizzo e' o 0x378 0 0x278 .. ma io non lo so!? ..he he .. me lo immaginavo. Si puo' trovare facilmente con due righe di c //--------------------------------------------------------------- #include#include void main(void) { unsigned int far *ptraddr; unsigned int address; int a; ptraddr=(unsigned int far *)0x00000408; for (a = 0; a < 3; a++){ address = *ptraddr; if (address == 0) printf(" (vuoto) LPT%d \n",a+1); else printf(" 0x0%X LPT%d \n",address,a+1); *ptraddr++;} } //--------------------------------------------------------------- emh.. pero' a voler essere onesti si potrebbe trovare anche a mano solo col debug! hi hi hi basta controllare gli 8 bytes a seguire la locazione di memoria 0040:0008 cosi': >debug -d 0040:0008 L8 avendo una risposta tipo questa: 0040:0008 78 03 78 02 00 00 00 00 sapremmo subito di avere la LPT1 su 0x378 e la LPT2 su 0x278. (Lpt3/4 non presenti) Il programma in C fa la stessa cosa ma volete mettere lo stile!? :)) .. per quanto riguarda invece l'uso dei pin della parallela al fine di controllare un carico con una discreta potenza potremmo usare queste soluzioni. 1. visualizzazione degli stati dei pin Pin d0 d1 d2 d2 d3 __|__ __|__ __|__ __|__ __|__ \ / \ / \ / \ / \ / \./ Led \./ Led \./ Led \./ Led \./ Led --|-- --|-- --|-- --|-- --|-- | | | | | \ \ \ \ \ / 470 ohm / 470 ohm / 470 ohm / 470 ohm / 470 ohm \ \ \ \ \ | | | | | +----------+----------+----------+----------+---------- Pin 18-25 2. Utilizzo di un relais per il controllo di un carico ad elevata potenza. 12V | +------+ | __|__ Relais /^\ 1N4002 a 12v /---\ | | +------+ | | / 1N4148 4.7K |/ PIN Dx >----|>|-+--\/\/\/--| 2N2222 | |\ E +-|<|-+ | 1N4148 | | GNDallel >-----------+------+ parallela | GND Perfetto! :)) .. abbiamo tutto quello che ci serve. Costruiremo N circuiti di tipo (2) per comandare N carichi diversi. Max 8! Si potrebbero avere piu' carichi utili volendo perche' la periferica parallela usa anche altri bit oltre a quelli -data- : status e control. L'automatismo che avevo pensato e' un banalissimo programma in C che legge le impostazioni sequenziali delle porte e le relative temporizzazioni da un file di testo scritto alla bisogna. (ps il programma che segue governa solo 4 carichi utili invece di otto perche' mi era stato richiesto cosi'. Per chi volesse cambiare da 4 a 8 e' necessario cambiare questo spezzone di codice -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- n1=atoi(s); fscanf(f,"%s",s);n2=atoi(s); fscanf(f,"%s",s);n3=atoi(s); fscanf(f,"%s",s);n4=atoi(s); fscanf(f,"%s",s);T=atol(s); p=time(NULL); outp(0x378,(n1+2*n2+4*n3+8*n4)); printf("Metto la porta a %d%d%d%d =%2d -> Timer %4ld secondi\n",n1,n2,n3,n4,n1+2*n2+4*n3+8*n4,T); -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- con questo (ovviamente dichiarando prima tutte le variabili e cambiando gli script di conseguenza!) -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- n1=atoi(s); fscanf(f,"%s",s);n2=atoi(s); fscanf(f,"%s",s);n3=atoi(s); fscanf(f,"%s",s);n4=atoi(s); fscanf(f,"%s",s);n5=atoi(s); fscanf(f,"%s",s);n6=atoi(s); fscanf(f,"%s",s);n7=atoi(s); fscanf(f,"%s",s);n8=atoi(s); fscanf(f,"%s",s);T=atol(s); p=time(NULL); outp(0x378,(n1+2*n2+4*n3+8*n4+16*n5+32*n6+64*n7+128*n8)); printf("Metto la porta a %d%d%d%d%d%d%d%d =%2d -> Timer %4ld \ secondi\n",n1,n2,n3,n4,n5,n6,n7.n8,n1+2*n2+4*n3+8*n4+16*n5+32*n6+64*n7+128*n8,T); -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- Il programma ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: AUTOMAC.C ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #include #include #include #include #include #include int vedi(char *prog); char *tolo(char *a); main (int a, char **b) { FILE *f; char s[10]; int n1,n2,n3,n4; long T; time_t p; if(a!=2) { printf("AUTOMAC file_script\n"); exit(0); } if(vedi(b[1])<0) { printf("file script [%s] non trovato\n",b[1]); exit(0); }; f=fopen(b[1],"rb"); while(!strstr(s,tolo("-inizio-")))fscanf(f,"%s",s); while(!feof(f)) { fscanf(f,"%s",s);if(strstr(s,tolo("-fine-"))){printf("\nFinito.\n");exit(0);} n1=atoi(s); fscanf(f,"%s",s);n2=atoi(s); fscanf(f,"%s",s);n3=atoi(s); fscanf(f,"%s",s);n4=atoi(s); fscanf(f,"%s",s);T=atol(s); p=time(NULL); outp(0x378,(n1+2*n2+4*n3+8*n4)); printf("Metto la porta a %d%d%d%d =%2d -> Timer %4ld secondi\n",n1,n2,n3,n4,n1+2*n2+4*n3+8*n4,T); while(time(NULL) =0)return 1; else return -1; } ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: uno script di esempio ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: script.scp ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Questo e' un semplice esempio di script ci puoi scrivere dentro quello che ti pare basta come testo che tra tra i due terminatori di inizio e di fine ci siano esclusivamente i dati relativi allo stato delle porte e il timer i dati sono formati da cinque numeri: i primi quattro sono lo stato dei "carichi" 1=acceso e 0=spento. Il quinto numero identifica per quanti secondi dovra' restare attivo quel particolare stato nello script sotto ad esempi .. alla partenza e' tutto spento per il primo secondo, quindi si accende il carico 2, dopo 2 secondi si accende anche il carico 3 assieme al 2, dopo un secondo il carico tre si spegne e dopo altro tre secondi si spegne anche il carico 2 accendendosi il 4 che resta acceso per 10 secondi dopo di che il carico uno lampeggia per due volte alla frequenza di un secondo ed e' tutto finito. ;-) c1 c2 c3 c4 Timer ------------------ -inizio- 0 0 0 0 1 0 1 0 0 2 0 1 1 0 1 0 1 0 0 3 0 0 0 1 10 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 -fine- ------------------ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .. trasformando il programma automac.c considerando tutti e 8 i carichi utili su i pin -data- lo script dovrebbe essere pero' scritto cosi' ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: script.scp ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: c1 c2 c3 c4 c5 c6 c7 c8 Timer ------------------------------ -inizio- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 2 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 3 0 0 0 0 0 0 0 1 10 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 -fine- ------------------------------ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sintassi AUTOMAC file_script Se a qualcuno interessa trovate nel file archivio.ace citato all'inizio anche un controllore di carichi in VB che sfrutta una dll scritta in C per leggere e scrivere singoli byte su una porta prefissata. VBIO.DLL
--------------
Testo dal mio articolo: "Anche la programmazione ha il suo Sgurtz" Sezione 17: Automatismo software in c per l'output tramite la porta parallela www.spippolatori.com/memberspp/master/articoli.php3