Microcomputer: interfacciamento parallelo e gestione delle interruzioni

Giuliano Donzellini, Domenico Ponta

Misuratore Digitale: il ricevitore seriale

120068

 

v1.80

Il ricevitore di linea seriale attende, dalla linea LINE_IN, un segnale come quello descritto nella figura seguente:

Il pacchetto di 10 bit è composto da:

  1. Un bit di start (a livello alto);
  2. 8 bit di dati, D7 .. D0 (D0 in testa);
  3. Un bit di stop (a livello basso);
  4. Bit/Rate = 62500 bit per secondo (tempo di bit = 16 µS). La frequenza del clock di ricezione è di 1 MHz.

La prossima figura mostra il ricevitore, basato su di una macchina a stati finiti, utilizzata come controllore (un click sulla figura aprirà lo schema nell'editor del d-DcS):

Il sistema è composto da un contatore del tempo di bit (Bit Time Counter), un registro a scorrimento (Shift Register), un contatore nel numero di bit (Bit Counter), e un controllore (Controller).

Contatore del tempo di bit (Bit Time Counter)
Il contatore del tempo di bit, basato sul componente Cnt4, ha il compito di dividere per 16 la frequenza del clock RX_CK (1 MHz), al fine di trasmettere i pacchetti di bit alla velocità richiesta (62500 b/s = 1 MHz /16): questa parte del ricevitore è alle volte indicata come generatore di Baud Rate. Il contatore è impostato per contare all'indietro ciclicamente; ogni volta che le uscite Q3..Q0 raggiungono il numero '0000', è attivata la sua uscita TC (termine del conteggio), in modo che risulti un impulso ogni 16 cicli di clock. L'attivazione ciclica di TC è utilizzata dal controllore di ricezione per sincronizzare l'invio di ogni bit alla velocità di bit richiesta. Il segnale LD predispone il contatore al valore '0110' (tramite gli ingressi P3..P0), come descritto nel seguito.

 Registro a scorrimento (Shift Register)
Il registro a scorrimento di ricezione (il componente Univ8), de-serializza i pacchetti di dato in arrivo dalla linea LINE_IN. S1 e S0 controllano il modo di lavoro del registro: quando il controllore di ricezione pone S1 = S0 = '0', lo stato del registro non cambia. L'ingresso seriale del dato (InR) proviene direttamente dalla linea LINE_IN. L'ingresso del dato ed il suo scorrimento avviene quando il controllore imposta S1 = '0' e S0 = '1'. Alla fine della ricezione di un pacchetto, le uscite del registro a scorrimento rendono disponibile il dato, in formato parallelo, sulle line RXBYTE.

 Contatore dei bit (Bit Counter)
Il contatore dei bit (anche questo basato su di un Cnt4) tiene il conto dei bit da ricevere. Il controllore lo initializza al numero 8, attivando la linea LD. Ogni volta che il controllore attiva la linea EN, il conteggio decrementa di uno. Controllando la linea TC (termine del conteggio), il controllore sa quando sono stati ricevuti tutti i bit.

 Controllore (Controller)
La funzionalità del controllore è descritta dal seguente diagramma ASM (un click sull figura aprirà il file FSM nel d-FsM):

La frequenza di clock del controllore è pari a 16 volte la velocità di bit del pacchetto ricevuto. Per catturare il bit di start, il controllore campiona, nello stato (a), ad ogni ciclo di clock, il suo ingresso LIN (collegato a LINE_IN). Quando LIN passa a uno, il controllore continua a leggerne il valore, nello stato (b). Se LIN, al raggiungimento della metà del tempo di bit, è ancora a uno, il controllore dichiara valido il bit di start, passando nello stato (c). Altrimenti, se nel frattempo LIN ritorna basso, il controllore ricomincia daccapo, mettendosi nuovamente in attesa di un nuovo bit di start.

Si noti che la metà del tempo di bit è segnalata dalla linea TCB, che è generata dal contatore del tempo di bit, inizializzato nello stato (a) al valore di partenza '0110' (per mezzo della linea LD). Come risultato di questa inizializzazione, la prima occorrenza di TCB è generata dopo solo la metà del tempo di bit; successivamente, invece, l'attivazione di TCB avviene allo scadere di un tempo di bit completo (cioè ogni 16 cicli di clock, pari al modulo del contatore, a partire dalla metà del bit di start).

Lo stato (c) ha il compito di sincronizzare l'acquisizione dei bit dalla linea seriale ed il loro scorrimento nel registro di ricezione. Infatti, quando TCB è attivato, il controllore si sposta nello stato (d): generando S0 = '1' e S1 = '0', ottiene l'acquisizione del dato presente in quel momento su LINE_IN (tramite InR del componente Univ8) e, allo stesso tempo, lo scorrimento a destra di tutti gli altri bit memorizzati nel registro.

Dallo stato (c) si esce, poi, quando è attivato TCN, ossia dopo avere acquisito 8 bit. TCN è infatti generato dal contatore dei bit quando raggiunge lo zero, e cioè quando i bit da ricevere sono terminati. Si osservi che tale contatore è decrementato nello stato (d), attivando EN, ogni volta che un bit è acquisito nel registro a scorrimento.

Il prossimo compito dell'algoritmo riguarda la verifica del bit di stop. Nello stato (c), quando TCB è attivato, ma è attivo anche TCN (perchè tutti i bit sono stati ricevuti), invece di acquisire il bit di stop nel registro a scorrimento , il controllore ne testa direttamente il suo valore. Se il bit di stop è zero, il formato del pacchetto si assume valido, ed è generato il segnale RDY, passando nello stato (e) e rimandovi per la durata di un tempo di bit. Altriumenti, se il bit di stop è alto, i bit ricevuti vengono ignorati (non generando il segnaleRDY) e l'algoritmo riparte dallo stato (a). Infine, lo stato di attesa (f) permette di risolvere in modo semplice lo stato di errore dovuto al bit di stop errato: qui il controllore attende che la linea LIN sia tornata bassa, prima di attendere l'arrivo del prossimo bit di start (sebbene questa non sia la soluzione migliore per gestire la ricezione di un bit di stop errato).

Il circuito può essere testato con il simulatore del d-DcS, sia in modalità animazione che temporale . Una opportuna sequenza di test è disponibile nella finestra del diagramma temporale.