toate laboratoarele

141
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.

Upload: anonymus01

Post on 15-Nov-2015

126 views

Category:

Documents


2 download

TRANSCRIPT

  • 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