Obiettivi Guida alla Quarta Esercitazione curata da Ilaria Casale Dopo aver svolto questa esercitazione si sarà appreso come: Utilizzare una breadboard Verificare la presenza dell'alimentazione della scheda LPCXpresso accendendo un led esterno montato sulla breadboard Pilotare un led esterno sfruttando il microcontrollore della LPCXpresso Gestire l'input digitale come stato di pulsanti esterni e come gestire i problemi legati al rimbalzo dei contatti degli stessi pulsanti Breadboard E importante memorizzare come sono fatte le connessioni interne di questa basetta utile al montaggio di semplici prototipi. Le due parti sopra e sotto a una linea centrale, sono formate da gruppi di 5 pin, in verticale, in cortocircuito tra loro. Queste vengono utilizzate per i collegamenti tra componenti. Le due barre alle estremità superiore e inferiore sono utili per fornire alla breadboard l alimentazione, duale o singola (nei piedini disposti orizzontalmente che si trovano accanto alla linea rossa) e quelli utili a fornire un collegamento a massa (nei piedini accanto alla linea blu). Nel nostro caso, l alimentazione che sarà possibile fornire è di 3.3 V (disponibile dalla scheda LPCXpresso). Avendo, come già visto, due linee per l alimentazione e due per la massa, se si volesse un alimentazione singola, si dovrebbero cortocircuitare le due linee rosse e le due linee blu che si trovano rispettivamente in alto e in basso rispetto alla figura precedente. In tal caso sarebbe possibile utilizzare tutta la breadboard avendo facile accesso (da parte dei componenti) ad esse sia nella parte inferiore che in quella superiore della basetta.
ATTENZIONE: Alcune di queste sono formate da due piccole breadboard unite tra loro, quindi è presente una separazione al centro (in verticale) e va tenuto presente che vanno effettuati due collegamenti sia per la massa che per l alimentazione.
Prima prova (livello 0, non si utilizza il microcontrollore) Quando si costruisce un circuito sulla breadboard e si vuole che questo mandi o riceva segnali da una scheda con microcontrollore (in questo caso LPCXpresso) si deve utilizzare un terminale di riferimento, la massa, tra le due. Due schede riescono a comunicare se, utilizzando segnali di tensione, sono riferite allo stesso potenziale che considerano come 0 (gnd, massa). In questa prova si vuole semplicemente far accendere un led, montato sulla breaboard, utilizzando l alimentazione della scheda LPCXpresso che vedrà quindi il circuito esterno come un carico utilizzatore. Si prende un led e un resistore intorno ai 750 Ω, (colori: viola verde e marrone). Il led è un diodo e come tale è costituito da un anodo (la parte più lunga) e un catodo (la parte più corta o contrassegnato da una limatura del case). Sulla scheda LPCXpresso, il pin 28 sarà usato per fornire l alimentazione e i pin 1 e 54 sono per il collegamento a massa (come si può vedere dallo schema di LPCXpresso). Si procede collegando il pin 28 alla linea di alimentazione della breadboard e il pin 51 o 1 alla linea di massa, si pone il resistore tra l alimentazione e l anodo (la parte positiva del led) e si connette il catodo a massa.
Collegando LPCXpresso al computer, fornendo quindi l alimentazione, si dovrà accendere il led. È meglio tagliare a esempio i reofori dei resistori, lasciando solo la parte necessaria al collegamento (circa 5 o 6 mm), al fine di rendere più comodo il lavoro e di evitare possibili cortocircuiti tra i componenti.
Progetto blinker Si vuole far lampeggiare il led sfruttando quindi il microcontrollore. Si sfrutta ad esempio il p0.4 che si trova sul pin 38. Si sposta quindi il collegamento che stava sull alimentazione dal pin 28 al 38. Il led si spegne, avendo l anodo connesso a p0.4. Quest ultimo è inizialmente considerato un ingresso e potrebbe quindi avere dei pull-up e dei pull-down, non forti, che fanno si comunque che arrivi una piccola quantità di corrente al led. Consiglio: Per una questione di colpo d occhio conviene usare per collegamenti a massa colori scuri (nero, blu..) e per le alimentazioni colori come il rosso, arancione etc.. Si avvia l IDE e si apre il progetto Lab4a_blinker (ricavato dalla copia del codice precedente, contenente i file timer.h e timer.c) in cui si inseriscono le istruzioni per pilotare il p0.4: Configurarlo come uscita: Spegnere il Led: Nel ciclo infinito while(1), si inseriscono le istruzioni per far lampeggiare il led esterno con una frequenza abbastanza bassa in modo da poterla osservare:
Seconda prova E necessario l utilizzo di un pulsante, che può essere di due tipi: Con 2 pin, in questo caso premendolo si cortocircuitano questi (non premuto è visto come circuito aperto). Con 4 pin, caratterizzati da due coppie di pin (il lato in cui sono più vicini) che sono internamente connessi, quindi il risultato è analogo alla tipologia precedente, ovvero quando il pulsante è premuto si mettono in corto circuito i due lati "più lontani". L obiettivo è quello di accendere il led quando il pulsante viene premuto, quando è visto come un corto circuito. Per fare ciò è sufficiente implementare un semplice circuito in serie, in cui la corrente scorre nel ramo solo se il pulsante è premuto. Per lavorare in logica negata, ovvero se il pulsante è rilasciato il led è acceso, se è premuto il led è spento, va inserito il tasto in parallelo al led: Quando il pulsante è premuto la corrente scorre attraverso di esso, non passa quindi per il led che risulta spento. Un grande vantaggio nell avere a disposizione un sistema a microcontrollore, programmabile quindi via software, con la possibilità di stabilire input e output, è il poter passare ad esempio dalla logica diretta a quella negata, senza modificare la parte hardware, ma solamente lavorando a livello software. (La manutenzione ha un costo minore)
Progetto key-led L obiettivo accendere il led quando il pulsante è premuto. Si vuole utilizzare p2.0, il pin 42, per realizzare il circuito riportato: La resistenza da 1 kω di protezione è necessaria a garantire che, nel caso in cui p2.0 fosse rimasto configurato come uscita, qualora si premesse il pulsante, non passerebbero più di 3 ma evitando la rottura dei transistor interni. Il corto circuito verso massa c è quando il tasto è premuto (pull-down) e viene visto nel p2.0 lo 0 logico, altrimenti a p2.0 arrivano 3,3V e si vede l 1 logico. Si procede duplicando il progetto precedente e denominandone la copia Lab4b_keyled in cui si vanno ad inserire nella funzione main le istruzioni necessarie per accendere o spegnere il LED in base allo stato del pulsante. Vengono modificate solo quelle all interno del ciclo infinito: Se lo stato di p0.2 è 1 (quindi se il pulsante non è premuto) Si spegne il led : Altrimenti (else), si accende:
Progetto toggle Fornito il diagramma di flusso, scrivere il codice. Si vuole risolvere il problema del rimbalzo, ogni volta che il pulsante viene premuto deve essere commutato lo stato del led (della GPIO p.04). Una possibile soluzione prevede il seguente diagramma di flusso in cui sono state inserite delle variabili. Si procede quindi eseguendo il clean del vecchio progetto key-led, duplicandolo e denominandolo Lab4c_toggle. Si dichiara la variabile toggle che inizialmente viene posta a 0, utile per registrare lo stato del p2.0: Ongi volta che il pulsante viene premuto va negato il suo valore. N.B. In C la negazione bit a bit è indicata con il simbolo ~ e la negazione dello stato logico è indicata con il simbolo!. Un numero è falso se vare 0, è vero in qualunque altro caso (basta che un bit dell intero numero sia 1). Se FIOPIN mascherato sul bit 0 (della GPIO2), quindi se p2.0 non è 0 (la condizione è quindi vera) il pulsante è rilasciato e in questo caso si spegne il led. Altrimenti se il pulsate è premuto si accende il led. Se vogliamo che lavori in logica negata, si vuole che la condizione sia lo stato di p2.0 negato. Quindi si procede o inserendo un! prima della condizione o aggiungendo un confronto con lo zero. Questo mi dice se il tasto è premuto, perché quando ciò avviene il pin 0 sta a 0. Come già detto se questa condizione è verificata si cambia lo stato di toggle:
Nelle righe successive si utilizza quindi tale variabile, se vale 1 si accende il led altrimenti si spegne. Così ogni volta che si preme il pulsante cambia lo stato di una variabile che viene usata per controllare l accensione del led. Si osserva un PROBLEMA dovuto al rimbalzo meccanico del led (a volte rimane acceso o si spegne quando non dovrebbe etc..), si potrebbe risolvere al livello hardware, ma quando il numero dei tasti utilizzati aumenta, ciò diventa dispendioso. Molto spesso la soluzione si trova via software, inserendo una pausa di 100, 200 ms dopo aver effettuato la commutazione (per avere il tempo di rilasciare il led). Tale soluzione funziona, eccetto se si tiene premuto il pulsante, in tal caso si osserva il led lampeggiare, questo perché durante la pausa il programma non riconosce che il tasto non è stato rilasciato, così quando questa finisce, valuta che questo è premuto e commuta il suo stato.
Progetto set-reset Si crea una copia del progetto toggle, e la si nomina Lab4d_set_reset al fine di implementare un codice non affetto dall ultimo problema citato. A tale scopo si utilizzano i fronti del segnale dovuto alla commutazione del tasto. Si osserva la condizione del primo if all interno della funzione principale: che è verificata quando il pulsante è premuto e la variabile set, che indica il fronte del tasto, sta a 0. Il simbolo && in C indica un AND logico. Inizialmente la variabile set è stata posta a 0, perciò quella condizione è vera, non appena il tasto viene premuto. Poi come nel progetto precedente si nega il contenuto della variabile che ora è chiamata status: All interno dello stesso if ne è stato inserito un secondo per commutare lo stato del led: Dopo che è stato premuto il tasto va commutato lo stato della variabile set e inserita una breve pausa al fine di non rischiare di non vedere tutti i fronti del segnale del pulsante essendo questo programma molto semplice e quindi rapido. L aver posto la variabile set a 1, assicura che la condizione del primo if non sia verificata e quindi si va avanti nel programma eseguendo un secondo ciclo la cui condizione è verificata se il pulsante è rilasciato e il valore di set è 1 (opposto alla prima). In tal caso si riporta set a 0, per poter ricominciare il tutto, ricordandosi di inserire anche qui una breve pausa. N.B. In C il simbolo!= ha il significato di diverso. Quindi in tale codice si nota: RESET, quando il pulsante è rilasciato (Secondo ciclo if) SET, quando il pulsante è premuto (Primo ciclo if) E possibile quindi tenere premuto il pulsante senza che lo stato del led commuti, ciò fa si che la specifica sia soddisfatta.