Esempio applicativo
Supponiamo di avere il circuito riportato nella figura qui sotto. E' un semplice risponditore telefonico che quando viene chiamato invia un tono in linea per un certo tempo. Sulla sinistra c'è l'interfaccia di linea, non ci interessa come è fatta, quello che è importante è conoscere il significato dei tre fili che escono da essa. L è il filo di impegno, una tensione positiva su questo filo fa "prendere la linea". F è il filo su cui va inviata la frequenza da mandare in linea. R è il filo che segnala l'arrivo di una chiamata. E'normalmente a +V (o 1 logico), si porta a zero quando arriva la corrente di chiamata.
Il funzionamento è il seguente: appena arriva un impulso di corrente di chiamata il filo R si porta a zero, il flip flop di tipo set-reset si attiva e la sua uscita Q si porta a 1. La rete RC del TIMER1 fa si che per 15 secondi il circuito non risponda. Trascorso questo tempo l'uscita del TIMER1 si porta a 1 comandando l'impegno sul filo L, e abilitando la porta AND ad inviare in linea la frequenza prodotta dall'oscillatore. Contemporanemante questo livello 1 comanda il TIMER2, che dopo 10 secondi invia un 1 (negato da una porta NOT) verso il pin reset del flip flop e il circuito si azzera liberando la linea. Per questo esempio supponiamo di usare il modulo a microprocessore presentato nella pagina collegamento I/O 1 che dispone di 8 ingressi e 8 uscite a cui si può accedere leggendo o scrivendo all'indirizzo 0. Il programma deve eseguire esattamente i passi visti prima, prima di tutto però deve impostare sulla porta di uscita i corretti valori di riposo (nel nostro caso 0) dato che all'accensione le uscite assumono valori casuali. Inoltre, se questo è l'unico modulo software presente, all'inizio deve anche impostare lo stack pointer come spiegato nella pagina elementi software. |
.ORG 0 ;INDIRIZZO INIZIALE ;------------------------------------------------------------ LD SP,65535 ;INIZIALIZZA LO STACK POINTER XOR A OUT (0),A ;INIZIALIZZA LE USCITE ATTESA1 IN A,(0) ;LETTURA FILO R BIT 0,A JR NZ,ATTESA1 LD BC,15000 ;IMPOSTA RITARDO DI 15 SECONDI CALL DELAY LD A,00000010B OUT (0),A ;IMPEGNA LA LINEA LD DE,7700 ;IMPOSTA 7700 PERIODI TONO LD A,00000011B OUT (0),A ;ALZA BIT D0 LD B,200 RIT1 DJNZ RIT1 ;ATTESA 650 MICROSEC. RES 0,A OUT (0),A ;RIABBASSA BIT D0 LD B,200 RIT2 DJNZ RIT2 ;ATTESA 650 MICROSEC. DEC DE ;DECREMENTA CONTEGGIO PERIODI LD A,D OR E JR NZ,TONO ;SE NON SONO FINITI TORNA A TONO XOR A OUT (0),A ;LIBERA LA LINEA JP ATTESA1 ;TORNA AD ATTESA CHIAMATA ;------------------------------------------------------------ DELAY PUSH BC ;SALVA BC CALL MS1 ;CHIAMA RITARDO 1 MILLISEC. POP BC ;RECUPERA BC DEC BC ;DECREMENTA CONTEGGIO MILLISEC. LD A,B OR C JR NZ,DELAY ;SE NON SONO FINITI TORNA A DELAY RET ;------------------------------------------------------------ MS1 LD B,190 MSR1 NOP NOP DJNZ MSR1 NOP RET ;------------------------------------------------------------ .ENDNOTA: alcune istruzioni sono scritte leggermente spostate a destra per evidenziare che sono all'interno di un ciclo.Questo è un programma piuttosto semplice, non usa aree di memoria per contenere dati di lavoro, non usa gli interrupt, effettua tutto il lavoro con i soli registri della CPU, però mostra come si può realizzare via software un processo dal funzionamento del tutto identico a quello di una rete hardware.
Il funzionamento potrebbe essere reso più affidabile per esempio controllando l'effettiva temporizzazione della corrente di chiamata, in modo da distinguere una chiamata vera da un impulso spurio o da un disturbo.
O ancora al posto di una frequenza fissa potrebbero essere emessi dei treni di impulsi, magari a frequenze diverse. Tutte queste modifiche sarebbero molto pesanti da realizzare in hardware, al contrario via software sono molto semplici.
Inoltre quelle che in hardware sarebbero le eventuali regolazioni dei trimmer dei temporizzatori, qui diventano semplici regolazioni del valore di un registro.