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
Scarica

Prestazioni e potenzialità della scheda Motorola