|
|
||||||||||
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. 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. 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). 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. 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à:
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. |