Microcomputer: tecniche di programmazione in assembly

Giuliano Donzellini, Domenico Ponta

Emulazione di un ricevitore seriale asincrono

110062

 

v1.80

In questo laboratorio si chiede di scrivere un programma, in assembly DMC8, che emuli un ricevitore seriale asincrono. Il ricevitore attende e decodifica pacchetti di bit, come descritto nella figura seguente:

Un pacchetto è 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 = 625 bit per secondo (tempo di bit = 1,6 mS).

La prossima figura mostra una prima versione del ricevitore, basata su di una macchina a stati finiti (un click sulla figura aprirà lo schema nell'editor del d-DcS):

Il sistema è composto da un contatore del tempo di bit [A, evidenziato in rosso], sulla sinistra della figura, un registro a scorrimento [B, in blu, a destra in alto], un contatore nel numero di bit [C, in rosso, sulla destra], e un controllore [D, in marrone, basato su di una macchina a stati finiti].

Contatore del tempo di bit  [A]
Il contatore del tempo di bit, basato sul componente Cnt4, ha il compito di dividere per 16 la frequenza del clock RX_CK (10 KHz), al fine di ricevere i bit alla velocità richiesta (625 b/s = 10 KHz /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'acquisizione dei bit di dato alla velocità richiesta. Il segnale LD predispone il contatore al valore '0110' (tramite gli ingressi P3..P0), come descritto nel seguito.

 Registro a scorrimento [B]
Il registro a scorrimento di ricezione (il componente Univ8), de-serializza i pacchetti di dato in arrivo dalla linea RX_LINE. 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 RX_LINE. 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 linee RX_DATA.

 Contatore dei bit [C]
Il contatore dei bit (anche questo basato su di un Cnt4) tiene il conto dei bit da ricevere. Il controllore di ricezione 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 [D]
La funzionalità del controllore di ricezione è 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 RX_LINE). 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, a causa della ciclicità 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 RX_LINE (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 RX_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 segnale RX_RDY) 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.


L'analisi e la simulazione del comportamento del circuito è utile, adesso, per realizzarne una nuova versione, avente le stesse funzionalità, ma basata su di un microcomputer DMC8. Lo schema della nuova versione è visibile nella figura seguente. Un click su di questa aprirà lo schema nel d-DcS.

In questo circuito la linea RX_LINE è ricevuta sul bit 0 del porto di ingresso IA del microcomputer. Utilizziamo il porto OD per collegarci alle linee di uscita RX_DATA, e il bit 7 del porto OC, per generare l'uscita RX_RDY. Si noti che nessun altro componente è utilizzato, e che non è collegato al microcomputer nessun clock esterno (vedi RX_CK nello schema originale). Tutti gli intervalli di tempo necessari sono valutati dal microcomputer mediante l'uso delle tecniche delle routine di ritardo (la frequenza di clock del microcomputer è 10 MHz).

Un click aprirà una traccia di una possibile realizzazione del programma in assembly. Una volta terminata la scrittura e il test del programma nel d-McE, potrà essere caricato nella ROM del microcomputer, al fine di simulare la nuova versione del trasmettitore nel d-DcS. Anche in questo caso, una sequenza di test ("Rx_Sequence") è predisposta nella finestra del diagramma temporale.