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