4BE Esempi/esercizi di progetto sistemi HW/SW
Transcript
4BE Esempi/esercizi di progetto sistemi HW/SW
Edited by Foxit PDF Editor 1 di 18 Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. INTERFACCE DI INPUT/OUPUT Sono circuiti che permettono ai sistemi digitali (come il PC o un sistema HC11) di collegarsi a periferiche esterne come tasti o led. Nel caso più semplice si presentano all'esterno come connettori con tanti pin (poli) sui quali il sistema emette dei segnali (se sono di OUTPUT) oppure riceve dei segnali (se sono di input). Dal punto di vista del programmatore queste interfacce possono essere viste come celle di memoria (tipicamente) di 1 BYTE =8bit. Ogni bit corrisponde ad un pin del connettore. In una interfaccia di ingresso una tensione ALTA/BASSA applicata dall'esterno su un pin si riflette in un valore 1/0 di un determinato bit all'interno della cella. In una interfaccia di OUTPUT ponendo ad 1 (tramitea pposite istruzioni all'interno di un programma) un certo bit della cella, si ottiene l'effetto di produrre una tensione ALTA/BASSA su un determinato pin dell'interfaccia. Ogni interfaccia è identificata da un indirizzo (numero intero). Ad esempio sulla porta parallela del PC sono presenti delle interfacce di OUPUT e di INPUT poste rispettivamente agli indirizzi 0x378 e 0x379. Sistemi di controllo analogici Aldini 30/01/08 Figura 2. Sui PC sono disponibili molte interfacce di INPUT/OUTPUT, ognuna identificata da un indirizzo. LA PORTA PARALLELA DEI PC La porta parallela dei PC si presenta come un connettore a 25 poli (v. fig.1). Viene chiamata spesso interfaccia anche se i diversi pin in realtà corrispondono a diverse interfacce, di INPUT e di OUPUT. E' nata per collegare ai PC una stampante ma puo' essere benissimo usata anche per altri scopi: ad esempio ai pin 2..9 possono essere collegati 8 led ed ai pin 10,11,12,13,15, cinque tasti o switch. In figura 3 vengono mostrati con maggiore dettaglio il significato e la direzione dei segnali per tutti i pin della parallela. Sono anche mostrati i collegamenti con la scheda di test usata in laboratorio. COME SI ACCEDE ALLE PORTE DI I/O. (Cioè come si scrive nelle interfacce di OUTPUT e si legge dalle interfacce di INPUT) Dal punto di vista del programmatore, le interfacce (o porti), possono essere assimilate, (RIPETO IL CONCETTO) a delle celle di un BYTE = 8 BIT con la particolarità che cio' che leggiamo (se sono di INPUT) o scriviamo (se sono di OUPUT) in esse corrisponde bit a bit allo stato alto/basso di determinati pin dell'interfaccia. Ogni porto è identificato dal suo indirizzo (è un numero che contraddistingue ogni porto). Per porre a 1 (“accendere”), ad esempio, tutti i pin del porto che sta all'indirizzo 0x378, basta mettere dentro questo porto il valore 1111111, ovvero in esadecimale 0XFF o in decimale 255. SCRITTURA su un porto di OUT Sui PC, usando il linguaggio C, è disponibile una funzione apposita per scrivere su un porto di OUTPUT. Si chiama outportb, ha due argomenti: l'indirizzo del porto in cui scrivere ed il valore da scriverci dentro. Sintassi: ouportb( indirizzo, dato); Ad esempio per porre a Vcc tutti i pin del porto 0X378: ouportb(0x378,0xFF); NB: in winXP occorre mettere nel programma #include "portio.h", ed avere precedentemente caricato i driver (port95nt.exe scaricabile da internet) Nei sistemi HC11 che vedremo in seguito, l'istruzione che scrive su un porto di out é MB(indirizzo) =dato; LETTURA di un porto di INPUT Sui PC, usando il linguaggio C, è disponibile una funzione apposita per leggere un porto di INPUT. Si chiama inportb, ha un argomento: l'indirizzo del porto da cui leggere, e restituisce un valore di ritorno, che è il dato letto. variabile= inportb( indirizzo); Ad esempio per leggere lo stato dei pin del porto 0x379, e memorizzarlo nella variabile PIPPO: PIPPO=inportb(0x379); Nei sistemi HC11 si puo' usare l'istruzione MB(indirizzo) come mostrato nell'esempio seguente PIPPO=MB(0x379); Segue un esempio di programma che accende un led collegato al pin 2 della parallela (bit N. 1 della cella 0x378) se un tasto collegato al pin 15 (bit N. 3 della cella 0x379) è premuto (quindi il pin è a massa, come mostrato in fig.1) #include “portio.h” //necessario nei sistemi XP unsigned char PIN,POUT; //variabili di appoggio per memorizzare lo stato (livelli dei pin) dei porti di ingresso ed uscita main() { while(1) //ciclo infinito {PIN=inportb(0X379); //leggo e metto in PIN lo stato degli 8 pin del porto 0x379 if ( (PIN&8) = =0) {POUT = POUT | (1); } //se il pin numero 15 della parallela (corrisponde al bit N. 3 della cella 0x379) è a massa.. if ( (PIN&8) ! = 0) {POUT = POUT & (~1); } //metto a 0 il bit numero 0 di POUT, così spegnero' il led corrispondente a questo bit outportb(0X378)=POUT; //lo stato desiderato dei pin del porto 0x378 , che prima ho preparato nella variabile POUT, adesso lo //trasferisco sul porto(cioè sul circuito che pilota i pin del connettore) } } Sistemi di controllo analogici Aldini 30/01/08 SRUTTURA BASE DEI PROGRAMMI DI CONTROLLO Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. 2 di 18 Chiamiamo programmi di controllo quelli che debbono gestire (generare/testare) dei segnali binari ricevuti o emessi tramite opportune interfacce di INPUT (tipo 74HC244) o di OUTPUT (tipo 74HC373) I segnali di ingresso sono generati, nel caso più semplice da TASTI. I segnali di uscita sono generati dal nostro sistema (dal nostro programma) e possono comandare, nel caso più semplice, l'accensione/spegnimento di LED. Interfacce (o porti di I/O) Le interfacce o porti di OUTPUT sono assimilabili a celle, identificate da un indirizzo che si possono (tipicamente) solo scrivere. I singoli bit di queste celle accendono/spengono dei segnali binari, uscenti su determinati pin (connettori) del sistema. Le interfacce o porti di INPUT sono assimilabili a celle, identificate da un indirizzo, che si possono solo leggere. I singoli bit di queste celle corrispondono allo stato alto/ basso di determinati segnali binari, entranti in determinati pin (presenti su certi connettori) del sistema come quello della porta parallela nei PC. ISTRUZIONI PER ACCEDERE ALLE INTERFACCE/PORTI DI I/O1 Nelle celle (variabili) ordinarie i dati si inseriscono con gli operatori di assegnamento: esempio PIPPO=0XFF; mette 0XFF nella cella di nome PIPPO Nelle celle delle interfacce di I/O i dati si inseriscono o leggono come indicato di seguito. In ambito PC (DOS/WIN98 oppure windows XP con driver appositi indicati a lezione2) si usano le funzioni ouportb(indirizzo,dato) ed inportb(indirizzo) In ambito HC11 (con l'ambiente ALVIN) per accedere alle interfacce di I/O si puo' usare la notazione MB(indirizzo) (ad esempio MB(0x800) rappresenta la cella identificata dall'indirizzo 0x800) Esempi: Per porre a 1 (“accendere”), ad esempio, tutti i pin del porto che sta all'indirizzo 0x378, basta mettere dentro questo porto il valore 111111, ovvero in esadecimale 0XFF o in decimale 255. In un programma per PC l'istruzione che ottiene questo effetto è ouportb(0x378,0xFF); In un programma per HC11 potrebbe essere MB(0x3F8) = 0XFF; Sui PC è ad esempio disponibile un connettore a 25 poli indicato come 'porta parallela' che contiene (tra gli altri) un porto di uscita (8pin) posto all'indirizzo 0x378. A questi pin posiamo collegare ad esempio 8 led. L'istruzione ouportb(0x378,0xFF); li accende tutti Per leggere il dato presente in una cella (interfaccia) di INPUT memorizzandolo in una certa variabile PIPPO PIPPO= inportb(indirizzo); oppure in ambito HC11 PIPPO=MB(indirizzo); Ad esempio per leggere e mettere in PIPPO il dato presente nella cella 0x379 della parallela di un PC: PIPPO=inportb(0X379); GESTIONE DEI DISPOSITIVI DI I/O CON TECNICA 'POLLING' La gestione di dispositivi di I/O collegati al micro può essere realizzata utilizzando diverse tecniche. Di seguito viene descritta quella più semplice chiamata “polling”. Come si nota osservando la figura, l' algoritmo di controllo e’ costituito fondamentalmente da un ciclo che termina solo con lo spegnimento della macchina che lo esegue ed e’ per questo detto infinito. All’ interno del ciclo viene rilevato lo stato di tutti i segnali (o più in generale dei dispositivi) connessi al sistema e vengono svolte le azioni richieste dalla loro eventuale attivazione. Questa tecnica di gestione dei dispositivi si chiama “polling”. Il ciclo infinito ha una durata massima che dipende dal numero di istruzioni che contiene e dal tempo che il micro impiega a per eseguirle. Per avere un riferimento numerico, si immagini che l' HC11 (ad 8Mhz) impiega circa 2 us per eseguire le istruzioni (in linguaggio macchina!) più comuni. Tanto per avere un dato di riferimento che ci permetta di svolgere in seguito delle considerazioni intuitive, assumeremo d'ora in avanti che la durata del ciclo infinito sia 1ms.( È un valore fissato in modo del tutto arbitrario, quello preciso dipende dalla particolare applicazione ed andrebbe calcolato caso per caso) NB: Perché questa tecnica funzioni correttamente occorre ovviamente che il tempo di attivazione di ciascun dispositivo duri almeno tanto quanto l' esecuzione di una singola ripetizione del ciclo infinito. 1 Per accedere direttamente alle celle di memoria o I/O nei sistemi HC11 è possibile: 1) 2) definire dei puntatori inserendovi l'indirizzo delle celle cui si vuole accedere Ad esempio per accedere alla cella 0x800 posso definire il puntatore PIPPO così unsigned char *PIPPO = (unsigned char *)(0X800); Per azzerare la cella 0x800 potrò fare *PIPPO=0; Usare la notazione MB(indirizzo_della_cella) disponibile nell'ambiente ALVIN Per azzerare la cella 0x800 basterà fare MB(0x800)=0; 2 in windows XP occorre mettere nel programma #include "portio.h", ed avere precedentemente caricato il driver port95nt.exe scaricabile da internet... Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. Sistemi di controllo analogici Aldini 30/01/08 Lettura dei livelli e dei fronti 3 di 18 Una delle scelte fondamentali che il programmatore deve compiere riguarda il tipo di attivazione dei dispositivi da controllare, in particolare deve decidere se leggere i fronti oppure i livelli dei segnali che questi dispositivi emettono. Bisogna ricordare che il ciclo infinito viene ripetuto moltissime volte al secondo dal micro. Se nel ciclo è presente un test sul livello di un segnale, questo test sarà verificato per tutto il tempo di attivazione del segnale. Se tale durata è ad esempio un secondo, ed il micro compie in un secondo mille ripetizioni (giri) del ciclo infinito, il test sarà verificato 1000 volte per ogni attivazione del segnale. I test sui fronti sono invece verificati una volta soltanto per ogni attivazione del segnale. I due esempi seguenti illustrano questo problema e le considerazioni da fare per risolverlo. fig 1: In questo caso è corretto leggere i livelli e non i fronti dei segnali A e B fig 2: In questo caso è necessario leggere i fronti del segnale B Codifica degli algoritmi di controllo ● Generalmente all'inizio del ciclo senza fine vengono letti tutti i segnali di ingresso (si legge la cella/BYTE/PORTO ai cui “pin” sono collegati i segnali) memorizzandoli nella forma di un BYTE in opportune variabili, ad esempio P244, o PIN (di tipo unsigned char) . Su PC (per esempio) P244= inportb(0X378); Su HC11 P244 = MB(0X378) ; ● All'interno del ciclo infinito ■ si testano i livelli /fronti dei segnali testando i valori dei bit della variabile (ad esempio P244) in cui è stato memorizzato il loro stato, ad esempio P244. usando le formule per il test. (vedi punti Z1, Z4,Z7 della figura 3) ■ si modificano in una variabile di appoggio, ad esempio P373, o POUT, i bit corrispondenti ai pin dell'interfaccia di USCITA che si vogliono accendere/spegnere /commutare usando le formule per il set/reset/inversione) (vedi punti Z3,Z5,Z8) FORMULE PER IL SET/RESET/TEST/ INVERSIONE DI UN BIT set PIPPO=PIPPO | 2 n reset PIPPO=PIPPO & (~2 ); inversione ; (esempio PIPPO=PIPPO|4; mette mette a 1 il bit numero 2 di PIPPO) n PIPPO=PIPPO ^ 2 n n ; test su 1 if (PIPPO & 2 ) test su 0 if ( !(PIPPO & 2n) ) {.....} test sul fronte + {.....} (mette a 0 il bit numero n di PIPPO (commuta il bit numero n di PIPPO) (esegue ..... se il bit numero n di PIPPO vale 1) (esegue ...... se il bit numero n di PIPPO vale 0) n if ( (PIPPO & 2 ) && ! ( PIPPOprec & 2n) ) {.....} (esegue ...... se il bit n di pippo è passato da 0 ma 1) ● Alla fine del ciclo infinito si scrivono (inviano) sui porti di output (ad esempio circuiti integrati del 74HC373), i dati preparati nella ( o nelle) variabile di appoggio P373 (vedi punto Z10) Su PC (esempio) outportb(0x378, P373); Su HC11 (esempio3) MB(0x378)=P373; ● Quando nell'algoritmo ci sono blocchi che testano il fronte di un certo segnale, occorre considerare che questo fronte puo' essere rilevato soltanto confrontando il valore attuale del segnale (cioè quello letto all'inizio del ciclo corrente e memorizzato ad esempio nella variabile P244), con quello precedente (cioè quello che abbiamo letto durante il giro precedente) per capire se c'è stata una variazione (0->1 = fronte di salita, 1->0 = fronte di discesa) Occorre dunque alla fine di ogni giro, prima di ripetere la lettura che darà i nuovi valori dei segnali, memorizzare in una variabile di appoggio ad,esempio P244prec, i valori della lettura corrente (vedi punto 9 della figura) che al prossimo giro saranno i 'valori precedenti' 3 oppure si definiscono, all'inizio del programma dei 'puntatori' alle celle (porti di I/O) es: #define PORTO_USCITA *(volatile unsigned char *) (0x378) In seguito per scrivere nel porto basta fare, per esempio: PORTO_USCITA = 0XFF; //mette 11111111 nel porto di uscita 0x378 Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 Evaluation Only. ESEMPIO CAMPIONE DI CODIFICA di un ALGORITMO DIFor CONTROLLO (ciclo base di controllo) Sistemi di controllo analogici Aldini 30/01/08 4 di 18 Il seguente esempio mostra come si codificano gli algoritmi di controllo in C, a partire da un diagramma contenente i blocchi tipici di test (sui livelli o sui fronti) e set/reset/inversione. A sinistra è mostrato un algoritmo che commuta L1 ad ogni pressione di P3 e accende o spegne L4 a seconda che P5 sia premuto oppure no. Si assume che il sistema HC11 disponga di un porto di uscita (integrato 74HC373) posto all'indirizzo 0x800, e di un porto di ingresso (integrato 74HC244) posto all'indirizzo 0x802. A questi porti sono collegati i due led ed i due pulsanti come in figura. Queste variabili in altri testi sono ciamate IN, INprec, O figura 3: esempio di codifica di un algoritmo di coontrollo ESERCIZIO 1 Il livello del liquido presente nel serbatoio di figura deve essere mantenuto tra le due sonde metalliche A,B che danno 1 quando sono bagnate. Mostra lo schema dei collegamenti, il diagramma a blocchi e la codifica C del sistema che realizza quanto richiesto accendendo il meno possibile la pompa P. Supponi che i porti di INPUT ed OUTPUT siano collocati agli indirizzi 0x800 e 0x801. CODIFICA C #include ''io68hc11.h'' unsigned char PIN,POUT; / /variabili di appoggio per memorizzare lo stato (livelli dei pin) dei porti di INPUT ed OUTPUT main() { while(1) //ciclo infinito {PIN=MB(0X800); //leggo e metto in PIN lo stato degli 8 pin del 244 if ( PIN&1 ) { POUT = POUT & (~2); } //se il pin numero 0 del 244 era diverso da 0A attiva, spengo la pompa //se il pin numero 1 del 244 era uguale a 0B spenta ,accendo la pompa if ( (PIN&2) ==0) { POUT = POUT | ( 2); } MB(0X801)=POUT; //lo stato desiderato dei pin del porto 373 , che prima ho preparato nella variabile POUT, adesso lo trasferisco sul chip. Solo ora i pin del 373 vengono modificati. } } Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. Sistemi di controllo analogici Aldini 30/01/08 ESERCIZIO 2 5 di 18 Un sistema HC11 dispone di un porto di ingresso posto all'indirizzo 0x1003 e di un porto di uscita posto all'indirizzo 0x1004. Al porto di input sono collegti i segnali A,B di due fotocellule poste all'ingresso e all'uscita di nun corridoio. Progetta il SW che controlla gli accessi del corridoio di figura in modo che si accenda un led quando il corridoio è occupato. Soluzione: utilizzo una variabile cont che incremento ogni volta che uno entra (fronte su A) e decremento quando uno esce (fronte su B) Questa variabile dunque tiene il contro dei presenti. Per decidere se accendere il led basta verificare se è >0. CODIFICA NEL LINGUAGGIO C per HC11: #include “io68hc11.h” unsigned char IN, INprec, OUT; int cont; main() { Inprec=0; cont=0; while(1) // ciclo infinito { IN=MB(0x1003); //lettura del byte all' indirzzo 0x1003 if ( (IN&1) == 1 && (INprec&1) == 0) //se il bit 1 ora vale 1 e prima valeva 0.... {cont ++; } if ( (IN&2) ==2 && (INprec & 2) == 0 ) {cont --; } if (cont>100) //se ci sono più di 100 persone acc. led (metto a 1 il bit 1) { OUT=OUT | 1; // OUT = OUT | 2° accendo L } else { OUT=OUT & (~1) ; // OUT = OUT & ( ~2°) spengo L } MB (0x1004)=OUT; INprec=IN ; // il valore attuale delporto di ingresso, presente nella variabile IN // lo memorizzo in INprec, perché mi servirà' nel confronto // col nuovo valore che leggero' al prossimo giro } } ESERCIZIO 3 L'ascensore di fig. deve portarsi al piano 0 oppure al piano 1 a seconda che sia premuto P0 oppure P1. Quando è premuto PA, l'ascensore deve cambiare piano. Durante il movimento i pulsanti P1, P0 e PA sono ignorati. S0 ed S1 sono sensori che si portano a 1 quando l'ascensore è presente al piano in cui sono collocati. MS comanda il motore per la salita, MG per la discesa. Progetta l'algoritmo (e scrivi la sua codifica C) che Codifica C controlla il movimento dell'ascensore in accordo Debbo ricordarmi a quali pin ho collegatoi segnali di ingresso con queste specifiche. e di uscita e quali sono gli indirizzi del porto di ingresso (0x2000) e di uscita (0x2001) #include<io68hc11.h> char unsigned IN,OUT; // oppure P244,P373 main() { OUT=0; //MG ed MS=0, parto col motore spento. MB(0x2001)=OUT; while(1) //ciclo infinito { IN=MB(0x2000); //lettura degli ingressi. Gli 8 segnali (tra cui Pa..) del 244, vengono memorizzati nella variabile IN. if (IN & 8) //S0, pin numero 3 → 23=8, è attivo? { OUT= OUT& (~2); MB(0x2001)=OUT; //MG =0 if ( (IN & 4) || (IN & 2 ) ) //PA o P1 sono uguali a uno? { OUT=OUT |1; //MS viene messo a uno } } if (IN & 16) //S1 è uguale a uno? { OUT=OUT &(~1); 1. if ( (IN&4) || (IN&1) ) { OUT=OUT |2; } } MB(0x2001)=OUT; } } Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 ESERCIZIO 4 (PROGETTO ASCENSORE COMPRENSIVO DELLA PARTE For HW) Evaluation Only. Sistemi di controllo analogici Aldini 30/01/08 6 di 18 L'ascensore di fig.1 deve portarsi al piano 0 oppure al piano 1 a seconda che sia premuto P0 oppure P1. Quando è premuto PA, l'ascensore deve cambiare piano. Durante il movimento i pulsanti P1, P0 e PA sono ignorati. S0 ed S1 sono sensori che si portano a 1 quando l'ascensore è presente al piano in cui sono collocati. MS comanda il motore per la salita, MG per la discesa. Progetta l'HW/SW di un sistema che controlli l'ascensore, utilizzando un HC11, un chip di SRAM da 8K, un chip di EPROM da 16K, un 244 ed un 373 PROGETTO HW Di seguito è riportato lo schema elettrico di massima del sistema a uC, comprendente le memorie (SRAM e EPROM), il PAL, i dispositivi di I/O (244 e 373). L’EPROM essendo una memoria non volatile è destinata a contenere il programma (le istruzioni), mentre la SRAM è usata per le variabili. Il dispositivo PAL (acronimo di PROGRAMMABLE ARRAY LOGIC) serve ad abilitare, in base all’indirizzo che il µC pone sull’address bus, il chip che, in un determinato istante, deve rispondergli. MAPPA DEGLI INDIRIZZI: La mappa degli indirizzi stabilisce in quale posizione sono collocati tutti i chip del sistema. Nella compilazione della mappa bisogna seguire alcune regole (per i sistemi HC11): 1 – Alla fine della mappa deve essere presente un chip di memoria non volatile. All'avvio, infatti, il µC legge nelle celle FFFE,FFFF a quale indirizzo comincia il programma da eseguire Questa memoria serve a contenere il programma da eseguire all’ avvio. 2 – Le memorie collocate all’inizio della mappa devono essere inserite in ordine di capacità decrescente . (per semplificare le equazioni..) 3 - Le memorie collocate alla fine della mappa devono essere inserite in ordine di capacità decrescente verso l’alto. EQUAZIONI DEI CHIP-SELECT: CESRAM = A15∗ A14∗ A13 CEEPROM = A15∗A14 OE244=A15∗A14∗A13∗A12∗A11∗A10∗A9∗ A8∗A7∗A6∗ A5∗A4∗A3∗A2∗A1∗A0∗RD G373= A15∗ A14∗ A13∗A12∗ A11∗A10∗A9∗ A8∗A7∗ A6∗ A5∗A4∗A3∗ A2∗A1∗A0∗WR RD= E∗ R/W WR= E∗ R/W PROGETTO SW I pulsanti vanno controllati solo ad ascensore fermo, cioè quando S1 oppure S0 valgono 1. Quando S0 vale 1, cioè l'ascensore è al piano 0, intanto spengo MG (Motore Giù) perchè potrebbe essere appena arrivato qui (scendendo mosso da MG=1), e dunque debbo fermarlo; poi guardo se debbo salire al piano 1 → controllo P1 e PA. Se uno dei due risulta attivo accendo il motore per la salita. Ragionamenti analoghi debbo svolgere quando il motore si trova al piano 1, cioè S1==1. Codifica C Debbo ricordarmi a quali pin ho collegato i segnali di ingresso e di uscita e quali sono gli indirizzi del porto di ingresso (0x2000) e di uscita (0x2001) #include<io68hc11.h> char unsigned IN,OUT; // oppure P244,P373 main() { OUT=0; //MG ed MS=0, parto col motore spento. MB(0x2001)=OUT; while(1) //ciclo infinito { IN=MB(0x2000); //lettura degli ingressi. Gli 8 segnali (tra cui Pa..) del 244, vengono memorizzati nella variabile IN. if (IN & 8) //S0, pin numero 3 → 23=8, è attivo? { OUT= OUT& (~2); MB(0x2001)=OUT; //MG =0 if ( (IN & 32) || (IN & 128 ) ) //PA o P1 sono uguali a uno? { OUT=OUT |1; //MS viene messo a uno } } if (IN & 16) //S1 è uguale a uno? { OUT=OUT &(~1); if((IN&32)|(IN&64)) { OUT=OUT |2; } } MB(0x2001)=OUT; } } NEL CASO NON SIA STATO ANCORA SVOLTO IL PROGETTO HW, Edited DEVI STUDIARE SOLO LA PARTE SW !! Sistemi di controllo analogici Aldini 30/01/08 7 di 18 by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. ESERCIZIO 5 Un sistema con HC11 dispone di: 1 chip di SRAM da 16K, 2 chip di EPROM (EPR1 ed EPR2) da 16K e 8K, un HPDL2416, un 244 ed un 373 1) Completa lo schema HW di figura indicando dove collegare i segnali P (pulsante), M (comando di accensione/spegnimento di un motore), G (onda quadra generata da un NE555 con f=1kHz), L (Led), A,B (sensori che si attivano quando sfiorati da un oggetto) 2) Calcola le equazioni dei chip select delle EPROM e dell'HPDL2416 NB: per gli algoritmi seguenti non è consentito inserire cicli di attesa interni al ciclo infinito. 3) Da uno scivolo giungono sul nastro delle lastre. Progetta l' algoritmo che accende il motore M per il solo tempo necessario al trasferimento di ogni lastra nel raccoglitore. Assumi che durante il trasferimento, nessuna nuova lastra sia fatta scivolare sul nastro 4) Codifica in C l'algoritmo precedente (oppure il 4 bis) 5) Progetta nuovamente l'algoritmo 3, facendo pero' in modo che il motore si arresti solo dopo 2 secondi dal momento in cui la lastra ha abbandonato A. 6) Progetta nuovamente l'algoritmo 3 assumendo però che una nuova lastra possa essere immessa nello scivolo appena risulta sgombro, anche senza aspettare che le lastre precedenti sia state trasferite nel raccoglitore. HW------------------------------------------------------------------------------------------------------------------------- SW --------------------------------------------------------------------------------------------------#include<io68hc11.h> unsigned char p244,p373,p244p; main() {p373=0; MB(0x800)=p373; while(1) { p244=MB(0x802); if((p244&2)&&!(p244p&2)) {p373=p373|1; } if(!(p244&1)&&(p244p&1)) {p373=p373&(~1); } MB(0X800)=p373; p244p=p244; } } diagramma a blocchi codifica C Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. Sistemi di controllo analogici Aldini 30/01/08 ESERCIZIO 6 TESTO: Un sistema basato sul µC 68HC11, deve essere dotato dei seguenti chip: ● un chip di SRAM (2K), ● un chip di EPROM1 (2K) ● un 373 ● un 244. Le interfacce di I/O debbono essere collegate ai segnali A,B,L di figura in cui A e B sono barriere ottiche ed L è un led 1) Progetta l'HW del sistema (schema, mappa degli indirizzi, equazioni dei chip-select) 2) Progetta il SW di controllo (ALGORITMO + CODIFICA C) che accende il led L quando l'elica gira in senso antiorario e lo tiene spento quando gira in senso opposto. PROGETTO HW: MAPPA DEGLI INDIRIZZI: vedi figura 2 EQUAZIONI DEI CHIP-SELECT CESRAM = A15 ⋅ A14 ⋅ A13 ⋅ A12 ⋅ A11 CEEPROM = A15 ⋅ A14 ⋅ A13 ⋅ A12 ⋅ A11 OE 244 = A15 ⋅ A14 ⋅ A13 ⋅ A12 ⋅ A11 ⋅ A10 ⋅ A9 ⋅ A8 ⋅ A 7 ⋅ A 6 ⋅ A5 ⋅ A 4 ⋅ A3 ⋅ A 2 ⋅ A1 ⋅ A0 ⋅ RD G 373 = A15 ⋅ A14 ⋅ A13 ⋅ A12 ⋅ A11 ⋅ A10 ⋅ A9 ⋅ A8 ⋅ A 7 ⋅ A 6 ⋅ A5 ⋅ A 4 ⋅ A3 ⋅ A 2 ⋅ A1 ⋅ A 0 ⋅ WR WR = R / W ⋅ E ; RD = R / W ⋅ E PROGETTO SW: CODIFICA NEL LINGUAGGIO C per HC11: #include<io68hc11.h> unsigned char P244, P244p, P373; main() { P373=0;MB(0x0801)=P373; //spengo tutti i pin del 373 while(1) { P244 = MB(0x0800); if ((P244 & 1) && ! (P244p & 1)) { if ((P244 & 2) ==0) P373&=~1; else P373 |= 1; } MB (0x0801)=P373; P244p=P244; // il valore attuale del 244, // presente nella variabile in // lo memorizzo in P244p, perché // mi servirà' nel confronto col nuovo valore // che leggero' al prossimo giro Ad ogni fronte di A, controllo il valore di B; se B vale 0 (quindi la fotocellula non è oscurata) vuol dire che l’elica sta girando da A verso B, quindi in senso orario (spengo il led L). Se invece al momento in cui si rileva il fronte di A, B vale 1; vuol dire che l’elica sta girando in senso antiorario e perciò devo accendere il led L. } } 8 di 18 Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. Sistemi di controllo analogici Aldini 30/01/08 ESERCIZIO 7 La tavola porta pezzi di figura deve muoversi alternativamente tra i due fine corsa Fs ed Fd. Il movimento verso destra è ottenuto attivando il segnale Ms, quello verso sinistra Md. Alla pressione del tasto Pstart deve iniziare il movimento della tavola che deve arrestarsi soltanto alla pressione di Pstop. L'unica posizione di riposo consentita per la tavola deve essere quella corrispondente all'attivazione di Fd . 1) progetta l'HW usando un chip di SRAM da 2K, uno di EPROM da 4K, un 373,un 244. (indicando anche i collegamenti del sistema con i segnali Fs,Fd,Pstart,Pstop, MS,MD) 2) progetta il SW e codificalo in C. PROGETTO HW: EQUAZIONI DEI CHIP-SELECT: oe244=A15∗A14∗A13∗A12∗A11∗A10∗A9∗A8∗A7∗A6∗A5∗A4∗A3∗A2∗A1∗A0∗RD G373= A15∗A14∗A13∗A12∗A11∗A10∗A9∗A8∗A7∗A6∗A5∗A4∗A3∗A2∗A1∗A0∗WR CsEPROM1=A15∗A14∗A13∗A12 RD= R /W ∗E WR= R /W ∗E PROGETTO SW: Nel diagramma di flusso abbiamo usato una flag Fstop perchè ci dobbiamo ricordare quali dei due pulsanti Pstop e Pstart è stato premuto per ultimo. Quando Fstop=1 vuol dire che l'ultimo pulsante premuto è stato Pstop. Nell'algoritmo, quidni, ogni volta che vengono premuti Pstart e Pstop semplicemente ci ricordiamo questi eventi settando/resettando la flag Fstop. Quando si attiva Fs non si deve fare altro che invertire il verso del movimento. Se invece la tavola è in prossimità di FD, disattiviamo Ms e poi controlliamo se dobbiamo arrestarci oppure far ripartire il movimento verso sinistra. Basterà verificare se la flag Fstop vale 1. In questo caso infatti vuol dire che l'ultimo pulante premuto è stato Pstop. 9 di 18 Sistemi di controllo analogici Aldini 30/01/08 ESEMPIO RIASSUNTIVO COMPLETO DI PROGETTO HW/SW Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. 10 di 18 Un sistema con HC11 dispone di: 1 chip di SRAM da 2K, 2 chip di EPROM (EPR1 ed EPR2) da 32 e 16K, un 244 ed un 373. 1) Completa lo schema HW di figura indicando dove collegare i segnali A,B (barriere ottiche) ed R,G (Led Rosso,Giallo) 2) Calcola le equazioni dei chip select delle EPROM, della SRAM e del 373. 3) Progetta l' algoritmo che accende il led Giallo quando il numero di pezzi trasportati dal nastro raggiunge il valore 100, ed il led Rosso qualora un pezzo risulti più corto di 2 m. (il Led R deve spegnersi appena viene rilevato un pezzo più lungo di 2m) 4) Codifica in C l' algoritmo del punto precedente. Soluzione PUNTO 1) I segnali A,B sono ingressi (sono segnali che il micro deve leggere), quindi li collego al 244. I segnali G ed R sono uscite (il micro deve scriverli, cioè impostarne il valore 1/0) perciò li collego al 373. Soluzione PUNTO 2) Per calcolare le equazioni dei chip-select debbo compilare la mappa degli indirizzi che occupa lo spazio da 0000 a FFFF (il micro ha 16 fili di indirizzo, Quando tutti sono posti a 1, per esprimere l'ultimo indirizzo, il numero rappresentato in esadecimale è FFFF). Gli ultimi indirizzi della mappa debbono essere coperti da una memoria non volatile. Nel nostro caso metteremo dunque un chip di EPROM (la memoria non volatile in fondo è necessaria perché quando il micro viene acceso/resettato preleva dalle celle FFFE ed FFFF l'indirizzo del programma da eseguire). I chip, sia quelli collocati a partire dal fondo (EPROM) sia quelli collocati a partire dall'inizio 0000 (SRAM), vanno disposti in ordine di capacità decrescente (per semplificare la scrittura delle equazioni) Metteremo dunque EPR1 (il chip più grande) in fondo, ed EPR2 sopra. Allo stesso modo disporremo SRAM all'inizio e solo dopo i chip più piccoli 244 e 373. 0000+ 07FF (vedi tabella, riga con 2K) oppure scrivi undici uno e convertili in esadecimale (undici perchè 2K=2 11) 7FFF 3FFF = (vedi tabella 16K) 4000 8000 1= 7FFF debbo determinare l'indirizzo che precede 8000 FFFF 7FFF = (vedi tabella 32K) 8000 Sistemi di controllo analogici Aldini 30/01/08 2K=211 ---> scrivo il prodotto da A15 ad A11 Edited by Foxit PDF Editor Copyright (c) by Foxit Software Company, 2004 For Evaluation Only. 11 di 18 Indirizzo di partenza = $0000 , in binario 0000 0000 0000 0000 (nego i segnali sottoposti ad uno 0) CS _ SRAM =A15 A14 A13 A12 A11 NB: il nome del segnale, CS__SRAM è lo stesso usato nello schema ! 32K=215 -->scrivo A15 Indirizzo di partenza = $8000 , in binario 1000 0000 0000 0000 CS _ EPR1=A15 16K=214--> scrivo il prodotto da A15 ad A14 Indirizzo di partenza = $4000 , in binario 0100 0000 0000 0000 CS _ EPR2= A15 A14 1 Byte = 20--> scrivo il prodotto da A15 ad A0 Indirizzo di partenza = $0801 , in binario 0000 1000 0000 0001 G373=A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 WR Condiziono il chip select dei 373 (si procede in modo analogo per i 244) con il segnale di abilitazione alla scrittura WR Soluzione PUNTO 3) Per contare i pezzi basta usare un contatore, cioè una variabile incrementata di 1 ogni volta che una delle due barriere, ad esempio A, si attiva. Le attivazioni da intercettare sono i fronti e NON i livelli. Ogni pezzo infatti, quando entra nel campo della barriera genera un solo fronte, perciò il blocco CONT++ verrà correttamente eseguito una sola volta per ogni pezzo. Il livello di A invece resta attivo per ogni pezzo molto tempo, durante il quale il micro può' compiere molte letture, trovando tutte le volte A=1. Se il blocco CONT++ venisse eseguito ogni volta che A==1, CONT verrebbe incrementato moltissime volte anche se sta passando un solo pezzo. Per rilevare se un pezzo è minore di due metri, basta guardare, non appena il pezzo raggiunge B (cioè quando B passa da 0 a 1, cioè presenta un fronte di salita) quanto vale A, che dista da B 2 metri. Se A vale 0 il pezzo è più corto, altrimenti è più lungo Soluzione PUNTO 4) #include <io68hc11.h> unsigned char P244,P244p,P373, CONT; main() { P373=0X00; //tutti i bit a 0 MB(0x801)=P373; //scrivo sull'integrato HC373 quanto preprato nella //variabile P373 --> 'spengo' tutti i pin while(1) { P244=MB ( 0X0800); //mem. nella var P244 lo stato degli 8 ingressi del 244 if( (P244 & 2) && !(P244p & 2) ) // faccio &2 perchè A è sul pin 1 e 21 = 2 !!! { CONT++; if ( CONT == 100) { P373 =P373 | 2; //G=1 } } if( (P244 & 1) && !(P244p & 1) ) // faccio &2 perchè A è sul pin 1 e 21 = 2 !!! { CONT++; if (! (P244 & 2)) //se il segnale A (bit numero 1 --> 21=2 ) vale 0 { P373 =P373 | 1; } //R=1 else { P373 =P373 & (~ 1); } // R=0 } MB(0x801)=P373; //scrivo sul HC373 quanto preparato nella variabile P373 P244p=P244; //memorizzo lo stato del 244 appena letto nella var P244p in //modo che alla prossima lettura (vei P244=MB(0X800) in essa //possa trovare lo stato precedente del 244 ed avere così, nelle //variabili P244 e P244p rispettivamente lo stato attuale e //quello precedete di tutti i segnali del 244 }//fine while } //fine main