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
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
Top Related