-
1
MICROCONTROLERE Lucrarea de laborator 1
Scopul lucrarii:
- descrierea modului de lucru cu compilatorul Code Vision AVR si
cu programul de depanare Astudio, specifice microcontrolerelor
Atmel
- descrierea arhitecturii microcontrolerelor AVR Atmel -
realizarea unui program, in limbaj C, cu programarea porturilor de
intrare
iesiresi a timerului din structura microcontrolerului Atmel
AT90S8515. - prezentarea placii de evaluare cu microcontroler
AVR-Atmel, STK 500 - modul de executie cu simulare (depanare) si pe
placa reala
Desfasurarea lucrarii
1. Se va studia arhitectura microcontrolerului AVR Atmel
AT90S8515 2. Se va studia modul de operare al programului CVAVR 3.
Se va studia arhitectura placii de evaluare STK 500 4. Se va
contrui un proiect nou care sa realizeze programarea porturilor
in
conformitate cu structura STK 500 si a timerului care va genera
intreruperi periodice cu perioada de 20 ms.
5. Se vor realiza urmatoarele programe (a-d):
a) se va aprinde LED-ul corespumzator butonului SW apasat b) la
apasarea butonului SW0 se vor aprinde LED-urile pare, iar la
apasarea
butonului SW7 se vor aprinde LED-urile impare c) la apasarea
butonului SW1, LED-ul LED0 se va aprinde/stinge cu o
cadenta de 1 sec. d) se vor aprinde LED-urile LED0-7 pe rind
cite 0.5 secunde incepind cu
LED-ul 0, in mod cyclic Toate programele vor fi simulate cu
Astudio si rulate in timp real pe STK 500.
-
2
Descrierea modului de lucru cu compilatorul CVAVR si a
depanatorului ASTUDIO
Se lanseaza in executie programul CVAVR (Code Vision AVR).
Crearea unui proiect nou Se selecteaza din bara de meniu
File->New
In fereastra Create new file se selecteaza Project
-
3
Se apasa OK :
Se opteaza pentru utilizarea Code Wizard AVR care va asista
crearea proiectului. Programul Code Wizard AVR va genera un program
sursa care va contine toate programarile resurselor dorite.
Programarea acestor resurse se va realize in mod graphic. Apare o
fereastra de dialog pentru selectarea resurselor din
microcontroler: Se vor programa doua tipuri de resurse: porturile
de intrare iesire ( PORTD intrare, PORTB iesire) si timer-ul
TIMER0. Se va selecta Ports :
-
4
Se selecteaza Port B ca iesire cu totii bitii in 1 si Port D ca
intrare cu totii bitii Pull up (P): Celelalte optiuni sint : 0
pentru iesire si starea de inalta impedanta (three state T) pentru
intrari. Fiecare bit al unui port poate fi programat individual ca
intrare sau ca iesire. Un port I/O este constituit din 3 registre :
PORTx contine iesirile ( daca portul este de iesire), PINx contine
intrarile ( daca portul e de intrare) si DDRx Direction Data
Register care indica pentru fiecare bit daca acesta e intrare (0)
sau iesire (1). Sufixul x indica portul din microcontroler x = {
A,B, C, D, E }. In programele scrise in limbajul C se pot accesa
porturile de intrare iesire astfel:
- porturile de intrare : a= PINx; // se citeste in variabila a
valoarea portului de intrare x a= PINx.y; // se citeste in
variabila a valoarea bitului y al portului de intrare x - porturile
de iesire : PORTx=a; // se scrie in portul de iesire x valoarea
variabilei a PORTx.y=a; // se scrie in portul de iesire x bitul y
valoarea variabilei a
-
5
Se selecteaza Timers -> Timer0; Clock source System Clock,
Clock Value 3.906 kHz, se bifeaza Overflow Interrupt si se inscrie
in Timer Value valoarea 4e. Timerul 0 este programat sa genereze o
intrerupere la fiecare 20ms.
-
6
Dupa terminarea setarilor dorite pentru toate resursele se
selecteaza din meniu File si Generate, Save and Exit. Se salveaza
proiectul.
Programul generat automat este urmatorul: Automatic Program
Generator Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com Project : Version : Date : 8/1/2008
Author : Freeware, for evaluation and non-commercial use only
Company : Comments: Chip type : AT90S8515 Clock frequency :
4.000000 MHz Memory model : Small External RAM size : 0 Data Stack
size : 128 *****************************************************/
#include char a;
-
7
// Timer 0 overflow interrupt service routine interrupt
[TIM0_OVF] void timer0_ovf_isr(void) { // Reinitialize Timer 0
value TCNT0=0x4E; // Place your code here a=PORTD; PORTB=a; } //
Declare your global variables here void main(void) { // Declare
your local variables here // Input/Output Ports initialization //
Port A initialization // Func7=In Func6=In Func5=In Func4=In
Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T
State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00;
// Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out
Func3=Out Func2=Out Func1=Out Func0=Out // State7=1 State6=1
State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0xFF;
DDRB=0xFF; // Port C initialization // Func7=In Func6=In Func5=In
Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T
State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;
DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In
Func4=In Func3=In Func2=In Func1=In Func0=In // State7=P State6=P
State5=P State4=P State3=P State2=P State1=P State0=P PORTD=0xFF;
DDRD=0x00; // Timer/Counter 0 initialization // Clock source:
System Clock // Clock value: 3.906 kHz TCCR0=0x05; TCNT0=0x4E; //
Timer/Counter 1 initialization // Clock source: System Clock //
Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A
output: Discon. // OC1B output: Discon. // Noise Canceler: Off //
Input Capture on Falling Edge
-
8
// Timer 1 Overflow Interrupt: Off // Input Capture Interrupt:
Off // Compare A Match Interrupt: Off // Compare B Match Interrupt:
Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00;
OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External
Interrupt(s) initialization // INT0: Off // INT1: Off GIMSK=0x00;
MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02; // Analog Comparator initialization // Analog
Comparator: Off // Analog Comparator Input Capture by Timer/Counter
1: Off ACSR=0x80; // Global enable interrupts #asm("sei") while (1)
{ // Place your code here }; } Codul utilizatorului poate fi scris
in rutina de servire a intreruperilor sau in programul principal.
De asemenea pot fi declarate variabile globale sau locale. Vom
introduce urmatoarele modificari in programul generat automat:
- se va declara o variabila globala a de tip caracter - in
variabila a se va citi portul PORTD - valoarea lui a se va
transmite in portul PORTB
Modificarile sint marcate in programul anterior cu litere
ingrasate pe fond colorat. Programul va fi compilat si apoi rulat
cu ajutorul depanatorului ASTUDIO.
-
9
Daca nu au aparut erori se genereaza fisierul executabil cu
comanda Build:
-
10
Simularea si depanarea programului Se lanseaza depanatorul
ASTUDIO (butonul ):
Se deschide, cu butonul Open fisierul in format *.cof:
-
11
Se salveaza proiectul in format ASTUDIO:
Se selecteaza platforma AVR Simulator si microcontrolerul
AT90S8515
-
12
Se apasa butonul Finish si se expandeaza PORTB, PORTD si
Timer0:
Programul poate fi simulat pas cu pas (cu tasta F11) sau complet
(cu tasta F5). De asemenea se pot introduce puncte de intrerupere a
programului - breakpoints (cu tasta F9). Se pot vizualiza resursele
microcontrolerului (registre, memorie, porturi I/O) variabile ale
programului.
-
13
Valorile porturilor de intrare iesire pot fi modificate in mod
grafic:
- inainte de executia rutinei de servire a intreuperilor:
- dupa executia rutinei de servire a intreruperilor:
-
14
Executia in timp real a programului (pe placa de evaluare
STK500) Programul poate fi incarcat in placa de evaluare STK500
pentru a fi executat in timp real
cu butonul :
Se selecteaza placa de evaluare STK500 si portul Auto.
Conectarea se va face cu butonul Connect. Se va efectua programarea
memoriei flash interne a microcontrolerului:
-
15
Descrierea functionala a porturilor de intrare iesire
(microcontroler AVR)
In figura 1 este ilustrata implementarea tipica a unui port de
intrare iesire ai carui biti pot fi configurati individual. Sint
necesare 3 registre:
- 1 registru de iesire ( PORT sau PORTx, x = A,B,C,D,) - 1
registru de intrare (PIN sau PINx, x=A,B,C,D,) - 1 registru de
directie (DDR sau DDRx, x=A,B,C,D,)
-
16
Figura 1. Port de intrare iesire configurabil
Scrierea registrului DDR cu 0 sau cu 1 valideaza sau nu
bufferele ce au ca iesire pinii extern ai portului. O scriere in
port se va efectua la adresa registrului PORT, iar o citire a
portului se va realiza printr-o citire de la adresa registrului
PIN.
-
17
Descrierea functionala a Timer-ului (microcontroler AVR)
Circuitul de timp programabil (Timer) este format din doua
blocuri: un circuit de prescalare (ce va genera un tact TCKx,
utilizat in cel de al doilea bloc) si un registru- numerator ce va
fi decrementat la fiecare front activ al semnalului de ceas generat
de blocul de prescalare. In figura 2 este ilustrat blocul de
prescalare:
Figura 2 Blocul de prescalare PCKx reprezinta semnalul de tact
la intrarea in blocul de prescalare (ceasul de system). Sufixul x =
0,1 este numarul timeru-lui.
-
18
Exista un registru de comanda al timer-ului, TCCRx; in acest
registru bitii CSx2, CSx1 si CSx0 sint utilizati ca intrari de
selectie pentru multiplexorul care genereaza semnalul de ceas catre
blocul registru-numarator ce va fi decrementat. Ca semnal de ceas
pentru decrementare poate fi utilizat si un semnal extern, Tx.
Structura detaliata a timer-ului 0 este ilustrata in figura 3.
TOV0 Timer Overflow: este 1 cind registrul numarator (TCNT0)
prin valoarea 0 TOIE0 Timer Overflow Interrupt Enable: este 1 cind
intreruperile la trecerea prin 0 a registrului
numarator (TCNT0) sint validate.
Figura 3. Structura timer-ului 0
Se observa ca exista 2 registre TIFR (Timer Interrupt Flag
Register) si TIMSK (Timer Interrupt Mask Register), utilizate
pentru a genera intreruperi la fiecare trecere prin zero a
registrului numerator. Perioada intreruperilor este calculata prin
impartirea perioadei ceasului generat de blocul de prescalare la o
constanta prestabilita.
-
19
Anexa
-
20
PLACA DE EVALUARE AVR- STK 500 Placa de evaluare AVR-STK500
permite studierea modului de dezvoltare a aplicatiilor cu
microcontrolere Atmel-AVR. Structura STK500 este prezentata in
figura 5.
Figura 5. Structura STK500
Placa are in componenta urmatoarele blocuri:
- bloc de comunicare cu un calculator PC ( pe linie seriala
RS232) - microcontroler AVR - bloc de intrare iesire ( 8 butoane
SW0-SW7 si 8 LED-uri LED0-
LED7) - bloc de alimentare - bloc de programare in circuit a
memoriilor interne ale
microcontrolerului AVR - port de comunicatie seriala
suplimentar
Arhitectura microcontrolerului AVR este prezentata in figura
6:
-
21
Figura 6 Arhitectura microcontrolerului AVR (AT90S8515)
De asemenea placa permite conectarea butoanelor SW si a
LED-urilor pe diferite porturi ale microcontrolerului AVR.
Conectarea placii STK500 cu un calculator se realizeaza ca in
figura 7.
-
22
Figura 7. Conectarea STK500 cu un calculator
Comunicatia intre calculator si STK500 precum si programarea
memoriei interne se realizeaza prin intermediul programului
Astudio.
Structura butoanelor si a LED-urilor este urmatoarea: Butoanele
SW sint realizate ca in figura 8 (starea de repaus este 1 logic).
Toate
butoanele SW0-7 sint conectate cu portul PORTD care trebuie
configurat ca intrare.
Figura 8. Butoanele SW0-SW7
Apasarea unui buton SW are ca effect transmiterea, pe pinul
corespunzator al portului PORTD, a semnlului 0 logic.
-
23
LED-urile sint conectate pe portul PORTB, care trebuie
configurat ca iesire. Modul de conectare al unui LED este ilustrat
in figura 9.
Figura 9. Conectarea LED-urilor Pentru aprinderea unui LED se va
scrie, pe pinul corespunzator al portului PORTB, valoarea 0
logic.
-
1
MICROCONTROLERE Lucrarea de laborator 2
Scopul lucrarii:
- descrierea unor metode de implementare eficienta a circuitelor
logice combinationale (CLC), a circuitelor logice secventiale (CLS)
si a proceselor secventiale (PS)
- se va urmari modul de selectare a bitilor de intrare relevanti
(metoda mastilor) - se vor urmari avantajele si dejavantajele
metodelor
Desfasurarea lucrarii
1. Se va studia modul de implementare al CLC 2. Se va studia
modul de implementare al CLS 3. Se va studia modul de implementare
al PS 4. Se vor realiza urmatoarele programe (a-c) folosind
metodele indicate in lucrare:
a) Implementeaza un circuit logic combinational descris de
urmatoarea
functie logica:
unde A=SW3; B=SW1; C=SW5; Iesirea este LED5;
b) Implementeaza un circuit logic secvential cu urmatoarea
tabela de tranzitii a starii:
Intrarile sint X=SW0 si Y = SW7, iesirea este identical cu
starea Q. Q* reprezinta starea urmatoare.
-
2
c) Implementeaza un proces secvential cu urmatorul graf, in care
se noteaza:
Di SWi (i=07), flag=LED3-LED2
Toate programele vor fi simulate cu Astudio si rulate in timp
real pe STK 500.
-
3
Realizarea software a unui circuit logic combinational (CLC)
Un circuit logic combinational, cu k intrari si n iesiri, poate
fi descrise prin urmatoarele metode (se vor nota X = xk-1 xk-2 x1
x0 intrarea de k biti si Y = yn-1 yn-2 y1 y0 iesirea de n biti
):
1. functie booleana f : M k -> M n cu M ={0,1} astfel Y=f(X)
2. cu ajutorul unui tablou de adevar, TAB, asociat CLC
Se noteaza : p = 2k -1 TAB
Prelucrarile asociate metodei cu tablou de adevar sunt descries
prin urmatoarea
organigrama: While (1) { Citeste intrarea; Selecteaza bitii de
intrare (variabila X); Y=TAB(X); scrie la iesire Y; } In practica,
intrarea se citeste pe un numar de biti mai mare decat numarul de
intrari ale circuitului CLC. De exemplu, portul de intrare are 8
biti, iar circuitul CLC are 3 biti de intrare plasati pe diferite
pozitii in cuvantul de intrare.
Selectia bitilor de intrare se realizeaza prin operatii logice
de tip AND la nivel de biti si deplasari stanga / dreapta, astfel
incat variabila X astfel obtinuta sa reprezinte un index in tabloul
TAB.
Exemplu se selectie a bitilor de intrare: Circuitul CLC are 3
intrari X0,X1 si X2 in pozitiile bitilor 1, 3 si 5 din cuvantul
de intrare de 8 biti astfel:
Intrarea X (k biti) Iesirea Y (n biti) xk-1(0) xk-2(0) x1(0)
x0(0) yn-1(0) yn-2(0) y1(0) y0(0) xk-1(1) xk-2(1) x1(1) x0(1)
yn-1(1) yn-2(1) y1(1) y0(1) xk-1(p-2) xk-2(p-2) x1(p-2) x0(p-2)
yn-1(p-2) yn-2(p-2) y1(p-2) y0(p-2) xk-1(p-1) xk-2(p-1) x1(p-1)
x0(p-1) yn-1(p-1) yn-2(p-1) y1(p-1) y0(p-1)
D7 D6 D5 D4 D3 D2 D1 D0
X2 X1 X0
-
4
Cel mai semnificativ bit al intrarii circuitului CLC este X2,
iar cel mai putin semnificativ este X0.
Pentru determinarea indexului in tabelul TAB, se parcurg
urmatoarele etape: 1. Se creaza un cuvant denumit masca care are 1
pe pozitiile bitilor relevanti in
cuvantul de intrare si 0 in rest: masca_0
masca_1 masca_2 2. Se efectueaza o operatie AND logic pe biti
intre cuvantul de intrare si si fiecare
cuvant masca: Intrare AND masca_0
__________________________________________ Rezultat_0 Intrare AND
masca_1 __________________________________________ Rezultat_1
Intrare AND masca_2 __________________________________________
Rezultat_2 Bitii marcati cu in cuvantul de intrare nu sunt
relevanti (valoarea acestora
nu conteaza)
0 0 0 0 0 0 1 0
X2 X1 X0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 X0 0
0 0 0 0 1 0 0 1 0 1 0 0 0
0 0 0
0 0 1 0 0 0 0 0
X2 X1 X0
0 0 0 0 1 0 0 0
0 0 0 0 X1 0 0 0
X2 X1 X0
0 0 1 0 0 0 0 0
0 0 X2 0 0 0 0 0
-
5
3. Se vor deplasa bitii cuvantului Rezultat astfel incat bitii
X2, X1 si X0 sa fie asezati in pozitiile ponderilor binare
coerspunzatoare:
A = Rezultat_0 >> 1 B = Rezultat_1 >> 2 C =
Rezultat_2 >> 3 Index = A OR B OR C Generarea iesirii se
efectueaza in mod similar ( prin operatii de deplasare stanga /
dreapta). Exemplu de implementare Se cere implementarea unui CLC
cu urmatorul tabele de adevar ( X si Y intrari, Z
iesirea) : TAB
X Y Z 0 0 1 0 1 0 1 0 1 1 1 1
X = pinul 2 al PORTD Y = pinul 5 al PORTD Z = pinul 3 al PORTB
Programul complet este urmatorul: #define NR 4 // masca pentru X
#define MASKX 0x04 // masca pentru Y #define MASKY 0x20
0 0 0 0 0 0 0 X0
0 0 0 0 0 0 X1 0
0 0 0 0 0 X2 0 0
0 0 0 0 0 X2 X1 X0
-
6
int X,Y,Z; // intrarile si iesirea int index; // index in tabela
TAB int TAB[NR]= {1,0,1,1} ; // tabela de adevar void main(void) {
// portul PORTB configurat ca iesire PORTB=0xFF; DDRB=0xFF; //
portul PORTD configurat ca intrare PORTD=0xFF; DDRD=0x00; //
configurarea timer-ului TCCR0=0x05; TCNT0=0x4E; // validarea
intreruperilor #asm("sei") // bucla de asteptare a intreruperilor
while (1) { }; } // Rutina de servire a intreruperilor Timer 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void) { int
tmp,tmpx,tmpy,tmpz; // Reinitializare Timer 0 TCNT0=0x4E; tmp=PIND;
// citeste intrarea // selecteaza X; tmpx=tmp&MASKX;
X=tmpx>>2; // selecteaza Y; tmpy=tmp&MASKY;
Y=tmpy>>4; // calculeaza indexul in tabela de adevar TAB
index = X | Y;
-
7
// calculeaza iesirea Z Z=TAB[index]; // plaseaza bitul de
iesire in pozitia 3 tmpz=Z
-
8
/********************************************* This program was
produced by the CodeWizardAVR V1.23.7a Standard Automatic Program
Generator Copyright 1998-2002 HP InfoTech s.r.l.
http://www.hpinfotech.ro e-mail:[email protected] Project :
Version : Date : 26/09/2005 Author : Sorin Company : Comments: Chip
type : AT90S8515 Clock frequency : 4.000000 MHz Memory model :
Small Internal SRAM size : 512 External SRAM size : 0 Data Stack
size : 128 *********************************************/ #include
#define NR 2 #define MASKX 0x04 #define MASKY 0x20 // Declare your
global variables here int X,Y,Z; // intrarile si iesirea int
TAB[NR][NR]= {1,0,1,1} ; // tabela de adevar void main(void) { //
Declare your local variables here // Input/Output Ports
initialization // Port A initialization // Func0=In Func1=In
Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T
State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTA=0x00; DDRA=0x00;
-
9
// Port B initialization // Func0=Out Func1=Out Func2=Out
Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out // State0=1
State1=1 State2=1 State3=1 State4=1 State5=1 State6=1 State7=1
PORTB=0xFF; DDRB=0xFF; // Port C initialization // Func0=In
Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In //
State0=T State1=T State2=T State3=T State4=T State5=T State6=T
State7=T PORTC=0x00; DDRC=0x00; // Port D initialization //
Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In // State0=P State1=P State2=P State3=P State4=P State5=P
State6=P State7=P PORTD=0xFF; DDRD=0x00; // Timer/Counter 0
initialization // Clock source: System Clock // Clock value: 3.906
kHz TCCR0=0x05; TCNT0=0x4E; // Timer/Counter 1 initialization //
Clock source: System Clock // Clock value: Timer 1 Stopped // Mode:
Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. //
Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00;
TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00;
OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s)
initialization
-
10
// INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00; //
Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; //
Analog Comparator initialization // Analog Comparator: Off //
Analog Comparator Input Capture by Timer/Counter 1: Off // Analog
Comparator Output: Off ACSR=0x80; // Global enable interrupts
#asm("sei") // initializare tabela de adevar while (1) { // Place
your code here }; } // Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) { int
tmp,tmpx,tmpy,tmpz; // Reinitialize Timer 0 value TCNT0=0x4E; //
Place your code here tmp=PIND; // citeste intrarea // selecteaza X;
tmpx=tmp&MASKX; X=tmpx>>2; // selecteaza Y;
tmpy=tmp&MASKY; Y=tmpy>>5; // calculeaza iesirea Z
Z=TAB[X][Y]; // scrie iesirea tmpz=Z
-
11
Realizarea software a unui circuit logic secvential (CLS)
Un circuit logic secvential este reprezentat prin urmatoarii
parametrii (X,Q,Q,f,g) astfel: X intrarea, Q starea , Q iesirea; f
functia de tranzitie a starii Q=f(X,Q), g functia de iesire Q=g(Q)
Functionarea circuitului secvential poate fi descrisa prin doua
tabele:
- o tabela de tranzitie a starilor, TABQ - o tabela de decriere
a iesirilor, OUT
TABQ
Se noteaza : p = 2k -1si r = 2n -1. Cu Q(i),(j) s-a notat starea
CLS daca starea anterioara este Q(i) si intrarea este X(j).
OUT
Metoda este asemnatoare metodei de implementare cu tabela de
adevar a
circuitelor combinationale. Vom avea aceleasi avantaje. Totusi,
daca numarul de intrsri si de stari este mare atunci dimensiunea
tabelelor TABQ si TAB este foarte mare si metoda devine ineficienta
din punctual de vedere al consumului de memorie.
Q0(0) Q0(1) Q0(r-2) Q0(r-1) Q1(0) Q1(1) Q1(r-2) Q1(r-1) Qn-2(0)
Qn-2(1) Qn-2(r-2) Qn-2(r-1)
Intrarea X (k biti)
Starea Q (n biti)
Qn-1(0) Qn-1(1) Qn-1(r-2) Qn-1(r-1) xk-1(0) xk-2(0) x1(0) x0(0)
xk-1(1) xk-2(1) x1(1) x0(1) Q(r-2),(1) xk-1(p-2) xk-2(p-2) x1(p-2)
x0(p-2) Q(r-2),(p-2) xk-1(p-1) xk-2(p-1) x1(p-1) x0(p-1)
Starea Q (n biti) Iesirea Y (m biti) xk-1(0) xk-2(0) x1(0) x0(0)
ym-1(0) ym-2(0) y1(0) y0(0) xk-1(1) xk-2(1) x1(1) x0(1) ym-1(1)
ym-2(1) y1(1) y0(1) xk-1(p-2) xk-2(p-2) x1(p-2) x0(p-2) ym-1(p-2)
ym-2(p-2) y1(p-2) y0(p-2) xk-1(p-1) xk-2(p-1) x1(p-1) x0(p-1)
ym-1(p-1) ym-2(p-1) y1(p-1) y0(p-1)
-
12
In continuare se va prezenta o metoda mai eficienta din acest
punct de vedere, numita metoda tabelelor de semnale relevante.
Implementarea unui circuit logic secvential cu metoda tabelelor
de semnale
relevante Se va inlocui tabela de tranzitie a starilor TABQ cu
mai multe tabele, dupa cum
urmeaza: - TAB tabela de adrese a tabelelor de semnale relevante
asociate fiecarei stari - Ai tabela asociata starii i
Se noteaza: T terminator de tablou (semnal de intrare care nu
apare niciodata) TAB Ai
Stare Adresa tabelei de semnale relevante
Q(0) A0 Q(1) A1
Q(r-2) Ar-2 Q(r-1) Ar-1
In tabela de semnale relevante asociata starii i, se trec
perechi (Xiq, Qiq)= (semnalul relevant q in starea i, starea
urmatoare starii i daca la intarea a aparut semnalul relevant q).
Atunci cind nu mai exista semnale relevante pentru o stare se va
trece in tabela de semnale relevante perechea (T, i) = (terminator
de tablou, starea asociata tabelei de semnale relevante) Metoda
tabelelor de semnale relevante are avantajul ca reduce consumul de
memorie datorita faptului ca se vor memora doar semnalele de
intrare care produc tranzitii ( sint relevante pentru o stare
data). Tabela iesirilor, OUT, ramaine nemodificata. Metoda implica
prelucrari mai complexe care presupun o cautare a semnalului
relevant in tabele. Organigrama prelucrarilor este prezentata in
continuare. Variabila Q semnifica starea CLS, variabila Adr indica
adresa de inceput a tabelei de semnale relevante associate starii
Q, i reprezinta indexul current in tabela de semnale relevante,
ready indica terminarea procesului de cautare la gasirea unui
semnal relevant.
Xi0 Qi0 Xi0 Qi0 T i
-
13
Q = 0; While (1) { Citeste intrarea; Selecteaza bitii de intrare
(variabila X); Adr=TAB(Q); i=0 ready=0 while (!ready) { if
(X==Adr(i)) {Q=Adr(i+1); ready=1;} else if (X==T) ready=1; else
i=i+2; } scrie la iesire OUT(Q); }
Avantajele metodei de implemetare cu tabele de semnale relevante
1. Se reduce consumul de memorie. 2. Codul este universal; pentru
implementarea unui CLS se modifica doar
tabelele de semnale relevante Dezvantaje ale metodei de
implemetare cu tabela de adevar 4. timpul de executie este mai mare
in raport cu metoda tabelei de tranzitii a
starilor 5. timpul de executie nu este constant depinde de
pozitia semnalului relevant
in tabela de semnale relevante
-
14
Exemplu de proiect CAVR Se implemneteaza un CLS cu urmatoarele
tabele de semnale relevante: TAB A0 A1
Stare Adresa tabelei de
semnale relevante 0 A0 1 A1
Intrarea X este pe bitul 0 al PORTD, iar iesirea YQ pe bitul 0
al PORTB. Codul este prezentat in continuare:
/********************************************* This program was
produced by the CodeWizardAVR V1.23.7a Standard Automatic Program
Generator Copyright 1998-2002 HP InfoTech s.r.l.
http://www.hpinfotech.ro e-mail:[email protected] Project :
Version : Date : 26/09/2005 Author : Sorin Company : Comments: Chip
type : AT90S8515 Clock frequency : 4.000000 MHz Memory model :
Small Internal SRAM size : 512 External SRAM size : 0 Data Stack
size : 128 *********************************************/ #include
#define NR 2
0 1 1 0 2 0
0 1 1 0 2 1
-
15
#define MASK 0x01 // Declare your global variables here int S;
// starea CLS int X; //intrarea CLS int Y; //iesirea CLS int
*TAB[NR]; //tabela de adrese , NR - numar de stari int
A0[]={0,1,1,0,2,0}; int A1[]={0,1,1,0,2,1}; // tabelele pentru
starile 0 si 1 int out[NR]={0,1};// tabela de iesire void
main(void) { // Declare your local variables here // Input/Output
Ports initialization // Port A initialization // Func0=In Func1=In
Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T
State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTA=0x00; DDRA=0x00; // Port B initialization // Func0=Out
Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out
Func7=Out // State0=1 State1=1 State2=1 State3=1 State4=1 State5=1
State6=1 State7=1 PORTB=0xFF; DDRB=0xFF; // Port C initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T
State6=T State7=T PORTC=0x00; DDRC=0x00; // Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In // State0=P State1=P State2=P State3=P State4=P State5=P
State6=P State7=P
-
16
PORTD=0xFF; DDRD=0x00; // Timer/Counter 0 initialization //
Clock source: System Clock // Clock value: 3.906 kHz TCCR0=0x05;
TCNT0=0x4E; // Timer/Counter 1 initialization // Clock source:
System Clock // Clock value: Timer 1 Stopped // Mode: Normal
top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise
Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00;
TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00;
OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization
// INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00; //
Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; //
Analog Comparator initialization // Analog Comparator: Off //
Analog Comparator Input Capture by Timer/Counter 1: Off // Analog
Comparator Output: Off ACSR=0x80; // Global enable interrupts
TAB[0]=A0; TAB[1]=A1; S=0; #asm("sei")
-
17
while (1) { // Place your code here }; } // Timer 0 overflow
interrupt service routine interrupt [TIM0_OVF] void
timer0_ovf_isr(void) { int tmp,i; int *adr; int ready; //
Reinitialize Timer 0 value TCNT0=0x4E; // Place your code here
tmp=PIND; // citeste intrarea X=tmp&MASK; adr=TAB[S]; i=0;
ready=0; while (!ready) { if (X==*(adr+i)) {S=*(adr+i+1); ready=1;}
else if (*(adr+i)==2) ready=1; else i=i+2; } // scrie iesirea
Y=out[S]; PORTB=~Y; }
-
18
Implementarea unui proces secvential descris prin grafuri
hibride de tranzitii
Un proces reprezinta o secventa de instructiuni (program) ce
opereaza pe un set
de date. Procesul are mai multe etape care sint parcurse in mod
secvential, motiv pentru care acesta se mai numeste proces
secvential. Etapele in functionarea procesului sint reprezentate ca
stari ale procesului. Procesul secvential va fi reprezentat
printr-un graf de tranzitii.
Tranzitia intre stari se efectuaza la aparitia unor evenimente
(conditii logice, semnale de intrare) sau spoantan.
O data cu efectuarea tranzitiei se pot efectua anumite
prelucrari associate cu evenimenrul care determina tranzitia. In
aceasta situatie procesul secvential este descris printr-un graf
hibrid de tranzitii (GHT).
Structura generala a unui graf hibrid de tranzitii este
urmatoarea: Starile au fost notate cu S0, S1 si S2, iar
evenimentele cu E00, E01, E11, E12,
E20. Implementarea procesului secvential se realizeaza astfel:
1. Se genereaza intreruperi periodice cu perioada T 2. Testarea
evenimentelor care pot produce tranzitii in GHT si executia
prelucrarilor din fiecare stare se vor efectua in rutina de
servire a intreruperii periodice.
Organigrama generala a prelucrarilor este prezentata in
continuare. S-a notat cu Q variabila de stare asociata procesului
secvential.
S0
S1S2
Prelucrari asociate starii S1
E01
E12 E11
Prelucari asociate starii S2
E00 E20
-
19
Q = S0; // S0 starea initiala Initializari alte variabile
utilizate in prelucrarile associate fiecarei stari Valideaza
intreruperi periodice cu perioada T Asteapta intreuperi Rutina de
servire a intreruperilor periodice Selecteaza dupa valoarea
variabilei de stare, Q : S0: citeste intrarea X daca X=E00 atunci
Q=S0 daca X=E01 atunci Q=S1 S1: citeste intrarea X Prelucrari
asociate starii S1 daca X=E11 atunci Q=S1
daca X=E12 atunci Q=S2 S2: citeste intrarea X Prelucrari
asociate starii S2 daca X=E20 atunci Q=S0
Avantajele descrierii si implementarii prin GHT sint: -
procesele sint implementate printr-o structura de prelucrare unica
(pentru
diferite procese se vor modifica numai numarul de stari asociate
si prelucrarile aferente lor)
- modificarile se realizeaza simplu, doar pentru starea dorita -
se pot introduce stari suplimentare sau elimina stari existente
foarte usor Dezavantajele implementarii prin GHT: - nu toate
procesele secventiale pot fi descrise prin GHT - implica existenta
unui mecanism de intreruperi
-
20
Exemplu: Masurarea latimii unui puls negativ
Se considera un process secvential care primeste la intrare
(bitul 0) un semnal binar. Procesul asteapta aparitia frontului
negativ (1->0) al semnalului de intrare; dupa aparitia acestui
front se asteapta frontul pozitiv (0->1) si se numara perioadele
intreruperilor periodice pina la aparitia acestuia. Dupa detectarea
frontului pozitiv se afiseaza numarul de perioade de intrerupere
determinat anterior ( acest numar reprezinta o masura a duratei
pulsului negative ce apare pe intrare). Procesul secvential poate
fi reprezentat prin urmatorul graf hibrid de tranzitii (GHT):
Organigrama prelucrarilor Q = 0; // starea procesului secvential
Cnt = 0; // contor de intreruperi Valideaza intreruperi periodice
cu perioada T Asteapta intreuperi Rutina de servire a
intreruperilor periodice Selecteaza dupa valoarea variabile de
stare, Q: 0: citeste intrarea X daca X=0 atunci Q=1 1: cnt ++
citeste intrarea X
0
12
cnt ++
0
1 0
afiseaza cnt
1 1 0 0 0 1 1
intreruperi
T
Latimea = cnt*T 1
-
21
daca X=1 atunci Q=2 2: afiseaza cnt Q=0 cnt=0 Codul programului
este urmatorul: /********************************************* This
program was produced by the CodeWizardAVR V1.23.7a Standard
Automatic Program Generator Copyright 1998-2002 HP InfoTech s.r.l.
http://www.hpinfotech.ro e-mail:[email protected] Project :
Version : Date : 26/09/2005 Author : Sorin Company : Comments: Chip
type : AT90S8515 Clock frequency : 4.000000 MHz Memory model :
Small Internal SRAM size : 512 External SRAM size : 0 Data Stack
size : 128 *********************************************/ #include
// Declare your global variables here #define T 50 int Q; // starea
procesului int X; //intrarea procesului - bitul 0 int Y; //iesirea
procesului = 1 daca latimea pulsului este > 1 sec int cnt; int
cnt1; int cnt2;
-
22
void main(void) { // Declare your local variables here //
Input/Output Ports initialization // Port A initialization //
Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T
State6=T State7=T PORTA=0x00; DDRA=0x00; // Port B initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out
Func6=Out Func7=Out // State0=1 State1=1 State2=1 State3=1 State4=1
State5=1 State6=1 State7=1 PORTB=0xFF; DDRB=0xFF; // Port C
initialization // Func0=In Func1=In Func2=In Func3=In Func4=In
Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T
State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0x00; // Port
D initialization // Func0=In Func1=In Func2=In Func3=In Func4=In
Func5=In Func6=In Func7=In // State0=P State1=P State2=P State3=P
State4=P State5=P State6=P State7=P PORTD=0xFF; DDRD=0x00; //
Timer/Counter 0 initialization // Clock source: System Clock //
Clock value: 3.906 kHz TCCR0=0x05; TCNT0=0x4E; // Timer/Counter 1
initialization // Clock source: System Clock // Clock value: Timer
1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B
output: Discon.
-
23
// Noise Canceler: Off // Input Capture on Falling Edge
TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00;
OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s)
initialization // INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00; //
Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; //
Analog Comparator initialization // Analog Comparator: Off //
Analog Comparator Input Capture by Timer/Counter 1: Off // Analog
Comparator Output: Off ACSR=0x80; Q=0; cnt=0; cnt1=0; cnt2=0; //
Global enable interrupts #asm("sei") while (1) { // Place your code
here }; } // Timer 0 overflow interrupt service routine interrupt
[TIM0_OVF] void timer0_ovf_isr(void) {
-
24
int tmp,tmp1,tmp2; // Reinitialize Timer 0 value TCNT0=0x4E;
cnt1=(cnt1+1)%T; if (cnt1
-
1DEZVOLTAREA APLICATIILOR CUMICROCONTROLERUL XMC 4500DESCRIEREA
ARHITECTURII SI A MEDIULUI INTEGRAT DEDEZVOLTARE DAVE
Desfasurarea lucrarii1. Studiul arhitecturii familiei de
microcontrolere XMC 4500 si arhitecturii placii de
dezvoltare RELAX 45002. Modul de creare a unui proiect nou in
DAVE. Exemplu de proiect simplu pentru
porturile de intrare-iesire3. Studiul programului exemplificat
(organigrama generala, utilizarea intreruperilor,
modul de programare a porturilor IO, analiza programului)4.
Executia pas cu pas si depanarea programului (stabilirea
configuratiei pentru
depanator, lansarea depanatorului si vizualizarea resurselor
programului)5. Modificarea programului (alte functionalitati)
Teme1. Prin studierea schemelor electrice, sa se verifice
corespondenta dintre butoane si
LED-uri si porturile IO asociate.2. Pentru toate porturile IO,
sa se verifice modul de configurare.3. Sa se realizeze un program
care implementeaza o telecomanda cu urmatoarele
specificatii:- apasarea butonului Button 2 comuta intre modul de
lucru: TV sau DVD- LED-ul LED 2 stins semnifica mod de lucru TV si
aprins semnifica mod de
lucru DVD- pe LED-ul LED 1 se transmite comanda 3 pulsuri daca
se comanda TV si 5
pulsuri daca se comanda DVD. Durata pulsurilor este de 0.5 sec
cu pauza intrepulsuri de 1 sec.
-
2Arhitectura microcontrolelor XMC4500Familia de microcontrolere
XMC 4500 combina functionalitatea procesorului ARMCortex-M4 cu
periferice si memorie in acelasi chip si are urmatoarele
facilitati:Subsistemul CPU1. Nucleul procesorului
- processor ARM Cortex-M4 pe 32 de biti- set de instructiuni pe
16 sau 32 de biti- instructiuni DSP/MAC- timer de sistem pentru
suport de sistem de operare
2. Unitate de virgula mobila3. Unitate de protectie a memoriei4.
Controler de intreruperi inlantuite5. Doua blocuri de transfer
DMA6. Unitate de cerere a evenimentelor (pentru servicii interne
sau externe)7. Bloc de detectie a erorilor multiple (CRC)Memorii on
chip
- 16 ko ROM (boot)- 64 ko memorie de program de mare viteza- 64
ko memorie de date de mare viteza- 32 ko memorie de mare viteza
pentru comunicatie- 1024 ko memorie flash cu 4 ko memorie cache
Dispozitive periferice pentru comunicatie- modul Ethernet 10/100
Mbit- modul USB- interfata CAN (Controller Area Network)- 6
interfete seriale (configurabile in diferite standarde seriale)-
interfata pentru comunicarea om-masina (LED si touch)- interfata
pentru carduri de memorie externa (SD si SDMMC)- bus extern pentru
conectarea unor memorii externe
Periferice pentru semnale analogice- 4 convertoare ADC pe 12
biti cu cite 8 canale fiecare- Demodulator Sigma Delta cu 4 canale-
1 convertor DAC pe 12 biti cu 2 canale
Periferice pentru control industrial- 2 unitati de captura si
comparare pentru controlul motoarelor
-
3- 4 unitati de captura si comparare folosite ca timere de uz
general- 2 interfete de determinare a pozitiei- timer de tip
watchdog- senzori de temperature- ceas de timp real- unitate de
control a sistemului
Linii de intrare iesire- modul pentru porturi programabile-
adresabilitate pe bit- intrari tri-state- interfata de test JTAG
(Joint Test Action Group)- suport pentru depanare
Figura 1 ilustreaza blocurile functionale si modul lor de
conectare pentru un sistem cuXMC 4500.
Figura 1.
-
4SCU System Control UnitRTC Real Time ClockWDT WatchdogFCE
Flexible CRC EngineGPDMA General Purpose DMAUSB OTG Universal
Serial Bus On The GoPMU Protected Memory UnitPSRAM Program
SRAMDSRAM Data SRAMEBU External Bus UnitDSD Delta Sigma
DemodulatorPOSIF Position InterfaceCCU Capture Compare UnitLEDTS
LED and Touch Sense (Control Unit)PORTS porturi IODAC convertor
digital analogicPBA Peripheral Bridge AHB to AHB (Advanced
High-performance Bus)ERU Event Request UnitVADC Versatile ADC
(convertor analog digital)USIC Universal Serial Interface
ChannelCAN Controller Area Network
Arhitectura procesorului ARM Cortex-M4Caracteristici
principale:
- arhitectura Harvard- pipe-line cu 3 stagii- set de
instructiuni eficient - prelucrari in virgula fixa intr-un singur
ciclu, operatii
SIMD (Single Instruction Multiply Data) de inmultire si
inmultire cu acumulare,logica de saturare si operatii de impartire
hardware
- set de instructioni simplificat si comprimat (Thumb) pentru
cresterea densitatiicodului si a vitezei
- densitate mare a codului- controler de intreruperi
configurabil (64 de intreruperi)- mod sleepBlocurile functionale
ale procesorului ARM Cortex-M4 sint prezentate in figura 2:-
Nucleul procesorului (Processor Core)- Unitatea de virgula mobila
(Floating Point Unit)- Controlerul de intreruperi (Nested Vectored
Interrupt Controler)- Unitatea de protectie a memoriei (Memory
Protection Unit)
-
5Figura 2
Modelul de programareExista urmatoarele moduri de lucru ale
procesorului ARM Cortex M4:
- modul thread in care se executa un program de aplicatie. In
acest mod se intraimediat dupa reset
- modul handler se trateaza exceptii. Dupa tratarea unei
exceptii se revine inmodul thread.
Programele se executa pe doua niveluri de privilegiere astfel:-
modul neprivilegiat (programele nu pot executa anumite instructiuni
de acces la
registre speciale, nu se poate folosi timer-ul de sistem si
blocul de control alsistemului, pot avea acces restrictionat la
memorie)
- modul privilegiat (se intra pe acest nivel din modul thread
daca actualizeazaadecvat un registru de control; modul hanller este
intotdeauna pe nivelulprivilegiat)
-
6Registrele procesoruluiToate registrele sint prezentate in
figura 3.
Figura 3.Se impart in registre de date (generale) pe 32 de biti
, pentru controlul programului si alstivei si registre
speciale.Registrele speciale indica starea procesorului dupa cum
urmeaza:PSR - Program Status RegisterASPR - Application Program
StatusIPSR - Interrupt Program StatusEPSR - Execution Program
StatusPRIMASK - Priority Mask Register onFAULTMASK - Fault Mask
RegisterBASEPRI - Base Priority Mask RegisterCONTROL - CONTROL
register
-
7Modelul de memorieHarta memoriei este ilustrata in figura
4.
Exista zone de memorie rezervate pentru cod, datesi dispozitive
de intrare iesire. Prin modul deprogramare al blocului MPU fiecare
zona dememorie poate avea attribute specifice:
- Normal se pot re-ordona accesele lamemorie pentru cresterea
eficientei sauexecuta citiri speculative din memorie
- Device se conserva ordinea acceselor lamemorie, relativ la
alte accese de tipDevice sau Strongly-ordered
- Strongly-ordered se conserva ordineaacceselor la memorie,
relativ la toatetipurile de acces
- Execute Never nu se pot accesainstructiuni
.
Figura 4.
Porturile de intrare iesireExista 16 porturi de intrare iesire,
PCn (n=0-15) cu structura prezentata in figura 5 . Instructura unui
port IO se observa driverele de intrare si iesire (sectiunea pad)
si sectiuneade configurare pe biti (slice). In modul normal, o
intrare este citita pe pinul Pn_IN iar oiesire este generata pe
pinul Pn_OUT. In modul alternativ, se pot conecta direct semnalede
la dispositive periferice cu portul PCn.
-
8Figura 5.Atunci cind un port este configurat ca intrare/iesire
trebuie scrise urmatoarele registre:Registrele Pn_IOCR0, Pn_IOCR4,
Pn_IOCR8 si Pn_IOCR12 configureaza bitii 0-3,4-7, 8-11 si respectiv
12-15 ai portului Pn astfel (reprezentare pentru Pn_IOCR0,celelelte
registre sint similare, astfel PCx cu x = 0-3 pentru Pn_IOCR0, x =
4-7 pentruPn_IOCR4, x = 8-11 pentru Pn_IOCR8 si x = 12-15 pentru
Pn_IOCR12) ca in figura6.
-
9Figura 6 .Registrele Pn_PDR0/1 ofera posibilitatea de a selecta
viteza de variatie a iesirii (slewrate) si curentul de iesire
(driver strength) pentru pinii configurati ca iesire.Registrul
Pn_PDR0 are urmatoarea configuratie (figura 7):
-
10
Figura 7Registrul Pn_PDR1 are urmatoarea configuratie (figura
8):
Figura 8In descrierile de mai sus PDi (i = 0-15) reprezinta
bitii de configurare pentru pinul i alportului Pn.Selectia modului
de lucru pentru sectiunea pad este data de figura 9:
Figura 9
-
11
Registrul Pn_OMR modifica iesirea si are urmatoarea configuratie
(figura 10):
Figura 10Registrul Pn_PPS valideaza starea pinilor portului Pn
in modul power save astfel (figura11):
Figura 11Starea pinilor in modul power save este data in
conformitate cu configurarea stabilita deregistrul Pn_IOCR astfel
(figura 12)
-
12
Figura 12Intrarea este citita in registrul Pn_IN si iesirea este
scrisa in registrul Pn_OUT.Registrul Pn_HWSEL asociaza pinii
porturilor Pn cu semnale externe (pe modulalternativ) ca in figura
13:
Figura 13
-
13
Placa de evaluare RELAX 4500Schema bloc a placii de dezvoltare
Relax 4500 este prezentata in figura 14.Este constituita din
urmatoarele blocuri functionale:
- Microcontrolerul XMC 4500- Blocul de depanare (construit cu un
al doile microcontroller XMC 4500 si cu
interfata USB)- Interfata Ethernet- Doua conectoare de 40 de
pini (pentru conectare cu alte echipamente)- Sursa de alimentare-
Doua butoane (conectate pe portul P1 bitii 14 si 15) si doua
LED-uri (conectate pe
portul P1 bitii 1 si 0) pentru utilizator- Interfata USB-
Figura 14.Schemele electrice ale placii Relax 4500 sint
ilustrate in anexa.
-
14
Crearea unui program cu ajutorul mediului de dezvoltareDAVE1. Se
selecteaza File->New->Project
2. Se alege Infineon->DAVE Project
-
15
3. Se scrie numele proiectului si se alege Easy Start
Project
4. Se alege tipul de microcontroler (XMC 4500 series -
F100x1024) si se incheieprocedura de creare a unui proiect cu
butonul Finish.
-
16
Trecerea de la o etapa la alta se realizeaza cu butonul Next. Se
poat ereveni la o etapaanterioara cu butonul Back.Se deschide
fereasta cu codul programului, EasyMain.c.
Se genereaza codul executabil cu comanda Build.Programul
EasyStart citeste butoanele BUTTONi si aprinde LED-urile LEDi (i =
1,2),de pe placa Relax 4500, conform grafului din figura 15.
Figura 15.Expirarea de timp de T = 1 secunda este realizata cu
ajutorul unui contor care seincrementeaza la fiecare intrerupere
generata de ceasul de sistem la fiecare 10 ms.
-
17
Codul programului este :/* SFR declarations of the selected
device */#include #include "GPIO.h"void
SysTick_Handler(void);typedef enum { OFF = 0, ON = 1} state_t
;state_t led1_state = ON;state_t led2_state = ON;
int main(void) {/* Initialize LED1
*/P1_1_set_mode(OUTPUT_PP_GP);P1_1_set_driver_strength(STRONG);/*
Initialize LED2
*/P1_0_set_mode(OUTPUT_PP_GP);P1_0_set_driver_strength(STRONG);/*
Initialize BUTTON1 */P1_14_set_mode(INPUT);/* Initialize BUTTON2
*/P1_15_set_mode(INPUT);/* fSYS=fCPU at 120MHz *//* Systick every
120000 cycles = 10ms */1if(SysTick_Config(SystemCoreClock2 / 100UL)
== 0){
/* Loop forever */for(;;) {}
}else{
asm("BKPT 255");}
}
1 Oscilatorul este pe 12 MHz (vezi schemele electrice).
Frecventa CPU este obtinuta prin multiplicareafrecventei
oscilatorului cu 10, iar intreruperile de system (SysTick) sint
generate la frecventa oscilatorului.Perioada intreruperilor de
sistem este 610.12
1T .
Rezulta ca 12000 de ciclii au o durata de msTT
10sec1010.1210.12.120000 26
41
2 SystemCoreClock este initializata cu 12000000
-
18
void SysTick_Handler(void) {static uint32_t ticks = 0UL;static
state_t button1_state = OFF;static state_t button2_state =
OFF;ticks++;/* Read BUTTON1, update state if pressed
*/if(P1_14_read() == 0UL){
button1_state = ON;}else{
if(button1_state == ON){if(led1_state == ON){
led1_state = OFF;}else{
led1_state = ON;}
}button1_state = OFF;
}/* Read BUTTON2, update state if pressed */if(P1_15_read() ==
0UL){
button2_state = ON;}else{
if(button2_state == ON){if(led2_state == ON){
led2_state = OFF;}else{
led2_state = ON;}
}button2_state = OFF;
}/* Toggle every 1s */if(ticks == 100UL){
if(led1_state == ON){/* Toggle LED1 */P1_1_toggle();
}if(led2_state == ON){
/* Toggle LED2 */P1_0_toggle();
}ticks = 0UL;
}}
-
19
Exemplu de programare a unui port de intrare (P1 bitul 14,
intrare)__STATIC_INLINE void P1_14_set_mode(uint8_t mode){
PORT1->IOCR12 &= ~0x00f80000UL; PORT1->IOCR12 |= mode
PDR1 &= ~0x07000000UL; PORT1->PDR1 |= strength HWSEL &=
~0x30000000UL; PORT1->HWSEL |= config OMR =
0x00004000UL;}__STATIC_INLINE void P1_14_reset(void){ PORT1->OMR
= 0x40000000UL;}__STATIC_INLINE void P1_14_toggle(void){
PORT1->OMR = 0x40004000UL;}__STATIC_INLINE uint32_t
P1_14_read(void){ return(PORT1->IN &
0x00004000UL);}__STATIC_INLINE void P1_15_set_mode(uint8_t mode){
PORT1->IOCR12 &= ~0xf8000000UL; PORT1->IOCR12 |= mode
PDR1 &= ~0x70000000UL; PORT1->PDR1 |= strength HWSEL &=
~0xc0000000UL; PORT1->HWSEL |= config OMR = 0x00008000UL;}
-
20
__STATIC_INLINE void P1_15_reset(void){PORT1->OMR =
0x80000000UL;
}__STATIC_INLINE void P1_15_toggle(void){ PORT1->OMR =
0x80008000UL;}__STATIC_INLINE uint32_t P1_15_read(void){
return(PORT1->IN & 0x00008000UL);}Exemplu de programare a
unui port de iesire (P1 bitul 0, iesire)__STATIC_INLINE void
P1_0_set_mode(uint8_t mode){ PORT1->IOCR0 &= ~0x000000f8UL;
PORT1->IOCR0 |= mode PDR0 &= ~0x00000007UL; PORT1->PDR0
|= strength HWSEL &= ~0x00000003UL; PORT1->HWSEL |= config
OMR = 0x00000001UL;}__STATIC_INLINE void P1_0_reset(void){
PORT1->OMR = 0x00010000UL;}__STATIC_INLINE void
P1_0_toggle(void){ PORT1->OMR = 0x00010001UL;}__STATIC_INLINE
uint32_t P1_0_read(void){ return(PORT1->IN &
0x00000001UL);}
-
21
Depanarea programluiSe alege o configuratie pentru depanator. Se
apasa butoanele Apply si Close, pentru afinaliza alegerea.
Se lanseaza sesiunea de depanare.
-
22
Se ruleaza programul pas cu pas si se vizualizeaza
resursele.
-
XMC4500 Relax Kit-V1 XMC4500 Relax Lite Kit-V1
AGND
AGND
10uF/10V
10uF/10V
100nF
100nF
100nF
100nF
100nF
100nF
100nF
100nF
10uF/10V
15pF
15pF
10
0n
F
10
0n
F
10
nF
10
0n
F
10
0n
F
ES
D8
V0
L2
B-0
3L
BA
T6
0A
BA
T5
4-0
2V
GN
D
GN
D
GN
DG
ND
GN
DG
ND
GN
DG
ND
GN
D
GN
DG
ND
GN
DG
ND
GN
D
GN
DG
ND
GN
D
GN
D
GN
D
GN
D
GN
D
GN
D
XM
C4
50
0_
LQ
FP
10
0
BL
M1
8P
G6
00
BLM18PG600
BLM18PG600
LED-RT/D/0603LED-RT/D/0603
12
MH
Z/S
/3.2
X2
.5
10k/0402680R680R
10k10k
33
R3
3R
51
0R
TM
PS
2-S
MD
TM
PS
2-S
MD
TM
PS
2-S
MD
VDD5
VDD5
VDD3.3
VDD3.3
VDD5
VDD5
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD5
VDD3.3VDD3.3
VDD3.3
VDD3.3
VDD3.3
2x2
02
*20
ZX62-AB-5PA
FT
SH
-10
5-0
1-F
-D-K
XM
C4
50
0-F
10
0x1
02
4
P0.[0..15],P
1.[0..15],P
2.[0..15],P
3.[0..15],P
4.[0..7],P
5.[0..11],P
6.[0..6],P
14.[0..15],P
15.[2..15],H
IB_IO
_0,H
IB_IO
_1
DB
GP
RE
S#
ET
H_
CL
KE
TH
_C
RS
ET
H_
MD
C
ET
H_
MD
IO
ET
H_
RX
D0
ET
H_
RX
D1
ET
H_
RX
ER
ET
H_
TX
D0
ET
H_
TX
D1
ET
H_
TX
EN
HIB
_IO
_0
HIB
_IO
_0
HIB
_IO
_1
HIB
_IO
_1
MM
C_
CL
KM
MC
_C
MD
MM
C_
DA
T0
MM
C_D
AT
1M
MC
_D
AT
2
MM
C_
DA
T3
P0.0
P0
.0
P0.1
P0
.1
P0.2
P0
.2
P0.3
P0
.3
P0.4
P0
.4
P0.5
P0
.5
P0.6
P0
.6
P0.7
P0
.7
P0
.7
P0.8
P0
.8
P0.9
P0
.9
P0.1
0
P0
.10
P0.1
1
P0
.11
P0.1
2
P0
.12
P1.0
P1
.0
P1.0
P1.1
P1
.1
P1.1
P1.2
P1
.2
P1.3
P1
.3
P1.4
P1
.4P
1.5
P1
.5
P1.8
P1
.8P
1.9
P1
.9
P1.1
0
P1
.10
P1.1
1
P1
.11
P1.1
2
P1
.12
P1.1
3
P1
.13
P1.1
4
P1
.14
P1
.14
P1.1
5
P1
.15
P1
.15
P2
.1
P2
.1
P2
.1
P2
.6
P2
.6
P2
.10
P2
.10
P2
.14
P2
.14
P2
.15
P2
.15
P3
.0
P3
.0
P3
.1
P3
.1
P3
.2
P3
.2
P3
.3
P3
.3
P3
.4
P3
.4
P5
.0
P5
.0
P5
.1
P5
.1
P5
.2
P5
.2
P5
.7
P5
.7
P14.0
P1
4.0
P14.1
P1
4.1
P14.2
P1
4.2
P14.3
P1
4.3
P14.4
P1
4.4
P14.5
P1
4.5
P14.6
P1
4.6
P14.7
P1
4.7
P14.8
P1
4.8
P14.9
P1
4.9
P14.1
2
P1
4.1
2
P14.1
3
P1
4.1
3
P14.1
4
P1
4.1
4
P14.1
5
P1
4.1
5
P1
5.2
P1
5.2
P1
5.3
P1
5.3
RE
SE
T#
RE
SE
T#
RE
SE
T#
RE
SE
T#
RT
C1
RT
C2
TC
K
TC
K
TM
ST
MS
US
B_D
MU
SB
_D
P
VA
RE
F
VA
RE
F
VD
DA
VD
DC
AD
J_
1A
DJ_
2A
DJ_
3
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
C13
C1
6
C1
7
C2
0
C2
4
C2
5
1
23
D1
AC
D2
21
D3
EP
AD
EX
P
HIB
_IO
_0
14
HIB
_IO
_1
13
P0
.02
P0
.11
P0
.21
00
P0
.39
9P
0.4
98
P0
.59
7P
0.6
96
P0
.78
9P
0.8
88
P0
.94
P0
.10
3P
0.1
19
5P
0.1
29
4
P1
.07
9P
1.1
78
P1
.27
7P
1.3
76
P1
.47
5P
1.5
74
P1
.68
3P
1.7
82
P1
.88
1P
1.9
80
P1
.10
73
P1
.11
72
P1
.12
71
P1
.13
70
P1
.14
69
P1
.15
68
P2
.05
2P
2.1
51
P2
.25
0P
2.3
49
P2
.44
8P
2.5
47
P2
.65
4P
2.7
53
P2
.84
6P
2.9
45
P2
.10
44
P2
.14
41
P2
.15
40
P3
.07
P3
.16
P3
.25
P3
.39
3P
3.4
92
P3
.59
1P
3.6
90
P4
.08
5
P4
.18
4
P5
.05
8P
5.1
57
P5
.25
6P
5.7
55
P1
4.0
31
P1
4.1
30
P1
4.2
29
P1
4.3
28
P1
4.4
27
P1
4.5
26
P1
4.6
25
P1
4.7
24
P1
4.8
37
P1
4.9
36
P1
4.1
22
3P
14.1
32
2P
14.1
42
1P
14.1
52
0
P1
5.2
19
P1
5.3
18
P1
5.8
39
P1
5.9
38
PO
RS
T#
65
RT
C_
XT
AL
_1
15
RT
C_
XT
AL
_2
16
TC
K6
7
TM
S6
6
US
B_D
+9
US
B_D
-8
VA
GN
D3
2V
AR
EF
33
VB
AT
17
VB
US
10
VD
DA
35
VD
DC
12
VD
DC
14
2V
DD
C2
64
VD
DC
38
6
VD
DP
11
VD
DP
14
3V
DD
P2
60
VD
DP
38
7
VS
S5
9
VS
SA
34
VS
SO
63
XT
AL1
61
XT
AL2
62
IC1
L1
L2
L3
LED1LED2
Q1
R1R3R4
R5R6
R1
0R
11
R1
2
PP
1S S
1
SW
1
PP
1S S
1
SW
2
PP
1S S
1
SW
3
12
34
56
78
91
01
11
21
31
41
51
61
71
81
92
02
12
22
32
42
52
62
72
82
93
03
13
23
33
43
53
63
73
83
94
0
X1
12
34
56
78
910
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
X2
1 2 3 4 5
12
34
56
78
91
0
X5
X3
D1
D2
A B C D E
12
34
56
78
A B C D E
12
34
56
78
XM
C4
50
0_
Re
lax
-V1
25
.10
.20
12
13
:02
:04
1/2
Sh
ee
t:
Le
ga
l D
iscla
ime
r
The info
rmation g
iven in this
docum
ent shall
in n
o e
vent be r
egard
ed a
s a
guara
nte
e o
f conditio
ns o
r
chara
cte
ristics. W
ith r
espect to
any e
xam
ple
s o
r hin
ts g
iven h
ere
in, any typic
al valu
es s
tate
d h
ere
in a
nd/o
r any
info
rmation r
egard
ing the a
pplic
ation o
f th
e d
evic
e, In
fineon T
echnolo
gie
s h
ere
by d
iscla
ims a
ny a
nd a
ll w
arr
anties
and lia
bili
ties o
f any k
ind, in
clu
din
g w
ithout lim
itation, w
arr
anties o
f non-infr
ingem
ent of in
telle
ctu
al pro
pert
y r
ights
of any third p
art
y.
US
B
Su
pp
ly
An
alo
g
Dig
ita
l
Hib
ern
ate
/RT
C
XM
C4
50
0 R
ela
x/R
ela
x L
ite
Kit
V1
/ 2
5.1
0.2
01
2
LED2LED1
BU
TT
ON
2
BU
TT
ON
1
US
B C
on
ne
cto
r
Re
se
t
Bu
tto
ns &
LE
Ds
Co
rte
x D
eb
ug
XMC4500 Relax and XMC4500 Relax Lite
2mA LED2mA LED
TD
O/S
WO
TD
I
CPU, Pin Headers, Buttons, LEDs, Reset
-
XMC4500 Relax Kit-V1 XMC4500 Relax Lite Kit-V1
15pF
15pF
100nF
15pF
15pF
100nF
100nF
10uF/10V
10uF/10V
100nF
100nF
10uF/10V
10uF/10V
22uF/10V
100nF22uF/10V
100nF
22uF/10V
100nF
22pF
22pF
100nF
100nF10uF/10V
10
0n
F
ES
D8
V0
L2
B-0
3L
BAT60A
BAT54-02V
BA
T5
4-0
2V
GN
D
GN
D
GN
DG
ND
GN
DG
ND
GN
D
GN
D
GN
D
GN
D
GN
DG
ND
GN
D
GN
DG
ND
GN
D
GN
DG
ND
GN
DG
ND
GN
DG
ND
GN
DG
ND
GN
DG
ND
GN
DG
ND
XM
C4
50
0_
LQ
FP
10
0
IFX
11
17
ME
V3
3
S2
5F
L0
32
P0
XM
FI0
1
BL
M1
8P
G6
00
BLM18PG600
BL
M1
8P
G6
00
LED-GN/D/0603
LED-GN/D/0603
32
.76
8K
Hz
12
MH
Z/S
/3.2
X2
.5
25
MH
z/5
0p
pm
10k
680R
33
R/0
40
23
3R
/04
02
51
0R
/06
03
10
0R
10k
680R/0603
1k
120R
1k
6k49
no
ass./
0R
120R
10k
10k
10k
10k
10k
10k
10k
10k
VDD3.3
VDD3.3
VDD5
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD3.3
VDD5
ZX62-AB-5PA
no
ass.
W
rth
74
99
01
02
11
A
3M
_2
90
8-0
5W
B
XM
C4
50
0-F
10
0x1
02
4
CS
CS
DB
GP
RE
S#
DE
BU
G_LE
D
ET
H_C
LK
ET
H_C
RS
ET
H_M
DC
ET
H_M
DIO
ET
H_R
XD
0E
TH
_R
XD
1E
TH
_R
XE
R
ET
H_T
XD
0E
TH
_T
XD
1
ET
H_T
XE
N
MM
C_
CL
K
MM
C_
CM
D
MM
C_
DA
T0
MM
C_
DA
T1
MM
C_
DA
T2
MM
C_
DA
T3
P0
.0
P0
.0
P0
.1
P0
.1
P0
.7
P1.2
P1.3
P1.4
P1.5
P1.8
P1.1
0
P2
.1
P2
.1
P2
.1
P2
.10
P3.1
RE
SE
T#
RE
SE
T#
RE
SE
T#
RT
C1
RT
C2
TC
K
TC
K
TC
K
TM
S
TM
S
WT
CK
WT
MS
C14
C15
C19
C100
C101
C102
C103
C104
C105
C106
C108
C109
C110
C200
C201
C202
C203
C204
C205
C206
C207
C208
C209
C210
C4
00
1
23
D1
01
ACD102
21D200
21
D2
01
EP
AD
EX
P
HIB
_IO
_0
14
HIB
_IO
_1
13
P0.0
2P
0.1
1P
0.2
10
0P
0.3
99
P0.4
98
P0.5
97
P0.6
96
P0.7
89
P0.8
88
P0.9
4P
0.1
03
P0
.11
95
P0
.12
94
P1.0
79
P1.1
78
P1.2
77
P1.3
76
P1.4
75
P1.5
74
P1.6
83
P1.7
82
P1.8
81
P1.9
80
P1
.10
73
P1
.11
72
P1
.12
71
P1
.13
70
P1
.14
69
P1
.15
68
P2
.052
P2
.151
P2
.250
P2
.349
P2
.448
P2
.547
P2
.654
P2
.753
P2
.846
P2
.945
P2
.10
44
P2
.14
41
P2
.15
40
P3
.07
P3
.16
P3
.25
P3
.393
P3
.492
P3
.591
P3
.690
P4
.085
P4
.184
P5
.058
P5
.157
P5
.256
P5
.755
P1
4.0
31
P1
4.1
30
P1
4.2
29
P1
4.3
28
P1
4.4
27
P1
4.5
26
P1
4.6
25
P1
4.7
24
P1
4.8
37
P1
4.9
36
P1
4.1
22
3P
14
.13
22
P1
4.1
42
1P
14
.15
20
P1
5.2
19
P1
5.3
18
P1
5.8
39
P1
5.9
38
PO
RS
T#
65
RT
C_
XT
AL
_1
15
RT
C_
XT
AL
_2
16
TC
K67
TM
S66
US
B_
D+
9U
SB
_D
-8
VA
GN
D32
VA
RE
F33
VB
AT
17
VB
US
10
VD
DA
35
VD
DC
12
VD
DC
14
2V
DD
C2
64
VD
DC
38
6
VD
DP
11
VD
DP
14
3V
DD
P2
60
VD
DP
38
7
VS
S59
VS
SA
34
VS
SO
63
XT
AL
161
XT
AL
262
IC1
00
ADJ1
IN3
OU
T1
2
OU
T2
4
IC1
01
CR
S_
DV
15
GN
D2
2
INT
RP
18
LE
D0
23
MD
C1
1
MD
IO1
0
P_G
ND
EX
P
RE
F_
CL
K1
6
RE
XT
9
RS
T#
24
RX
D0
13
RX
D1
12
RX
ER
17
RX
M3
RX
P4
TX
D0
20
TX
D1
21
TX
EN
19
TX
M5
TX
P6
VD
DA
_3
.32
VD
DIO
14
VD
D_
1.2
1
XI
8
XO
7
CL
K6
CS
#1
DI
5
DO
2
GN
D4
HO
LD
#7
VC
C8
WP
#3
IC4
00
12
34
56
78
JP
50
0
12
34
56
78
JP
50
1
L1
00
L200
L2
01
LED100
LED101
Q2
Q1
00
Q2
00
R7
R100
R1
01
R1
02
R1
03
R1
04
R105
R106
R200
R201
R203
R204
R2
06
R207
R300
R301
R302
R303
R304
R400
R401
R402
1 2 3 4 5
X1
00
C
1234
X1
01
CG
8
CT
R5
CT
T4
LA
9
LC
10
NC
7
RA
12
RC
11
RD
+3
RD
-6
S1
S1
S2
S2
TD
+1
TD
-2
X2
00
CL
K/S
CK
5
CM
D/M
OS
I3
DA
T0
/MIS
O7
DA
T1
8
DA
T2
1
DA
T3
/CS
_N
2
GN
D6
S1
S1
S2
S2
S3
S3
S4
S4
VD
D4
X3
00
IC200
KS
Z8031R
NL
D1
D2
A B C D E
12
34
56
78
A B C D E
12
34
56
78
XM
C4
50
0_
Re
lax
-V1
25.1
0.2
01
2 1
3:0
2:0
4
2/2
Sh
ee
t:
Le
ga
l D
iscla
ime
r
The info
rmation g
iven in this
docum
ent shall
in n
o e
vent be r
egard
ed a
s a
guara
nte
e o
f conditio
ns o
r
chara
cte
ristics. W
ith r
espect to
any e
xam
ple
s o
r hin
ts g
iven h
ere
in, any typic
al valu
es s
tate
d h
ere
in a
nd/o
r any
info
rmation r
egard
ing the a
pplic
ation o
f th
e d
evic
e, In
fineon T
echnolo
gie
s h
ere
by d
iscla
ims a
ny a
nd a
ll w
arr
anties
and lia
bili
ties o
f any k
ind, in
clu
din
g w
ithout lim
itation, w
arr
anties o
f non-infr
ingem
ent of in
telle
ctu
al pro
pert
y r
ights
of any third p
art
y.
US
B
Su
pp
ly
An
alo
g
Dig
ita
l
Hib
ern
ate
/RT
C
(IO
0)
(IO
1)
(IO
3)
(IO
2)
RJ4
5
XM
C4
50
0 R
ela
x/R
ela
x L
ite
Kit
Debug
Mic
ro S
D-C
ard
qS
PI
Fla
sh
Po
we
r
V1
/ 2
5.1
0.2
01
2
RT
C C
rysta
l
On
-bo
ard
De
bu
gg
er
Eth
ern
et
De
bu
g C
on
ne
cto
r
Power
Re
lax K
it o
nly
Re
lax K
it o
nly
Re
lax K
it o
nly
Re
lax K
it o
nly
SW
V
TD
I
TM
S
TC
K
TD
O
4 TH-Pads
2mA LED
IC1
00
_R
XD
IC1
00
_T
XD
2.54mm pitch
On-board Debugger, Power Supply, Ethernet, Quad-SPI Memory, SD
Card Slot, RTC Crystal
-
1DEZVOLTAREA APLICATIILOR CUMICROCONTROLERUL XMC
4500DESCRIEREAMODULUI DE GENERARE AUTOMATA ACODULUI IN MEDIULUI
INTEGRAT DE DEZVOLTARE DAVE
Desfasurarea lucrarii1. Modul de creare a unui proiect nou in
DAVE- CE (Code Engine). Crearea unei
aplicatii care foloseste resursele placii de evaluare Relax 4500
(2 butoane si 2LED-uri) si ceasul de sistem SysClk.
2. Setarea parametrilor pentru blocurile functionale alese din
DAVE Apps: IO004 siSYSTM001.
3. Studiul programului exemplificat (organigrama generala,
utilizarea timerelor,modul de programare a porturilor IO, analiza
programului)
4. Executia programului pe placa de evaluare Relax 4500.Teme
suplimentare1. Sa se studieze modul in care s-a creat aplicatia DMA
cu DAVE Apps (DMA003).2. Sa se creeze, dupa modelele prezentate, o
aplicatie cu DAVE Apps (PWM-Pulse
Width Modulation), care genereaza un semnal dreptunghiular cu
factor deumplere reglabil din butoanele Button 1 (apasarea acestui
buton mareste duratapulsului) si Button 2 (apasarea acestui buton
micsoreaza durata pulsului).Perioada pulsurilor este constanta 1
sec. Semnalul va fi vizualizat pe LED 1, iarLED 2 se va
aprinde/stinge cu perioada de 1 sec.
3. Sa se creeze, dupa modelele prezentate, o aplicatie cu DAVE
Apps (RTC-RealTime Control) care implementeaza o alarma cu
temporizare. La apasareabutonului Button 1, se masoara o durata de
timp de 10 sec., dupa care sedeclanseaza o alarma (aprinderea LED
1). Daca in intervalul de 10 sec. se apasabutonul Button 2, atunci
alarma este resetata. Starea sistemului este indicata deLED 2 (
aprins alarma activata, stins alarma resetata).
-
2Descrierea aplicatiilor IO004 si SYSTM001 din DAVE
AppsAplicatia IO004Permite configurarea prin software a unui pin
dintr-un port IO.Structurile de date folosite de aplicatia IO004
sint:typedef struct {__IO uint32_t OUT;__O uint32_t OMR;__I
uint32_t RESERVED1[2];__IO uint32_t IOCR0;__IO uint32_t IOCR4;__IO
uint32_t IOCR8;__IO uint32_t IOCR12;__I uint32_t RESERVED2[1];__I
uint32_t IN;__I uint32_t RESERVED3[6];__IO uint32_t PDR0;__IO
uint32_t PDR1;__I uint32_t RESERVED4[6];__IO uint32_t PDISC;__I
uint32_t RESERVED5[3];__IO uint32_t PPS; __IO uint32_t
HWSEL;}IO004_PORTS_TypeDef;
typedef struct IO004_HandleType{ uint8_t PortNr; uint8_t
PortPin;IO004_PORTS_TypeDef* PortRegs;
}IO004_HandleType; typedef enum
IO004_InputModeType{IO004_TRISTATE,IO004_PULL_DOWN_DEVICE,IO004_PULL_UP_DEVICE,IO004_CONT_POLLING,IO004_INV_TRISTATE,IO004_INV_PULL_DOWN_DEVICE,IO004_INV_PULL_UP_DEVICE,IO004_INV_CONT_POLLING,}IO004_InputModeType;typedef
enum IO004_OutputModeType{IO004_PUSHPULL =0x10,IO004_OPENDRAIN
=0x18}IO004_OutputModeType;
-
3Functiile aplicatiei IO004 sint:void IO004_Init (void)
- initializeaza porturile IO , conform specificatiilor
utilatorului.- se apeleaza implicit in functia DAVEInit#define
IO004_ReadPin(Handle) (((Handle.PortRegs->IN) >>
Handle.PortPin) & 1U)
- citeste pinul de intrare definit de Handle#include int
main(void) { bool Value = 0; DAVE_Init(); // IO004_Init() is called
within DAVE_Init() Value = IO004_ReadPin(IO004_Handle0); return 0;
}#define IO004_SetPin(Handle) (Handle.PortRegs->OMR) |= (1U OMR
|= Value ?(1U
- 4#include int main(void) { DAVE_Init(); // IO004_Init() is
called within DAVE_Init() IO004_ResetPin(IO004_Handle0); return 0;
}#define IO004_TogglePin(Handle) ((Handle.PortRegs->OMR) |=
(0x10001UL
-
5- valideaza iesirea pinului definit de Handle. Pinul este
configurat ca iesire inconformitate cu configurarea utilizatorului
- Push-Pull sau Open-Drain.#include int main(void) { DAVE_Init();
// IO004_Init() is called within DAVE_Init()
IO004_EnableOutputDriver(&IO004_Handle0,IO004_OPENDRAIN);
return 0;
Aplicatia SYSTM001Implementeaza timere software(maxim 32 de
timere) bazate pe ceasul de sistem(SysTick). Timerele sint create
cu functia SYSTM001_CreateTimer(). Fiecare timer vaavea un
identificator unic. Pornirea unui timer se realizeaza cu
functiaSYSTM001_StartTimer(). Timerele pot fi de doua tipuri: One
shot si Periodic.Structurile de date utilizate sint:typedef enum
SYSTM001_TimerStateType{SYSTM001_STATE_RUNNING,SYSTM001_STATE_STOPPED}SYSTM001_TimerStateType;typedef
enum
SYSTM001_TimerType{SYSTM001_ONE_SHOT,SYSTM001_PERIODIC}SYSTM001_TimerType;typedef
enum SYSTM001_ErrorCodesType{SYSTM001_INVALID_HANDLE_ERROR =
1,SYSTM001_ERROR,SYSTM001_FUNCTION_ENTRY,SYSTM001_FUNCTION_EXIT}SYSTM001_ErrorCodesType;typedef
void (*SYSTM001_TimerCallBackPtr)(void* ParamToCallBack);typedef
struct SYSTM001_TimerObject{uint32_t TimerID;SYSTM001_TimerType
TimerType;SYSTM001_TimerStateType TimerState;uint32_t
TimerCount;uint32_t TimerReload;SYSTM001_TimerCallBackPtr
TimerCallBack;void* ParamToCallBack;struct SYSTM001_TimerObject*
TimerNext;struct SYSTM001_TimerObject* TimerPrev;
-
6}SYSTM001_TimerObject;Functiile generate de aplicatia SYSTM001
sint:void SYSTM001_Init (void)
- initializarea aplicatiei ( se face automat din
DAVEInit)handle_t SYSTM001_CreateTimer (uint32_t Period,
SYSTM001_TimerType TimerType,SYSTM001_TimerCallBackPtr
TimerCallBack, void *pCallBackArgPtr)
- creaza un timer cu perioada Period (ms) si cu tipul
TimerType.- la expirarea timpului se va executa functia
TimerCallBack cu parametrii indicati depointerul pCallBackArgPtr.-
intoarce identificatorul timerului Handle#include static volatile
bool TimerExpired; void my_func_a(void* Temp) { static uint32_t
Count = 1; if(Count == 10) { TimerExpired = TRUE; } Count++; } int
main(void) { handle_t TimerId; // ... Initializes Apps
configurations ... DAVE_Init(); TimerId =
SYSTM001_CreateTimer(100,SYSTM001_PERIODIC,my_func_a,NULL);
if(TimerId != 0) { //Timer is created successfully } // ...
infinite loop ... while(1) { } }status_t SYSTM001_StartTimer
(handle_t Handle)
- porneste timerul identificat prin Handle #include static
volatile bool TimerExpired; void my_func_a(void* Temp) {
-
7 static uint32_t Count = 1; if(Count == 10) { TimerExpired =
TRUE; } Count++; } int main(void) { handle_t TimerId; uint32_t
Status = SYSTM001_ERROR; // ... Initializes Apps configurations ...
DAVE_Init(); TimerId =
SYSTM001_CreateTimer(100,SYSTM001_PERIODIC,my_func_a,NULL);
if(TimerId != 0) { //Timer is created successfully Status =
SYSTM001_StartTimer(TimerId); if(Status == DAVEApp_SUCCESS) {
//Timer started } } // ... infinite loop ... while(1) { } }status_t
SYSTM001_StopTimer (handle_t Handle)
- opreste timerul identificat prin Handle#include static
volatile bool TimerExpired; void my_func_a(void* Temp) { static
uint32_t Count = 1; if(Count == 10) { TimerExpired = TRUE; }
Count++; } int main(void) { handle_t TimerId; uint32_t Status =
SYSTM001_ERROR; // ... Initializes Apps configurations ...
DAVE_Init(); TimerId =
SYSTM001_CreateTimer(100,SYSTM001_PERIODIC,my_func_a,NULL);
if(TimerId != 0) { //Timer is created successfully
-
8 Status = SYSTM001_StartTimer(TimerId); if(Status ==
DAVEApp_SUCCESS) { // Wait till timer is expired while(TimerExpired
== FALSE) {} //stop the timer Status = SYSTM001_StopTimer(TimerId);
if(Status == DAVEApp_SUCCESS) { //Timer stopped } } // start the
timer SYSTM001_StartTimer(TimerId); } // ... infinite loop ...
while(1) { } }status_t SYSTM001_DeleteTimer (handle_t Handle)
- distruge timerul identificat prin identificat prin
Handle#include static volatile bool TimerExpired; void
my_func_a(void* Temp) { static uint32_t Count = 1; if(Count == 10)
{ TimerExpired = TRUE; } Count++; } int main(void) { handle_t
TimerId; uint32_t Status = SYSTM001_ERROR; // ... Initializes Apps
configurations ... DAVE_Init(); TimerId =
SYSTM001_CreateTimer(100,SYSTM001_PERIODIC,my_func_a,NULL);
if(TimerId != 0) { //Timer is created successfully Status =
SYSTM001_StartTimer(TimerId); if(Status == DAVEApp_SUCCESS) { //
Wait till timer is expired while(TimerExpired == FALSE) {}
-
9 //stop the timer Status = SYSTM001_StopTimer(TimerId);
if(Status == DAVEApp_SUCCESS) { SYSTM001_DeleteTimer(TimerId); } }
} // ... infinite loop ... while(1) { } }uint32_t SYSTM001_GetTime
(void)
- preia valoarea curenta a timerului identificat prin Handle (in
ms)#include
static volatile bool TimerExpired; void my_func_a(void*
Temp)
{ static uint32_t Count = 1; if(Count == 10) { TimerExpired =
TRUE; } Count++; } int main(void) { handle_t TimerId; uint32_t
SystemTime = 0; uint32_t Status = SYSTM001_ERROR;
// ... Initializes Apps configurations ... DAVE_Init(); TimerId
= SYSTM001_CreateTimer(100,SYSTM001_PERIODIC,my_func_a,NULL);
if(TimerId != 0) { //Timer is created successfully Status =
SYSTM001_StartTimer(TimerId); if(Status == DAVEApp_SUCCESS) {
SystemTime = SYSTM001_GetTime(); } } // ... infinite loop ...
while(1) { } }
-
10
uint32_t SYSTM001_GetSysTickCount (uint32_t Period)
- preia numarul de perioade de tact SysTick pentru timerul
identificat prin Handle, pedurata de timp Period (ms)#include int
main(void) { uint32_t SysTickCount = 0; DAVE_Init(); // Get systick
timer count value for 100millisec
SysTickCount = SYSTM001_GetSysTickCount(100); return 0; }
Realizarea unei aplicatii bazate pe un proiect DAVE CESe va
realiza o aplicatie (figura 1) cu urmatoarele specificatii:
- citeste starea butonului BUTTON1 si o afiseaza pe led-ul LED1,
la fiecare20 ms
- daca butonul BUTTON2 este apasat atunci led-ul LED2 isi va
comutastarea de aprins/stins la fiecare 1 secunda
Pentru realizarea aplicatiei se vor utiliza 2 timere software,
Timer1 si Timer2, create cumodulul SYSTM001 din DAVE Apps. Pinii de
intrare iesire vor fi controlati prinfunctii generate de moule de
tip IO004 din DAVE Apps.
Figura 1.Se urmeaza urmatoarele etape:
1. Se creaza un proiect nou, de tip DAVE CE
-
11
2. Se deschide fereastra de selectie a aplcatiilor DAVE Apps, pe
baza carora se vagenera cod automat pentru controlur resurselor
microcontrolerului
3. In fereastra App Selection View, se selecteaza (dublu click)
aplicatia IO004 ( de 4ori) si aplicatia SYSTM01 (1 data)
-
12
4. Se deschide fereastra S/W App Connectivity View
5. Se denumesc blocurile IO004 astfel:
-
13
6. Se seteaza parametrii blocurilor IO004 astfel:IO004/0 BUTTON
1 (portul P1.14 intrare pull-up)IO004/2 BUTTON 2 (portul P1.15
intrare pull-up)IO004/1 LED 1 (portul P1.1 iesire pull-push)IO004/3
LED 2 (portul P1.0 iesire push-pull)Blocul CLK001/0 nu se
modificaPentru setarea parametrilor se da dublu click pe blocul
care se doreste a fi configurat, iarpentru asocierea pinilor se da
click dreapta si se selecteazaManual Pin Assignment.Dupa fiecare
setare se da comanda Solve and save.
-
14
7. Se genereaza codul cu comada DAVE-> Genarate Code
8. Se scrie codul utilizatorului in functiile Main si functiile
asociate cu expirareatimerelor Timer1 si Timer2.
Codul este urmatorul:/* * Main.c **/
#include //Declarations from DAVE3 Code Generation(includes SFR
declaration)
-
15
uint32_t count=0;void Timer1(void* Temp)
{ bool Value = 0; //{asm("BKPT 255");} Value =
IO004_ReadPin(IO004_Handle0);
IO004_SetOutputValue(IO004_Handle1,Value);
}void Timer2(void* Temp)
{ bool Value = 0; //{asm("BKPT 255");} count=(count+1)%2; Value
= IO004_ReadPin(IO004_Handle2);if (Value==0)
IO004_SetOutputValue(IO004_Handle3,count);else
IO004_SetOutputValue(IO004_Handle3,0);
}
int main(void){// status_t status; // Declaration of return
variable for DAVE3APIs (toggle comment if required)
handle_t TimerId1;handle_t TimerId2;uint32_t Status1 =
SYSTM001_ERROR;uint32_t Status2 = SYSTM001_ERROR;DAVE_Init(); //
Initialization of DAVE Apps
IO004_EnableOutputDriver(&IO004_Handle1,IO004_PUSHPULL);
IO004_EnableOutputDriver(&IO004_Handle3,IO004_PUSHPULL);
TimerId1 =
SYSTM001_CreateTimer(20,SYSTM001_PERIODIC,Timer1,NULL);if(TimerId1
!= 0) Status1 =SYSTM001_StartTimer(TimerId1); //Timer is
created successfullyTimerId2 =
SYSTM001_CreateTimer(1000,SYSTM001_PERIODIC,Timer2,NULL);if(TimerId2
!= 0) Status2 =SYSTM001_StartTimer(TimerId2); //Timer is
created successfullyif ((Status1==DAVEApp_SUCCESS) &&
(Status2==DAVEApp_SUCCESS)){while(1){}}else { asm("BKPT 255");}
-
16
return 0;}
9. Se deschide o sesiune de depanare si se executa codul pe
placa de evaluare Relax4500.
-
17
TEMA SUPLIMENTARATRANSFERUL DMAPROGRAMAREA GPDMA XMC 4500 CU
AJUTORUL DAVE CE
Descrierea blocului GPDMA al microcontrolerului XMC4500
Blocul GPDMA ( General Purpose Direct Memory Access) este un
controller DMAperformant care realizeaza transferuri rapide
(memorie-memorie si memorie-IO) cuinterventia minima a
procesorului.Disopzitivele periferice ale microcontrolerului pot
accesa memoria prin canale DMA.Caracteristicile GPDMA sint:
- Interfetele cu bus-urileo 1 bus mastero 1 bus slave
- Canale de comunicatieo 1 bloc GPDMA0 cu 8 canaleo 1 bloc
GPDMA1 cu 8 canaleo Posibilitatea de a programa prioritatea
canalelor
- Transferurio memorie+memorie, memorie periferice, periferice -
memorie
Toate canalele DMA pot fi programate in urmatoarele moduri:-
transfer DMA declansat hardware sau software- adrese sursa si
destinatie programabile- modificarea adresei prin incrementare sau
decrementareCanalele 0 si 1 din blocul GPDMA0 pot fi programate in
modurile:- transfer multi-bloc ( ca liste inlantuite, cu auto
incarcarea registrelor de
programare, cu adrese continue intre blocuri)- selectarea
adreselor sursa si destinatie independent pentru fiecare bloc-
adresele sursa si destinatie un trebuei sa fie intr-o zona continua
de memorieSe pot realiza transferuri DMA de tip burst, cu ajutorul
unor cozi FIFO.
Canalele DMA sint controlate independent si pot fi activate sau
dezactivate. Se potgenera intreruperi la terminarea unui transfer
sau la aparitia unei erori.
-
18
Schema bloc a GPDMA este prezentata in figura 2.Se observa
urmatoarele module functionale:
- interfata de cereri hardware (DMA hardware request interface -
DLR)- 12 canale DMA- Circuit de arbitrare a cererilor DMA-
Interfetele cu bus-urile master si slave
Figura 2.
Transferurile DMA pot fi initiate de catre software se va genera
o intrerupere laterminarea transferului (ca in figura 3).
-
19
Figura 3.
Registrele GPDMARegistrele GPDMA sint impartite in module
asociate blocurilor GPDMA0 si
GPDMA1astfel:ModululGPDMA0_CH0GPDMA0_CH1GPDMA0_CH2GPDMA0_CH3GPDMA0_CH4GPDMA0_CH5GPDMA0_CH6GPDMA0_CH7GPDMA0GPDMA1_CH0GPDMA1_CH1GPDMA1_CH2GPDMA1_CH3GPDMA1
Exista registre asociate fiecarui canal GPDMAx_CHy cu x = 0 y=
0-7 si x = 1, y = 0-3si registre pentru tot blocul GPDMAx (x =
0,1).Identificarea registrelor se face astfel:
GPDMAx_CHy_nume_registru (pentru registrelede asociate canalului si
de control) si GPDMAx_nume_registru (pentru registrele
pentruintreruperi, Software Handshaking, configurare si validare si
registrele Miscellaneous )
-
20
Registre asociate canaluluiSAR Source Address RegisterDAR
Destination Address Register
Registre de controlCTLH Control Register High
CTLL Control Register LowLLP Linked List Pointer RegisterSSTAT
Source Status Register
DSTAT Destination Status RegisterSSTATAR Source Status
RegisterDSTATAR Destination Status RegisterCFGH Configuration
Register HighCFGL Configuration Register LowSGR Source Gather
RegisterDSR Destination Scatter Register
Registre pentru intreruperiRAW* with *TFR, *BLOCK,*SRCTRAN,
*DSTTRAN, *ERR
Interrupt Raw Status Registers
STATUS* with *TFR, *BLOCK,*SRCTRAN, *DSTTRAN, *ERR
Interrupt Status Registers
MASK* with *TFR, *BLOCK,*SRCTRAN,*DSTTRAN, *ERR
Interrupt Mask Registers