Microcomputer: tecniche di programmazione in assembly

Giuliano Donzellini, Domenico Ponta

Emulazione di un trasmettitore seriale asincrono

110061

 

v1.80

In questo laboratorio si chiede di scrivere un programma, in assembly DMC8, che emuli un trasmettitore seriale asincrono. Il trasmettitore invia 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 trasmettitore, 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 TX_CK (10 KHz), al fine di trasmettere i pacchetti di bit alla velocità richiesta (625 b/s = 10 KHz /16): questa parte del trasmettitore è 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 trasmissione per sincronizzare l'invio di ogni bit alla velocità di bit richiesta. Il segnale LD predispone il contatore al valore '1111' (tramite gli ingressi P3..P0).

 Registro a scorrimento [B]
Il registro a scorrimento di trasmissione, suddiviso nei due componenti Univ4 e Univ8, serializza il dato parallelo (TX_DATA) sulla linea di uscita TX_LINE. S1 e S0 controllano il modo di lavoro del registro: quando il controllore di trasmissione pone S1 = S0 = '0', lo stato del registro non cambia. Quando S1 = S0 = '1', il registro carica in parallelo gli otto ingressi di dato TX_D7 .. TX_D0, il bit di start (P0 di Univ8) e il bit di stop (P1 di Univ4). I bit inutilizzati del registro sono impostati a '0'. La trasmissione seriale inizia quando il dato è caricato, dal momento che l'operazione di caricamento impone il bit di start sulla linea TX_LINE. I bit successivi del pacchetto saranno trasmessi, uno dopo l'altro, facendo scorrere a destra il registro (cioè ogni volta che il controllore di trasmissione pilota S1 = '0' e S0 = '1').

 Contatore dei bit [C]
Il contatore dei bit (anche questo basato su di un Cnt4) tiene il conto dei bit da trasmettere. Il controllore di trasmissione lo initializza a '1010', 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 la trasmissione deve essere conclusa.

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

Il comando !TX_GO (GO per la MSF) avvia la trasmissione: i primi due stati (a) e (b) attendono la pressione del pulsante (fornisce un livello "basso" quando è premuto) e, nel frattempo, attivano LD, mantenendo fermi i contatori al valore di predisposizione. Nello stato (c), l'attivazione di S0 e S1 fa caricare il dato parallelo nel registro a scorrimento, mentre EN ordina il decremento del conteggio del numero di bit da trasmettere. Nello stato (d), il controllore attende il segnale TCB dal contatore del tempo di bit: al suo arrivo (ogni 1,6 mS), il controllore attiva (e) lo scorrimento a destra del registro a scorrimento (S1 = '0', S0 = '1') mentre ordina il decremento del numero dei bit da trasmettere (EN = '1'). Quando il numero di bit da trasmettere va a zero (TCN = '1'), il controllore si porta nello stato (f), dove viene generata l'uscita END, per segnalare la fine della trasmissione. Infine, trascorso un ulteriore tempo di bit, il controllore ritorna nello stato (a).

Il circuito può essere testato con il simulatore del d-DcS, sia in modalità animazione che temporale . Una opportuna sequenza di test ("TxSequence") è 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 TX_LINE è pilotata dal bit 0 del porto di uscita OD del microcomputer. Il porto IB è connesso alle linee di ingresso TX_DATA, mentre il porto IA, sul bit 0, lege il pulsante !TX_GO. Il porto di uscita OC genera, sul bit 0, il segnale TX_END.

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 ("TxSequence") è predisposta nella finestra del diagramma temporale.