Microcomputer: interfacciamento parallelo e gestione delle interruzioni

Giuliano Donzellini, Domenico Ponta

Gestione delle interruzioni da timer, con uso di tecniche antirimbalzo

120074

 

v2.00

Un sistema basato sul microprocessore DMC8 conta i bulloni di ferro prodotti da una pressa semiautomatica. Un lavoratore è responsabile di caricare la pressa con la materia prima e, una volta terminata, premere un pulsante per inviare alla sala di controllo il numero di bulloni prodotti (prima di ricaricare la macchina). La pressa ha quattro uscite separate, controllate da sensori indipendenti.

Scrivere e testare il programma di controllo del sistema (vedi la figura), secondo le specifiche seguenti.

Un timer, collegato al processore DMC8, invia una richiesta di interrupt (!INT) ogni 2 ms: il segnale di accettazione della interruzione !INTA, generato dal processore durante la sequenza di avviamento della interruzione, cancella automaticamente la richiesta.

Il porto parallelo di ingresso SENS (indirizzo 00h) legge i sensori ottici T0, T1, T2 e T3, che controllano ogni uscita della pressa. Ogni sensore genera '0' in stato di riposo, e un '1' quando un bullone passa attraverso il suo percorso ottico. Inoltre, un pulsante (quello che il lavoratore preme) è collegato al bit 7 dello stesso porto.

La sala di controllo è collegata tramite un'interfaccia parallela a 16 bit, che il sistema controlla attraverso i porti COUNTL e COUNTH (indirizzi 03h e 02h). L'interfaccia utilizza un bus parallelo da 15 bit (C14..C0) per comunicare il numero di bulloni, e una sola linea come segnalazione di dato pronto (RDY).

Specifiche del firmware

Il microprocessore, nel programma principale, controlla continuamente il porto SENS. Confronta il precedente e l'attuale stato dei sensori, rilevando la transizione da '1' a '0' sull'uscita dei sensori e incrementando il conteggio totale di bulloni. Supponiamo che il più alto numero di bulloni prodotti sia inferiore a circa 10000. Supponiamo anche che il segnale generato dai sensori sia libero da transizioni spurie.

La routine di gestione delle interruzioni, eseguita ad ogni "timer tick", è incaricata di controllare il pulsante: un pulsante elettromeccanico, quando commutato, sia su 'on' che su 'off', produce una serie di rimbalzi meccanici che portano a un segnale digitale "sporco" (con la presenza di "treni di impulsi" non voluti, come mostrato nella figura seguente). La commutazione deve essere ripulita e convalidata via software: in poche parole, dobbiamo "eliminare i rimbalzi".

Per fare questo, dovremo campionare il segnale più volte, e convalideremo il suo valore solo se sarà risultato stabile più di una volta di seguito. Nel nostro esempio, il valore del pulsante è controllato ogni 10 ms: accetteremo un cambiamento solo se il nuovo valore rimane stabile per tre volte, vale a dire almeno per 20 mS, come mostrato nella figura precedente.

L'algoritmo antirimbalzo può essere descritto in termini di macchina a stati finiti sincrona (MSF, vedere la seguente figura), in cui ogni transizione di stato viene valutata ogni 10 mS:

Nel diagramma qui sopra, SIG è il segnale proveniente dal pulsante, e l'uscita DEB ne segue l'andamento, ma ripulito dai rimbalzi. La MSF permane nello stato (a) se il pulsante è inattivo (SIG = '0'). Quando viene rilevato un cambiamento a '1' di SIG, SIG sarà controllato altre due volte [stati (b) e (c)], ogni 10 mS. Se, nel frattempo, SIG torna a '0', il processo di convalida viene riavviato nuovamente, dallo stato (a).

Se, nello stato (c), il segnale è ancora letto a '1', confermiamo il nuovo valore del pulsante (lo si considera "premuto") e l'attività associata alla pressione del pulsante viene eseguita (nel diagramma, questo è rappresentato dall'uscita condizionata PRS). Poi, la MSF continuerà a campionare il segnale ogni 10 mS, convalidando anche la transizione opposta, prima di riavviare nuovamente l'intero processo, nello stato (a).

Quando il pulsante è dichiarato "premuto", il sistema invia il numero di bulloni (C14..C0) alla sala di controllo, copiandolo sui porti COUNTL e COUNTH, e attivando il segnale RDY. RDY deve essere mantenuto attivo almeno per 3 µS, e poi azzerato. Si noti che il segnale RDY deve essere azzerato senza modificare il valore delle linee C14..C0.

Proponiamo qui tre modelli di soluzione, in codice assembly DMC8, in ordine decrescente di difficoltà:

  1. In questo modello, più impegnativo, solo la struttura generale del codice è presente e dovrà essere scritto quasi tutto;
  2. Il secondo modello contiene una soluzione per il ciclo principale, e una bozza dell'algoritmo della MSF, del gestore delle interruzioni e della routine di uscita;
  3. Il terzo file contiene una soluzione quasi completa, tranne che per una parte della routine di gestione delle interruzioni e della routine di uscita.

Chi volesse eseguire solo un'analisi di codice già scritto, e simularne il comportamento, trova disponibile qui una soluzione completa.

Una volta terminato di scrivere e testare il programma nel d-McE, occorre caricarlo nella ROM del microcomputer e simulare l'intero circuito. Un click sulla figura seguente aprirà lo schema nel d-DcS. Notare che, per testare il ricevitore, la sequenza di ingresso "TestSequence" è disponibile nella finestra del diagramma temporale.