[prog-it] Re: porta seriale

  • From: "Seeman79" <Seeman79@xxxxxxxxx>
  • To: <prog-it@xxxxxxxxxxxxx>
  • Date: Sun, 02 Jun 2002 22:56:10 +0100


From: "valerio" <valerio_ligabue@xxxxxxxxx>
Subject: [prog-it] Re: porta seriale
Date: Sun, 2 Jun 2002 16:52:43 +0200


|[snip]
| Infatti , ma sul Kerninghan Ritchie, almeno dall'indice,
| non ha visto nulla che facesse riferimento all'assembler.
| Spero che, trattandosi comunque di C, almeno qualche analogia
| ci sia.
Per quanto riguarda l'inline assembler non cambia molto; ma
cio' non dipende dal linguaggio in se'.

| Per ora voglio solo accendere un led collegato tra il pin 2
| della porta parallela e massa (pin 25).
Come ti ho premesso l'altra volta io non leggo quella rivista,
ma, siccome tu continui a parlarmene, mi hai incuriosito.
Sono andato al sito:

http://www.webriviste.com/ioprog.asp

Leggendo la recensione, trovo:
--
In proseguimento all'articolo sulla programmazione della porta
parallela con Delphi questo mese ci viene mostrato come realizzare
un semplice circuitino con 8 led per verificare il risultato delle
operazioni effettuate dal programma.
---

Ho interrotto la lettura dell'articolo a questo punto e non l'ho
piu' terminato.
Vediamo di ragionare; come puo' essere un led?
"Acceso" o "Spento"; cio' potrebbe essere tradotto con:

#define ACCESSO 1
#define SPENTO  0

typedef int Boolean;

Boolean led[8] = { SPENTO, SPENTO, SPENTO, SPENTO,
                   SPENTO, SPENTO, SPENTO, SPENTO 
                 };

"led" ha tutta l'aria di essere un bit vector; ogni elemento
e' rappresentato da un Booleano che ci dice se tale elemento
e' "ACCESO" oppure "SPENTO". Agendo su ogni i-esimo componente
di "led" decidiamo se accenderlo o spegnerlo.

Come ragionamento di base sembra funzionare, ma in realta', per
quello che serve ai nostri scopi, e' folcloristico :)
Ho esordito con questo ragionamento pero', per introdurti un
meccanismo piu' "furbo", dal mio punto di vista, per fare la
stessa cosa.

Per scrivere sulla porta abbiamo a disposizione la funzione
void outportb(int indirizzo_porta, unsigned char pippo);

Come argomento da scrivere sulla porta accetta un unsigned
char... ovvero un byte che assume tutti i valori nell'intervallo
chiuso [0; 255], da cui deduciamo che abbiamo a disposizione
esattamente 256 configurazioni diverse possibili e che
riusciamo a rappresentare in "Log in base 2 di 256" bit, ovvero
8... 8 come i nostri led.

Se a questo aggiungiamo che un bit puo' assumere solo 2 valori
0 e 1, cosi' come i nostri led possono essere o accesi o spenti,
il tutto sembra essere un segno del destino.

In sostanza l'idea e' di trattare un byte come un vettore di 8
bit, "posizionando" ciascun bit su 1 se vogliamo il relativo led
acceso, o su zero se lo vogliamo spento; praticamente utilizziamo
un codice a lunghezza fissa su 8 bit per descrivere lo stato dei
relativi 8 led.

Vediamo di fare qualche esempio (usando come convenzione che il
primo bit che prendiamo in esame sia quello di sinistra):

Seq. Bit         Byte           Stato Led
00000000           0           Tutti spenti
11111111         255           Tutti accesi
10101010         170      Led n. 1-3-5-7 accesi, altri spenti
01010101          85      Led n. 2-4-6-8 accesi, altri spenti
01000001          65      Led n. 2-8 accesi, altri spenti 

In questo modo con un'unica scrittura sulla porta riusciamo a
controllare tutti gli 8 led.
Concludendo per, ad esempio, accendere tutti i led sulla porta
COM1 ti basta fare outportb(0x3F8, 255);

Non so come hanno risolto sul giornale (non so neanche se il
problema fosse questo), magari, se ti va, fammi sapere e se ne
puo' discutere (domani vado via per questioni di studio e non
so quando riesco a leggere la posta, cmq prima o poi ti rispondo).

|| [snip]
|| con generosa donazione dei "materiali" da parte della "padrona
|| di casa")
| Ringraziala anche da parte mia.
Sara' fatto.
Mi ha messo a disposizione un cacciavite ed il suo PC... dopo
averlo aperto ho inserito il mio HDD :)

Alla prossima.
Ciao.


-- 
Tutto va male nello stesso tempo.




Other related posts: