Università degli studi di Firenze - Facoltà di Ingegneria Informatica Prestazioni e potenzialità della scheda Motorola M68DEMO908GB60 e del suo microcontrollore MC9S08GB60/HCS08 Anno accademico 2004 - 2005 Corso di Informatica Industriale A cura di Matteo Tempestini Indice 1. La scheda………………………………………………………pag.3 1.1 Demo programs……………………………………………………...pag.4 2. 9S08GB60 8-BIT microcontroller…………………………….pag.5 2.1 Caratteristiche generali della CPU …..……………………………..pag.5 2.2 Memoria…………………………………………………………….pag.6 2.3 Controlli…………………………………………………………….pag.6 2.4 Interruzioni………………………………………………………….pag.6 2.5 Modulo interno di generazione del clock…………………………...pag.6 2.6 CPU…………………………………………………………………pag.8 2.7 Parallel Input/Output………………………………………………..pag.8 2.8 Modulo generazione del Timer/PWM………………………………pag.8 2.9 Comunicazione seriale………………………………………………pag.9 2.10 Convertitore analogico-digitale…………………………………..pag.11 3. Utilizzo del controllore HCS08 attraverso CodeWarrior e del linguaggio C…………………….……………………………..pag.12 3.1 Initial Code e preparazione del progetto………………………….…pag.15 3.2 Aggiungere files al progetto………………………………………....pag.16 3.3 Inserire il codice dell’applicazione………………………………….pag.16 2 Capitolo 1 LA SCHEDA Il sistema in esame è una scheda per microcontrollori M9S08GB60 ideata per essere usata in ambienti di ricerca. In dotazione è fornito un software per la gestione, un cavo seriale di collegamento, un monitor per debug inserito in memoria. Caratteristiche tecniche: M9S08GB60 CPU * 60K Byte Flash * 4K Bytes Ram * 56 I/O lines (64 pins) * 5 channel TPM 2 Timer * 3 channel TPM 1 Timer * 8 Channel 10 BIT A/D * SPI and IIC Serial Ports * 2 x SCI Serial Ports * Key Board Wake-up Ports * BDM DEBUG Port * Clock generator w/ FLL * up to 40Mhz operation 32Khz Crystal Regulated +3.3V power supply SCI1 Serial Port w/ RS232 DB9-S Connector * SCI1 Serial Port SCI2 Serial Port w/ RS232 DB9-S Connector * SCI1 Serial Port Power ON/OFF switch User Components Provided * 5 LED Indicators (PTF0-3, PTD0) * 4 Push Switches (PTA4-7) * Digital to Analog (PTD2, PTB1) * 1.8Volt reference MCU I/O Port connector provides all digital I/O Analog or PTB I/O Port connector provides analog inputs or PTB I/O Prototype Area 2 x AA Battery Holder Supplied with DB9 Serial Cable, Documentation (CD), Board Size 4. x 4.5. Power Input: +6 to +12VDC, 9VDC typical Consumo corrente: 30ma @ 9VDC input 3 1.1 DEMO PROGRAMS Quattro software sono già programmati nella flash memory della scheda Motorola: 1. Debug monitor: programma principale, assieme al software di controllo sul PC permette l’inserimento di programmi nella flash. 2. Low-power stop3 demo: specifica come il micro possa operare a bassa alimentazione in modo stop3. 3. Atd/time demo: mostra il setup di due timer come modulatori di ampiezza.La prima uscita comanda un integratore, l’altra un LED. L’ATD legge il voltaggio in uscita dall’integratore e modula l’intensità del LED. 4. Software paced loop: è un framework che può essere adoperato per le routine a struttura ciclica. Il Debug Background Mode (BDM, vedi anche capitolo 2) è una modalità di debug per la scheda. Per utilizzare il BDM è presente un “BDM pod” al quale collegare un debugger esterno come ad esempio appositi software su PC. Utile è il pin del BDM che autorizza, da solo, all’uso di tutti gli altri pin per le applicazioni di debug. Il monitor debug è, invece, un demo program, realizzato da Motorola, che occupa circa 1Kb della memoria flash e circa 50 byte dell’area di stack; opera con comandi binari via seriale su SCI1. In generale si preferisce utilizzare il BDM (ad esempio tramite cavo USB) rispetto al debug seriale perché opera su un pin solo (immune a disturbi), non si utilizzano aree di memoria e si lavora alla velocità del processore,dunque l’esecuzione di applicazioni è molto più veloce rispetto a quella effettuata con collegamento seriale. IMPORTANTE: Il monitor è inserito nella Memoria Flash, ma, se cancellato, deve essere reinserito attraverso una opportuna riprogrammazione fatta con connessione di tipo BDM ed il download dei file necessari per ricreare il monitor (vedi documentazione AN2140/D.pdf). Nel caso della scheda DEMO questo non può accadere in quento il monitor è inserito in un’area di memoria non accessibile e dunque non modificabile via seriale (nemmeno da errori di applicazione), ma solo con opportuni comandi attraverso il pod BDM. 4 Capitolo 2 9S08GB60 8-BIT MICROCONTROLLER APPLICAZIONI POSSIBILI: • “Handheld instruments” • Utilità con contatori • Sistemi di sicurezza • Controlli portatili La famiglia HCS08 di microcontrollers fa parte della produzione della HC08 Family con tecnologia avanzata per lunga durata della batteria, alte prestazioni e miglioramenti rispetto ai controllori precedenti come l’avanzato sviluppo del sostegno per il chip. Altre peculiarità sono le due interfacce di comunicazione seriale, una interfaccia seriale periferica, un convertitore digitale analogico ed otto canali di timer programmabili. 2.1 CARATTERISTICHE della CPU • • • • • • • • • • • • 8- BIT CPU HCS08 Low - Power Technology C-Optimized Architecture con moltiplicatore Unico collegamento per il debug Emulazione non intrusiva Flash Memory integrata di terza generazione Generatore interno di clock Convertitore A/D a 10 bit (a 8 canali) Timer a 16 bit programmabile (a 8 canali) Sistema di comunicazione seriale Sistema di protezione 56 linee di I/O I modi di funzionamento del microcontrollore sono: • Run mode • Active Background mode: modalità usata per programmare un codice di boot o un’applicazione nella flash memory per la prima volta o per cancellarla. • Wait mode: durante l’esecuzione di un istruzione. • Stop mode: modalità di arresto dei clocks interni. 5 2.2 MEMORIA La struttura della memoria è rappresentata in figura a lato. Essa consta di 4 Kb di Ram, un’area di Flash Memory non volatile, I/O status word ed i registri di stato e controllo. La ram mantiene i dati quando la CPU è in Stop mode,mentre all’accensione o al ripristino dalla modalità Stop reinizializza i dati. Parte di essa è usata come stack area. Nella flash sono presenti,oltre ai programmi a cui il controllore è adibito, i vari registri necessari per la configurazione del clock, il ripristino dello stato di macchina (es.reset), i registri di sicurezza. 2.3 CONTROLLI L’MCU in questione, ha un comando di reset che ripristina lo stato iniziale “di macchina”.Esso può essere attivato in sette modi diversi: • • • • • • • Power on Reset Low voltage detect Computer operating propely timer (COP) Illegal opcode detected Background debug forced reset Reset pin Clock reset Struttura della memoria Il sistema di COP watchdog forza la CPU al reset se individua un fault nell’esecuzione di una procedura (nella fattispecie non si è rispettata un certo limite temporale), dunque il COP deve essere periodicamente inizializzato ad un valore stabilito ed abilitato subito dopo. 2.4 INTERRUZIONI Esiste una gestione delle interruzioni attraverso un software proprio della CPU che si attiva o attraverso IRQ pin o con il timer-overflow o anche in particolari circostanze nel debug monitor. Nel caso di una interrupt vengono salvati i registri di macchina nello stack, viene posto ad 1 il bit di interruzione nel registro CCR e carica il vettore di interruzione relativo alla procedura che l’ha generata. Durante un’interrupt (salvo eccezioni rare) viene esclusa la possibilità di riportare a zero il bit relativo nel CCR e dunque di interrompere di nuovo la routine (ISR). Le interruzioni di tipo realtime (RTI) sono utilizzate per la generazione di interrupt periodiche per il funzionamento dell’oscillatore esterno, ma possono avere la funzione di far uscire la CPU da una modalità di Stop. Per maggiori informazioni su come siano costituiti i vari registri di interrupt si rimanda al reference manual. 2.5 MODULO INTERNO DI GENERAZIONE DEL CLOCK Questo modello di controllore è dotato di una generazione di clock interna (modulo ICG) per definire la frequenza di lavoro sul bus. 6 Distribuzione interna del clock Esso è dotato di varie opzioni per la generazione di clock in uscita. Come si vede in figura, ICG è fatto di quattro blocchi : • Oscillator: è collegato ad un cristallo esterno.Due ranges di frequenza sono selezionabili da software per garantire una migliore stabilità.Alternativamente è usato per gestire sorgenti esterne come clocks. Diagramma ICG • • • Internal Reference Generator: consta di due sorgenti di clock controllate. Una lavora approssimativamente sugli 8 Mhz e può essere adoperata come clock per controller debug monitor. L’altra è invece settata sui 243 Khz e può essere regolato via software per l’input temporizzato di certi dati. Frequency locked loop(FFL): permette di regolare clock interni o esterni a frequenze più elevate. Un bit di stato segnala l’uso di tale modalità o meno. Clock select: è il comando attraverso cui si sceglie il tipo di segnale che deve uscire dal modulo. ICGOUT è la frequenza multipla di FLL. ICGRCLK è la frequenza di riferimento del cristallo esterno e FFE è un segnale di controllo per selezionare quale clock agirà sul BCD. 7 2.6 CPU Caratteristiche di CPU: • Registri e memoria mappati in uno spazio di 64 Kb • Stack pointer a 16 bit • Index register a 16 bit • Accumulatore a 8 bit • Sette modalità di indirizzamento • Istruzioni per spostare i dati all’interno della memoria • Istruzioni di STOP e WAIT • Condizioni per trattare l’overflow, carry ed il branch condition. Per quanto concerne i metodi di indirizzamento dei dati si può operare una classificazione di questo tipo: 1. Inherent Addressing: dati memorizzati nei registri di macchina senza accesso alla memoria. 2. Relative Addressing: usato nei branch, consiste nell’indirizzare rispetto ad un offset precedentemente inserito in memoria. 3. Immediate Addressing: l’operando è codificato direttamente Registri di CPU nell’istruzione di macchina. 4. Direct Addressing: nell’istruzione viene inserito l’indirizzo del dato (su 8 bit più 8 di pagina). 5. Extended Addressing: nell’istruzione viene inserito l’indirizzo “esteso” del dato (su 16 bit). 6. Indexed Addressing: con sette variazioni (vedere manuale) di cui cinque utilizzano un registro indice a 16 bit e due il puntatore di stack come riferimento. 2.7 PARALLEL INPUT/OUTPUT I pin di ingresso/uscita paralleli sono 56, distribuiti su 7 porte (denominate dalla A alla G) di 8 pin ciascuna. 2.8 MODULO TIMER/PWM (TPM) Il microcontrollore Motorola è dotato di due moduli indipendenti Timer/PWM (indicati anche con la sigla TPM). 8 Il TPM (il cui modello è riportato in figura) è formato da 8 canali, ogni modulo ha un suo clock indipendente e la possibilità di essere configurato come PWM su ciascun canale, l’abilitazione del sistema di timer e un contatore (up/down) di operazioni. Schema di un canale del TPM Tutte le funzioni di timer sono associate ad un contatore a 16 bit che in modalità PWM è un up/down counter altrimenti è solo un up counter. 2.9 COMUNICAZIONE SERIALE Il microcontrollore MC9S08GB è dotato di due interfacce di comunicazione seriale (SCI), moduli che si possono considerare “ricevitori/trasmettitori” di tipo asincrono. Normalmente utilizzano un sistema di connessione RS232 seriale input/output (I/O) e possono essere adoperati per la comunicazione con altri sistemi embedded. Questo tipo di connessione offre caratteristiche particolari non facili da trovare in altri sistemi industriali come tecniche avanzate di campinamento dati e riduzione del rumore, la parità hardware, “reicever wake up” e il “double buffering”. Baud rate (clock) seriale del MC9S08GB 9 Riportiamo per semplicità solamente lo schema della generazione del clock seriale attraverso un baud rate a 16 bit (per gli schemi di trasmissione e ricezione si veda il manuale). Esso viene usato anche per il campionamento dei dati in ricezione. Il microcontrollore Motorola è anche provvisto di un modulo di comunicazione seriale in modo periferico (SPI) per il controllo della trasmissione dei dati sui pin in comunicazione tra due MCU; se SPI è disabilitato i pin di comunicazione seriale possono essere usati in general purpouse I/O. In particolare la connessione seriale tra MCU utilizza il modulo SPI creando un rapporto di tipo master-slave tra i due sistemi comunicanti. Il protocollo di comunicazione funziona così: il master prepara tutti i trasferimenti di dati e durante il trasferimento esegue uno shift data out mentre lo slave esegue uno shift data in (attraverso appositi shift register). Lo scambio di informazioni avviene grazie ad un clock generator presente solo nel master e trasmesso allo slave. Modulo SPI Il microcontrollore è provvisto inoltre di un modulo per la comunicazione con altri circuiti integrati (Inter Integrated Circuit Module – IIC). Questo protocollo usa una linea dati seriale (SDA) e una linea clock seriale (SCL) disposte in uscita su una porta logica di tipo AND per la trasmissione dati. Di norma una comunicazione è composta da 4 parti: • • • • Start Signal Trasmissione indirizzo Slave Trasmissione dati Stop Signal Diagramma temporale del modulo IIC 10 2.10 CONVERTITORE ANALOGICO DIGITALE (ATD) Il modulo di conversione analogico-digitale è provvisto di 8 canali che si condividono un’unica porta (la porta B). Ogni canale può essere indipendentemente attivato rispetto agli altri per operare come convertitore. L’ATD è una periferica del bus IP con un registro di approssimazione successiva (SAR) e un Sample & Hold. La risoluzione può essere a 8 o 10 bit, il tempo di campionamento 14 µs. In ingresso si trova un multiplexer per la gestione degli 8 ingressi analogici, la conversione può essere singola o continua. L’ATD possiede due stati differenti di funzionamento low power: 1. Stop Mode. L’ATD è in stato low power e termina ogni conversione singola o continua in corso. Fino a che non si esce dalla fase di Stop Mode (attraverso il set di un apposito bit detto ATDPU) il clock del modulo resta spento ed i registri di macchina mantengono i loro valori. 2. Power Down Mode. Il clock di conversione del modulo è disabilitato Modulo ATD e il circuito analogico è messo in stato di low power (il modulo ATD resta attivo!), ogni conversione in corso è terminata. Il modulo riprende la sua attività attraverso il set del bit ATDPU. In questa modalità di stand by i registri sono sempre accessibili. 11 Capitolo 3 UTILIZZO DEL CONTROLLORE HCS08 ATTRAVERSO “CODEWARRIOR” ED IL LINGUAGGIO C Questa sezione si occupa di introdurre all’implementazione di algoritmi sul microcontrollore Motorola, attraverso la conoscenza della programmazione C e di un software di sviluppo chiamato Metrowerks Codewarrior. La semplice applicazione che andremo ad analizzare utilizza la scheda M68DEMO908GB60 e i suoi 5 LEDs e 4 switches. Al termine della nostra implementazione il codice dovrà: • • • • • • Inizializzare le periferiche; Fare il setup delle interruzioni; Configurare una forma d’onda attraverso il PWM; Spengere tutti i LEDs; Inviare al LED5 un impulso con il 75% duty cicle off, accendere LED3; Impostare la velocità del processore con FLL (clock); e quindi si eseguirà in modo ciclico un codice che: • • • Genera un interruzione se SW1 è premuto: si esegue un reset sul LED1 in base allo stato di SW4 (accende il led se lo switch SW4 è premuto); Esegue un set o un reset sul LED2 in base allo stato di SW2 (come sopra); Controlla lo stato di SW4 quando SW3 è premuto ed esegue un set/clear su LED3 e LED4 in “disaccordo” (se SW4 è premuto set LED4 clear LED3 ed invia un impulso di 75% duty clycle on al LED5; altrimenti set LED3, clear LED4 ed invia un impulso con 75% duty cycle off al LED5); [Si ricorda che per l’accensione e l’alimentazione della scheda l’option jump va in 1-2 (abilitazione delle batterie)]. Per il setup della scheda si abilitano tutti i LEDs attraverso gli appositi jumpers dopodiché si collega con cavo seriale la porta SC1 al PC abilitando poi la porta inserendo i jumpers 1,2 3 nel COM_EN . Dopo aver creato un nuovo progetto in CodeWarrior ed aver scelto le caratteristiche proposte dal software, si presenterà una finestra di progetto simile a quella a lato. 12 3.1 Initial Code e preparazione del progetto Dopo aver creato in modo automatico un nuovo progetto Code Warrior genera un initial code da cui partire per creare un’applicazione. Nel file main.c ad esempio vengono scritte le seguenti righe: #include <hidef.h> /* per macro di interruzioni */ #include <MC9S08GB60.h> /* include periferica */ void main(void) { EnableInterrupts; /* include your code here */ for(;;) { __RESET_WATCHDOG(); /* kicks the dog */ } /* loop forever */ } A questo punto si può procedere con la connessione via seriale della scheda col PC (si tralascia l’uso del collegamento BDM per il quale si veda il manuale). Selezionare la voce Monitor dalla finestra delle connessioni. Tener premuto SW4 sulla scheda ed accenderla (per selezionare il serial monitor). Selezionando Debug viene compilato e linkato il codice, aperto il Run-Time Simulator ed infine stabilita la connessione col dispositivo. (se la connessione è fallita riprovare a premere SW4 e poi Debug). Seguiranno delle opzioni per la configurazione del monitor sulla scheda. Questa è la finestra che si deve creare dopo la fase di inizializzazione del progetto. Tra le icone di comando si ricorda RUN per l’esecuzione da PC, RESET per resettare l’hardware, HALT per interrompere l’esecuzione. 13 3.2 Aggiungere files al progetto All’interno del nostro progetto si possono comunque aggiungere files per una più semplice e chiara programmazione. N.B.Per la nomenclatura di porte e registri si rimanda alla documentazione fornita da Motorola. Si può pensare di creare un header file che definisca i LEDs e gli switches con nominativi più significativi, magari inerenti al progetto o semplicemente più facili da ricordare. Si crea un file nuovo e ci si scrive le seguenti righe di codice C: /* File: M68DEMO908GB60.h*/ /* include definizioni */ #include <MC9S08GB60.h> /*definisce i valori per lo stato dei LEDs*/ #define ON 0 #define OFF 1 /*definisce i valori per lo stato degli switches*/ #define UP 1 #define DOWN 0 /*definisce i nomi dei LEDs*/ #define LED1 PTFD_PTFD0 #define LED2 PTFD_PTFD1 #define LED3 PTFD_PTFD2 #define LED4 PTFD_PTFD3 #define LED5 PTFD_PTFD4 /*definisce I nomi degli switches*/ #define SW1 PTAD_PTAD4 #define SW2 PTAD_PTAD5 #define SW3 PTAD_PTAD6 #define SW4 PTAD_PTAD7 Salvando il file e aggiungendolo a Sources progetto (tasto destro del mouse su Sources) si può inserire il nuovo codice nel progetto e definirne subito le modalità di implementazione. 3.3 Inserire il codice dell’applicazione Modifichiamo il file main.c per l’illuminazione del LED2 se SW2 è premuto.Il main diviene allora: #include <hidef.h> /* per le macro di interruzioni */ #include <MC9S08GB60.h> /* include le definizioni */ #include "M68DEMO908GB60.h" void main(void) { EnableInterrupts; /* abilita le interrupts */ PTADD = 0; //inizializza gli input sulla porta PTA,D (Data Direction Register) PTAPE = 0xf0; //Esegue reset di 4 bits /*inizializza bits 0-3 della porta F come uscite (connessi ai led's)*/ PTFDD = 0x0f; LED1 = OFF; LED2 = OFF; LED3 = OFF; LED4 = OFF; LED5 = OFF; for(;;) { 14 __RESET_WATCHDOG(); /* kicks the dog */ LED2 = SW2; /*lega lo stato dell’input al relativo output*/ } /* loop forever */ } A questo punto si preme il tasto di Debug così si compila e si crea l’eseguibile del file, dopodiché il debugger cancella la Flash del micro e carica su di essa il progetto. Favendo click sul tasto RUN l’applicazione si avvia e si può verificare se premendo lo SW2 il LED2 si accende. Modificando ancora il main, il progetto configura il PWM per illuminare il LED5 e imposta gli SW3 e SW4 per variare il duty cycle (vedi introduzione al Cap.3). #include <hidef.h> #include <MC9S08GB60.h> #include "M68DEMO908GB60.h" #define PRESCALAR 7 #define MODULUS 32768 #define DUTY75 (MODULUS-(MODULUS/4)) #define DUTY25 (MODULUS/4) void main(void) { EnableInterrupts; /* include your code here */ PTADD = 0; PTAPE = 0xf0; PTFDD = 0x0f; LED1 = OFF; LED2 = OFF; LED3 = OFF; LED4 = OFF; LED5 = OFF; /*Inizializza canale TP1 del timer*/ TPM1SC_CLKSA = 1; /*Sceglie il clock del bus*/ TPM1SC_CLKSB = 0; TPM1SC_PS = PRESCALAR; /*Divisione della sorgente di clock*/ TPM1MOD = MODULUS; /*Setta il modo counter*/ /*configura PWM e gli impulsi*/ TPM1C0SC_MS0B = 1; /*MS0B=1, MS0A=0, livello alto e basso*/ TPM1C0SC_ELS0A = 1; /*seleziona il livello basso come vero*/ TPM1C0V = DUTY25; /*sceglie il duty cycle*/ LED4 = ON; for(;;) { __RESET_WATCHDOG(); /* kicks the dog */ LED2 = SW2; if(SW3==DOWN){ /*Switch premuto*/ if(SW4==DOWN){ TPM1C0V = DUTY75; LED3 = ON; LED4 = OFF; }else{ TPM1C0V = DUTY25; 15 LED3 = OFF; LED4 = ON } } } /* loop forever */ } Per associare poi l’interruzione del programma al SW1 si dovrà prima definire un nome per il vettore di interruzioni (che è il numero 22) nell’ header file. #define Vkeyboard 22 Dopodiché si può dichiararlo e inizializzarlo nel main. #include <hidef.h> /* per le macro di interruzione */ #include <MC9S08GB60.h> #include "M68DEMO908GB60.h" #define PRESCALAR 7 #define MODULUS 32768 #define DUTY75 (MODULUS-(MODULUS/4)) #define DUTY25 (MODULUS/4) interrupt Vkeyboard void intSW1(){ /*dichiarazione*/ LED1 = SW4; KBISC_KBACK = 1; /*avviso interruzione*/ } void main(void) { EnableInterrupts; /* enable interrupts */ /* include your code here */ PTADD = 0; PTAPE = 0xf0; PTFDD = 0x0f; LED1 = OFF; LED2 = OFF; LED3 = OFF; LED4 = OFF; LED5 = OFF; TPM1SC_CLKSA = 1; TPM1SC_CLKSB = 0; TPM1SC_PS = PRESCALAR; TPM1MOD = MODULUS; TPM1C0SC_MS0B = 1; TPM1C0SC_ELS0A = 1; TPM1C0V = DUTY25; LED4 = ON; KBIPE_KBIPE4 = 1; KBISC_KBIE = 1; /*inizializza interruzioni*/ for(;;) { __RESET_WATCHDOG(); /* kicks the dog */ LED2 = SW2; if(SW3==DOWN){ /*Switch pressed*/ if(SW4==DOWN){ TPM1C0V = DUTY75; LED3 = ON; LED4 = OFF; }else{ TPM1C0V = DUTY25; 16 LED3 = OFF; LED4 = ON; } } } /* loop forever */ } N.B. Un’importante osservazione da fare sul clock della scheda è che utilizzando un collegamento di tipo seriale, nel caso in cui il processore vari la sua velocità di lavoro (cioè la cambi rispetto alla velocità per cui il debug è settato) si perde il controllo della porta di connessione con la scheda finchè la velocità della porta seriale non ha subito anch’essa una variazione in accordo con la precedente. La scheda è provvista di un modulo per generare una frequenza di lavoro più alta di quella di set proprio per questo tipo di situazioni (si ricorda che nella demo board è presente un cristallo che lavora a 32.768 Khz capace di far operare la scheda ad una frequenza massima di 18.87 Mhz). La formula per il calcolo della frequenza di bus è Bus _ frequency = (( f IRG / 7 ) * P * N / R ) / 2 Con P=1 o 64 (range di frequenza alto o basso) N[0:7] = 4,6,8,10,12,14,16,18 R[0:7] = 1,2,4,8,16,32,64,128 Viene inserito allora una parte di codice per configurare il clock della scheda. Il programma finale risulta il seguente: #include <hidef.h> /*macro interrupts*/ #include <MC9S08GB60.h> /*dispositivo*/ #include "M68DEMO908GB60.h" /*header file*/ #define PRESCALAR 7 /*scalare per la divisione del clock*/ #define MODULUS 32768 /*frequenza del cristallo*/ #define DUTY75 (MODULUS-(MODULUS/4)) /*duty cycle*/ #define DUTY25 (MODULUS/4) interrupt Vkeyboard void intSW1(){ LED1 = SW4; KBISC_KBACK = 1; /*acknoledge dell’interrupt*/ } void main(void) { EnableInterrupts; PTADD = 0; //inizializza gli input sulla porta PTADD (Data Direction Register) PTAPE = 0xf0; //Esegue reset dei primi 4 bits /*inizializza bits 0-3 della porta F come uscite (connessi ai led's)*/ PTFDD = 0x0f; LED1 = OFF; LED2 = OFF; LED3 = OFF; LED4 = OFF; LED5 = OFF; TPM1SC_CLKSA = 1; /*scelgo uno dei due clocks*/ TPM1SC_CLKSB = 0; TPM1SC_PS = PRESCALAR; /*divido la sorgente*/ 17 TPM1MOD = MODULUS; /*modulo del clock*/ TPM1C0SC_MS0B = 1; /*configure PWM e gli impulsi; MS0B=1, MS0A=0, livello alto e basso*/ /*seleziona il livello basso come vero*/ /*sceglie il duty cycle*/ TPM1C0SC_ELS0A = 1; TPM1C0V = DUTY25; LED4 = ON; KBIPE_KBIPE4 = 1; KBISC_KBIE = 1; /*inizializza interrupts*/ /*configura Internal Clock Generator [ICG]* (da inserire per tutti i debug di tipo seriale?)*/ /*MFD[]={4,6,8,10,12,14,16,18}*/ ICGC2_MFD = 7; /* seleziono con MFD il 32KHz crystal, demo board. */ ICGC2_RFD = 0; /* RFD[]={1,2,4,8,16,32,64,128}*/ ICGC1 = 0b00111000; /*32KHz crystal, demo board.*/ while((ICGS1_LOCK==0)||(ICGS1_ERCS==0)){ /*assicura che non si resetti il dispositivo aspettando che si blocchi il clock */ __RESET_WATCHDOG(); } ICGC2_LOCRE = 1; /*abilita il reset se il clock fallisce */ for(;;) { __RESET_WATCHDOG(); LED2 = SW2; if(SW3==DOWN){ if(SW4==DOWN){ TPM1C0V = DUTY75; LED3 = ON; LED4 = OFF; }else{ TPM1C0V = DUTY25; LED3 = OFF; LED4 = ON; } } } /* loop forever */ } se sta /* reset del watchdog */ /*configura il LED in base allo stato dello SWITCH*/ /*Switch pressed*/ Eventuali approfondimenti futuri: • Impostazione del clock e calcolo della frequenza di lavoro della scheda • Vari aspetti della comunicazione seriale della scheda • Convertitore Analogico Digitale della scheda • Trattazione di applicazioni in CodeWarrior (examples) • Si segnala che riguardo ad ogni componente del dispositivo è presente sul sito Motorola tutta la documentazione necessaria per gli approfondimenti. 18