mercoledì 26 giugno 2013

Introduzione ad ASF (terza parte)

Indice degli articoli su ASF
Vediamo in questo articolo come aggiungere al nostro programma HelloASF nuovi moduli ASF, aggiungeremo per la precisione il servizio Delay routines che ci fornirà nuovi metodi per inserire dei brevi ritardi temporali nel nostro codice.
Apriamo il nostro progetto HelloASF creato negli articoli precedenti e scegliamo dal menù ASF la voce ASF Wizard
menu
Apparirà una schermata da cui potremmo scegliere i moduli da aggiungere al nostro progetto, selezioniamo la voce Delay routines (service) dall’elenco di sinistra e premiamo il pulsante Add,il modulo apparirà anche nell’elenco di destra.
asfwizard
Possiamo aggiungere in un colpo solo anche più moduli ma per il momento ci basterà il modulo che abbiamo scelto, premiamo il pulsante Apply, una finestra riepilogativa ci informerà delle operazioni che verranno compiute.
summary
E’ possibile notare che oltre al servizio scelto verranno aggiunti altri servizi, questo perché Delay routines dipende da altri servizi e driver che dovranno essere inclusi per il corretto funzionamento.
Facciamo click su OK e aspettiamo che Atmel Studio compia le operazioni indicate
tree
Tramite il Solution Explorer possiamo notare che sono state aggiunte al progetto diverse nuove cartelle e file. L’aggiunta di un modulo è proprio la copia di questi file.
In particolare è stato aggiunto anche il servizio System Clock Control che è fondamentale e ci permetterà di cambiare il clock del nostro microcontrollore che all’avvio è sempre di 2 MHz da un’oscillatore RC interno.
Rispetto ai micro ATTiny ed ATMega si ha un grande cambiamento, il clock non viene più impostato tramite i fuse ma a runtime. Questo può evitare condizioni particolarmente spiacevoli come l’inutilizzabilità di un micro saldato su una scheda senza oscillatore se per sbaglio si è impostato il rispettivo fuse per il clock da cristallo esterno. Permette di cambiare inoltre in modo dinamico al frequenza operativa per ottenere il massimo risparmio energetico o la massima velocità a seconda delle necessità
Il servizio Delay routines necessita del servizio System Clock Control per sapere la frequenza attuale del microcontrollore, a sua volta il servizio sysclk (abbreviazione per System Clock Control da ora in poi) ricava questa informazione dal file di configurazione conf_clock.h che dovrà essere impostato correttamente dal programmatore oltre ad offrire utili funzioni per la gestione del clock.
Iniziamo ad intravedere una stessa struttura logica coerente, i moduli spesso richiedono dei parametri tramite un file conf_X.h (dove X è il nome del modulo) nella cartella config mentre i file sorgenti dei moduli sono inseriti nelle cartelle common ed xmega in base alla loro tipologia (servizi o driver).
E’ da notare che non avviene nessun “collegamento” a librerie esterne ma i sorgenti vengono copiati nel progetto, sia i file di intestazione (.h) sia i file di codice (.c). Questo fatto comporta vantaggi ma anche svantaggi, non è consigliato apportare modifiche ai file di codice sorgente perché eventuali aggiornamenti a nuove versioni di ASF sovrascriveranno i file e le nostre modifiche andranno perse e riapplicate manualmente.
Modifichiamo ora il nostro programma nel seguente modo:
code
Abbiamo inserito la chiamata alla funzione sysclk_init() che in base al file conf_clock.h imposterà il clock di sistema. Come il modulo IOPORT e BOARD ritroviamo dunque che la prima cosa in genere da fare è chiamare la funzione _init. Per il momento non apportiamo nessuna modifica al file conf_clock.h, diamo però una rapida occhiata alla prima parte di questo file:
conf_clock
Notiamo che è composto esclusivamente da #define e le righe commentate forniscono una sorta di documentazione che può evitarci l’apertura della guida, per cambiare il clock di sistema dai 2 MHz di default ai 32 MHz sarà sufficiente commentare la prima riga e togliere il commento dalla seconda.
Vedremo maggiori dettagli sul servizio sysclk in un successivo articolo, per il momento ci basta sapere che non “toccando” nulla avremo un clock di 2 MHz.
Torniamo adesso al nostro codice, riportato sotto per comodità di lettura:
code
Il servizio Delay routines ha la funzione delay_init() deprecata, questo significa che non è consigliato chiamarla ed è presente solamente per compatibilità. Non è infatti più necessaria per il funzionamento del servizio nelle nuove versioni di ASF. Nel codice è presente commentata proprio per ricordare questo fatto.
Nel ciclo infinito while sono presenti nuove istruzioni che faranno lampeggiare il primo led (quello rosso), abbiamo già incontrato l’istruzione ioport_set_pin_level che imposta il livello logico di un pin, sotto notiamo l’istruzione delay_s il cui scopo è fermare l’esecuzione per i secondi indicati come parametro. Avremo quindi un ciclo ON/OFF di due secondi che ci permetterà di osservare il lampeggio del led.
Il segnale che controllerà il led visto dall’oscilloscopio sarà un’onda quadra
oscilloscope
Il servizio Delay routines ci offre anche altri due metodi per generare ritardi più brevi, delay_ms() per ritardi in millisecondi e delay_us() se necessitiamo di brevissimi ritardi in microsecondi.

Nessun commento:

Posta un commento