priprema_za_lab_1 novo.pdf

12
Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1 1 LABORATORIJSKE VEŽBE IZ ISPITA PRIMENA MIKROPROCESORA U ELEKTROENERGETICI Mikrokontroler je sa okolinom fizički direktno povezan preko svojih ulazno izlaznih pinova. Komandi i drugi signali, kao i sam rezultat svakog digitalnog zakona upravljanja na kraju se preko njih dobijaju, odnosno prosleđuje okolnoj prilagodnoj elektronici. Iz tog razloga vežba 1 za prvi cilj ima upoznavanje studenata sa osnovnim (digitalnim) ulazno izlaznim funkcijama mikrokontrolera dsPIC30F4011. Za samo digitalno upravljanje je od izuzetnog značaja i merenje vremena jer se jednakim vremenskim intervalima definiše perioda odabiranja digitalnog sistema. Merač vremena daje signal sistemu da je jedna takva perioda istekla i da treba izvršiti nova merenja na objektu. U skladu sa tim merenjima potrebno je izračunati novi izlaz digitalnog zakona upravljanja i postaviti novu vrednost upravljačke promenljive koja će biti aktuelna tokom sledeće periode odabiranja. Stoga je drugi cilj vežbe 1 da se student upozna sa radom brojačkih modula unutar mikrokontrolera dsPIC4011. Dati modul se može konfigurisati da meri vreme (timer mode), i na taj način svojim signalom prekida obezbedi izvršenje pojedinih funkcija programa u tačno određenim trenucima. Date funkcije se testiraju na odgovarajućem razvojnom sistemu, opremljenom velikim brojem tastera i dioda tipa LED. Upoznavanje sa načinom rada i osnovnim periferijama mikrokontrolera dsPIC30F4011 (IO portovi, merači vremena, prekidi) I vežba

Upload: dotuong

Post on 29-Jan-2017

243 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

1

LABORATORIJSKE VEŽBE IZ ISPITA PRIMENA MIKROPROCESORA U ELEKTROENERGETICI

Mikrokontroler je sa okolinom fizički direktno povezan preko svojih ulazno

izlaznih pinova. Komandi i drugi signali, kao i sam rezultat svakog digitalnog zakona

upravljanja na kraju se preko njih dobijaju, odnosno prosleđuje okolnoj prilagodnoj

elektronici. Iz tog razloga vežba 1 za prvi cilj ima upoznavanje studenata sa osnovnim

(digitalnim) ulazno izlaznim funkcijama mikrokontrolera dsPIC30F4011. Za samo

digitalno upravljanje je od izuzetnog značaja i merenje vremena jer se jednakim

vremenskim intervalima definiše perioda odabiranja digitalnog sistema. Merač

vremena daje signal sistemu da je jedna takva perioda istekla i da treba izvršiti nova

merenja na objektu. U skladu sa tim merenjima potrebno je izračunati novi izlaz

digitalnog zakona upravljanja i postaviti novu vrednost upravljačke promenljive koja

će biti aktuelna tokom sledeće periode odabiranja. Stoga je drugi cilj vežbe 1 da se

student upozna sa radom brojačkih modula unutar mikrokontrolera dsPIC4011. Dati

modul se može konfigurisati da meri vreme (timer mode), i na taj način svojim

signalom prekida obezbedi izvršenje pojedinih funkcija programa u tačno određenim

trenucima. Date funkcije se testiraju na odgovarajućem razvojnom sistemu,

opremljenom velikim brojem tastera i dioda tipa LED.

Upoznavanje sa načinom rada i osnovnim periferijama mikrokontrolera dsPIC30F4011

(IO portovi, merači vremena, prekidi)

I vežba

Page 2: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

2

1.1. Priprema za vežbu

Teorijska priprema

• Upoznati se sa osnovama praktičnog rada sa mikrokontrolerima, pročitati

uvodno poglavlje ovog praktikuma

• Proučiti internu arhitekturu mikrokontrolera dsPIC4011 i osnovne programske

instrukcije, korisničko uputstvo [Microchip, dsPIC30F4011/4012 Data Sheet]

• Posebnu pažnju posvetiti radu IO portova, brojačkih modula i obradi prekida

koji dolaze sa brojačkih modula

Pripremiti za vežbe

• Proučiti opis eksperimentalne kartice, dat u uvodnom delu praktikuma

• Detaljno proučiti date programe

1.2. Opis korišćene makete

Maketa korišćena za vežbu 1 jeste razvojni sistem Mikroelektronika easy

dsPIC2 sa dsPIC4011 kontrolerom. Svi potrebni ulazi/izlazi nalaze se na samom

razvojnom sistemu, čiji je detaljan opis dat u uvodnom poglavlju praktikuma i prikazan

na slikama U-4, U-5. Deo datog sistema koji se koristi u ovoj vežbi prikazan je na slici

1.1. LED su preko odgovarajućeg otpornika vezane direktno na pin mikrokontrolera.

Prilikom aktivacije tastera na pinu mikrokontrolera se ima naponski nivo 0V (logička

"0"), dok se naponski nivo 5V (logička "1") ima kada je taster neaktivan (zahvaljujući

postavljenom pull-up otporniku).

RB0

RF0

dsPIC4011

R LED1

R LED2

R

RE0

Taster

Sl 1.1. Deo razvojnog sistema Mikroelektronika easy dsPIC2 koji se koristi u vežbi 1

Page 3: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

3

1.3. Zadaci za vežbu

U narednom tekstu nalaze se zadaci za vežbanje. Njihovo rešenje nalazi se na

kraju ovog poglavlja. Svi primeri su urađeni u programskim jezicima asembler i "C".

Od studenta se očekuje da posle njihovog testiranja, samostalno napiše programe za

zadatke date na kraju svakog poglavlja.

1.3.1. Zadatak 1 - Taster i LED

Napisati program u asembleru, a zatim u "C"-u, koji posle inicijalizacije

odgovarajućih portova mikrokontrolera radi sledeće: jednu LED pali odmah (RB0), a

drugu (RF0) zavisno od toga da li je pritisnut odgovarajuci taster (RE0).

Izgled algoritma rada mikrokontrolera za navedeni zadatak je dat na slici 1.2.

Sl. 1.2. Algoritam rada mikrokontrolera, zadatak 1

Izgled projekta (sa programom pisanim u asembleru, izgled je sličan i za

program u "C"-u) dat je na slici 1.3. Program (Taster_LED.s) se nalazi u folderu koji

nosi ime Source files i to je suštinski deo projekta. U folderu Link script se nalazi file

koji definiše memorijske lokacije za sam program i podatke (p30f4011.gld) i on se

najčešće direktno preuzima od samog proizvođača kontrolera.

Na kraju vežbe u prilogu je dato rešenje datog zadatka. Prvo je urađena

inicijalizacija pinova kontrolera: pin se definiše kao ulazni za taster, a kao izlazni za

LED. Posle toga je izvršeno uključivanje prve LED, a potom se u delu programa koji

kontroler stalno izvršava (glavna petlja) testira stanja tastera na osnovu čega se

uključuje ili isključuje druga LED. Posle programa u "C"-u dat je i izgled fajla

p30f4011.h, koji isporučuje sam proizvođač. U njemu su definisani svi registri datog

kontrolera, koji se posle koriste u samom primeru. Listing datog fajla dat je u

skraćenom obliku zbog velike dužine usled postojanja velikog broja registara

korišćenog digitalnog signalnog kontrolera. Ostatak pomenutnog programa može se

pogledati na računaru u laboratoriji.

Vežba u laboratoriji:

Page 4: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

4

Posle testiranja datih programa, napisati program u "C"-u koji u slučaju da su

dva tastera istovremeno pritisnuta (RE0 i RC13) vrši uključenje LED2 (RF0).

Sl 1.3. Izgled projekta u MPLAB okruženju

1.3.2. Zadatak 2 - Treperenje LED (čekanjem u petlji)

Napisati program u asembleru, a zatim u "C"-u, koji posle inicijalizacije

odgovarajućih portova mikrokontrolera radi sledeće: blinka (uključuje/isključuje)

jednu LED. Potrebno vreme uključenog/isključenog stanja diode dobiti vrteći se u

programskoj petlji.

Algoritam datog programa isti je kao na slici 1.2, dok su listinzi programa

standardno dati na kraju, u prilogu vežbe. Ovaj način blinkanja LED nije optimalan jer

se kontroler sve vreme vrti u petlji, ne radeći ništa korisno.

Vežba u laboratoriji:

Posle testiranja datih programa, napisati program u "C"-u koji blinka dve LED,

pri čemu je frekvencija blinkanja jedne dvostruko veća od frekvencije blinkanja druge.

Posle toga napraviti plivajuće svetlo sa raspoloživim LED-ovkama na razvojnom

sistemu (kada se jedna isključuje, uključuje se susedna i tako u krug).

Page 5: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

5

1.3.3. Zadatak 3 - Treperenje LED (sa timer-om)

Napisati program u asembleru, a zatim u "C"-u, koji posle inicijalizacije

odgovarajućih portova mikrokontrolera radi sledeće: blinka (uključuje/isključuje)

jednu LED uz pomoć timer-a.

Algoritam datog programa dat je na slici 1.4, dok su listinzi programa

standardno dati na kraju, u prilogu vežbe. Ovaj način blinkanja LED je optimalan jer

kontroler može da izvršava druge zadatke sve dok ne dođe vreme da se promeni stanje

LED.

Glavni program

Inicijalizacija vremenskog brojača (T1)

dozvola prekida T1

glavna petlja

Inicijalizacija sistema

Sl. 1.4. Opšti algoritam rada mikrokontrolera, zadatak 3

Vežba u laboratoriji:

Posle testiranja datih programa, napisati program u "C"-u koji blinka dve LED,

pri čemu je frekvencija blinkanja jedne četvorostruko veća od frekvencije blinkanja

druge. Da li je ovo precizniji i lakši način generisanja vremena na kontroleru od načina

primenjenog u zadatku 2?

Napraviti sat koji broji sekunde i minute rada vašeg kontrolera.

1.4. Rešenje zadataka za vežbu 1

U ovom poglavlju slede programi koji predstavljaju rešenje datih zadataka.

1.4.1. Rešenje zadatka 1 - Taster i LED, program pisan u asembleru

;PROGRAM: Taster_LED asm ;OPIS : Inicijalizuje portove mikrokontrolera. Jednu LED pali odmah, a drugu zavisno da li je stisnut

; odgovarajuci taster( koji je aktivan na nulu,tj. ima pull-up otpor

;------------------------------------------------------------------------------------------------------------------------------

__reset:

;Inicijalizacija PORTB biti 0-8

mov #0x01ff, W0 ;PORTB moze biti analogni ili digitalni

Page 6: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

6

mov W0, ADPCFG ;svi pinovi digitalni, ne analogni

mov #0xfffe, W0 ;na PORTB, na RB0 hocemo da palimo LED,

;pa ce taj pin biti izlazni, ostali pinovi ostaju

;ulazni

mov W0, TRISB

;Inicijalizacija PORTE, biti 0-8 (cisto digitalni port)

mov #0xffff, W0 ;na PORTE, na RE0 je taster u zavisnosti od

;cijeg stanja palimo LED koja je na RF0, svi

;pinovi ulazni

mov W0, TRISE ;jumperi na razvojnom sistemu: za pull-up

;otpor na RE portu, i za taster aktivan na nulu

;(prekidac LED E iskljucen)

;Inicijalizacija PORTF, biti 0-6 (cisto digitalni port)

mov #0xfffe, W0 ;na PORTF, na RF0 LED, ostali pinovi ostaju

;ulazni

mov W0, TRISF

bset LATB,#0 ;upalili smo LED na RB0 (upisano u LATB

;registar)

; bset PORTB,#0 ;isto (upisano u LATB registar)

;Glavni program

vrti:

btss PORTE,#0

; btsc LATE,#0 ;u ovom slucaju ne bi ispitali fizicko stanje

;pina, vec sadrzaj LATE registra

bset LATF,#0 ;ako je stisnut taster na RE0, pali LED na RF0

btsc PORTE,#0

bclr LATF,#0 ;u suprotnom je gasi

bra vrti

1.4.2. Rešenje zadatka 1 - Taster i LED, program pisan u "C"-u

/************************************************************************************/

/* PROGRAM: Primer 1: Taster_LED "C" */

/* OPIS : Inicijalizuje portove mikrokontrolera. Jednu LED pali odmah, a drugu zavisno da li je stisnut */

/*odgovarajuci taster(koji je aktivan na nulu,tj. ima pull-up otpor */

/************************************************************************************/

// Ukljucivanje potrebnih zaglavlja

#include <p30f4011.h>

// Definicije konstanti

#define CONSTANT_1 1 // primer konstante

#define LED1 LATBbits.LATB0 // LED1

#define LED2 LATFbits.LATF0 // LED2

Page 7: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

7

#define Taster PORTEbits.RE0 // Taster

// Deklaracije globalnih promenljivih

unsigned int var_global = 0; // primer promenljive

// Funkcija za inicijalizaciju IO periferije

void IO_Init(void)

{

// Inicijalizacija PORTB: biti 0-8

ADPCFG = 0x0000; // PORTB moze biti analogni ili digitalni: svi pinovi

//digitalni

TRISB = 0xfffe; // na RB0 je LED, pa ce taj pin biti izlazni, ostali pinovi

//ostaju ulazni

// Inicijalizacija PORTE, biti 0-8 (cisto digitalni port)

TRISE = 0xffff; // na PORTE, na RE0 je taster u zavisnosti od cijeg

//stanja palimo LED koja je na RF0, svi pinovi ulazni

// jumperi na razvojnom sistemu: za pull-up otpor na RE

//portu, taster aktivan na nulu

// Inicijalizacija PORTF, biti 0-6 (cisto digitalni port)

TRISF = 0xfffe; // na PORTF, na RF0 LED, ostali pinovi ostaju ulaz

}

/*************************/

/*** GLAVNI PROGRAM ***/

/*************************/

int main(void)

{

unsigned int i = 0; // lokalna promenljiva

IO_Init(); // inicijalizuj IO pinove

LED1 = 1; // LED1 odmah ukljucujemo

// beskonacna petlja

while(1)

{

if (Taster == 0) // LED2 ukljucena zavisno od stanja tastera (aktivan na

//nulu)

LED2 = 1;

else

LED2 = 0;

}

}

File: p30f4011.h (samo deo) ...... /* ------------------------------ */

Page 8: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

8

/* I/O Ports register definitions */

/* ------------------------------ */

/* TRISB: Port B Direction Control Register */

extern volatile unsigned int TRISB __attribute__((__near__));

typedef struct tagTRISBBITS {

unsigned TRISB0 :1;

unsigned TRISB1 :1;

unsigned TRISB2 :1;

unsigned TRISB3 :1;

unsigned TRISB4 :1;

unsigned TRISB5 :1;

unsigned TRISB6 :1;

unsigned TRISB7 :1;

unsigned TRISB8 :1;

unsigned :7;

} TRISBBITS;

extern volatile TRISBBITS TRISBbits __attribute__((__near__));

/* PORTB: Port B Pin Register */

extern volatile unsigned int PORTB __attribute__((__near__));

typedef struct tagPORTBBITS {

unsigned RB0 :1;

unsigned RB1 :1;

unsigned RB2 :1;

unsigned RB3 :1;

unsigned RB4 :1;

unsigned RB5 :1;

unsigned RB6 :1;

unsigned RB7 :1;

unsigned RB8 :1;

unsigned :7;

} PORTBBITS;

extern volatile PORTBBITS PORTBbits __attribute__((__near__));

/* LATB: Port B Latch Register */

extern volatile unsigned int LATB __attribute__((__near__));

typedef struct tagLATBBITS {

unsigned LATB0 :1;

unsigned LATB1 :1;

unsigned LATB2 :1;

unsigned LATB3 :1;

unsigned LATB4 :1;

unsigned LATB5 :1;

unsigned LATB6 :1;

unsigned LATB7 :1;

unsigned LATB8 :1;

unsigned :7;

Page 9: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

9

} LATBBITS;

extern volatile LATBBITS LATBbits __attribute__((__near__));

......

1.4.3. Rešenje zadatka 2 - Treperenje LED (čekanjem u petlji), program pisan u asembleru

;PROGRAM: Blink_LED_petlja asm ;OPIS : Inicijalizuje portove mikrokontrolera. Blinka jednu LED tako sto ceka da prodje neko vreme

; vrteci se u glavnoj petlji

;-------------------------------------------------------------------------------------------------------------------------------

__reset:

;Inicijalizacija PORTF, biti 0-6 (cisto digitalni port)

mov #0xfffe, W0 ;na PORTF, na RF0 LED, ostali pinovi ostaju

;ulazni

mov W0, TRISF

mov #0xffff, W0

mov #0x000f, W1

;Glavni program

cekaj: dec W0,W0 ;unutrasnja petlja. Dec instrukcijom Z flag

;pogodjen

bra NZ, cekaj

dec W1,W1 ;spoljna petlja

bra NZ, cekaj

btg PORTF,#0 ;menjaj stanje LED na RE0

mov #0x000f, W1

bra cekaj

1.4.4. Rešenje zadatka 2 - Treperenje LED (čekanjem u petlji), program pisan u "C"-u

/************************************************************************************/

/* PROGRAM: Primer 2: Blink_LED_petlja "C" */

/* OPIS : Inicijalizuje portove mikrokontrolera. Blinka jednu LED tako sto ceka da prodje neko vreme */

/* vrteci se u glavnoj petlji */

/************************************************************************************/

// Ukljucivanje potrebnih zaglavlja

#include <p30f4011.h>

// Definicije konstanti

#define CONSTANT_TIME 500000 // broj ciklusa vrtenja u petlji

#define LED1 LATFbits.LATF0 // LED1

Page 10: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

10

// Deklaracije globalnih promenljivih

unsigned int var_global = 0; // primer promenljive

// Funkcija za inicijalizaciju IO periferije

void IO_Init(void)

{

// Inicijalizacija PORTF, biti 0-6 (cisto digitalni port)

TRISF = 0xfffe; // na RF0 LED, ostali pinovi ostaju ulazni

}

/*************************/

/*** GLAVNI PROGRAM ***/

/*************************/

int main(void)

{

unsigned long i; // lokalna promenljiva

IO_Init();

// inicijalizuj IO pinove

// beskonacna petlja

while(1)

{

for (i=0; i<CONSTANT_TIME; i++); // vrti se u petlji

LED1 = 1;

for (i=0; i<CONSTANT_TIME; i++); // vrti se u petlji

LED1 = 0;

}

}

1.4.5. Rešenje zadatka 3 - Treperenje LED (sa timer-om), program pisan u asembleru

;PROGRAM: Blink_LED_timer asm ;OPIS : Inicijalizuje portove mikrokontrolera. Blinka jednu LED pomocu tajmera

;----------------------------------------------------------------------------------------------------------

__reset:

;Inicijalizacija PORTF, biti 0-6 (cisto digitalni port)

mov #0xfffe, W0 ;na RF0 LED, ostali pinovi ostaju ulazni

mov W0, TRISF

;Inicijalizacija TIM1 - 1 sekunda

clr T1CON ;Iskljuci tajmer

clr TMR1 ;Start tajmera od 0

mov #0x0030,W0 ;1:256 prescaler

mov W0, T1CON

mov #FCY/256,W0 ;vrednost period registra za 1 sekundu

Page 11: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

11

;(FCY/256 = 31250 sto staje u 1 registar)

mov W0, PR1

bset IEC0,#T1IE ;dozvoli tim interapt

bset T1CON,#TON ;startuj tajmer

;Glavni program ;ne radi nista

main:

bra main

;------------------------------------------------------------------------------

__T1Interrupt:

btg LATF,#0 ;obrni stanje LED

bclr IFS0, #T1IF ;Obrisi Timer1 interapt flag

retfie

1.4.6. Rešenje zadatka 3 - Treperenje LED (sa timer-om), program pisan u "C"-u

/************************************************************************************/

/* PROGRAM: Primer 3: Blink_LED_timer "C" */

/* OPIS : Inicijalizuje portove mikrokontrolera. Blinka jednu LED pomocu tajmer */

/************************************************************************************/

// Ukljucivanje potrebnih zaglavlja

#include <p30f4011.h>

#include <timer.h>

// izbor odgovarajuceg moda oscilatora:

_FOSC(CSW_FSCM_OFF & XT_PLL4); // kristal je 8MHZ -> DSP radi na 8MIPS-a

// Definicije konstanti

#define FREQUENCY 8000000 // instrukcijski takt DSP-a (8MIPS-a)

#define TIM1_PERIOD FREQUENCY/256 // punjenje za period registar timera1 (1:256)

#define LED1 LATFbits.LATF0 // LED1

// Deklaracije globalnih promenljivih

unsigned int var_global = 0; // primer promenljive

// Funkcija za inicijalizaciju IO periferije

void IO_Init(void)

{

// Inicijalizacija PORTF, biti 0-6 (cisto digitalni port)

TRISF = 0xfffe;

// na PORTF, na RF0 LED, ostali pinovi ostaju ulazni

}

// Funkcija za inicijalizaciju timera1

void Timer1Init()

{

Page 12: Priprema_za_lab_1 NOVO.pdf

Primena mikroprocesora u elektroenergetici – laboratorijski praktikum vežba 1

12

// zabrani interrupt, zaustavi timer, obrisi timer flag (T1IE, T1ON, T1IF = 0):

CloseTimer1();

// nivo prioriteta, interrupt enable (T1IP = 7, TIE = 1):

ConfigIntTimer1(T1_INT_PRIOR_7 & T1_INT_ON);

// prescaler 1:256, TIM1 broji 0-CONSTANT_TIM1_PERIOD taktova DSP-a (T1CON =

//0xE030, PR1 = TIM1_PERIOD):

OpenTimer1(T1_ON & T1_GATE_OFF & T1_IDLE_STOP & T1_PS_1_256 &

T1_SOURCE_INT, TIM1_PERIOD);

}

/*************************/

/*** GLAVNI PROGRAM ***/

/*************************/

int main(void)

{

unsigned long i; // lokalna promenljiva

IO_Init(); // inicijalizuj IO pinove

Timer1Init(); // inicijalizuj timer

// beskonacna petlja

while(1)

{

// ne radi nista

}

}

// TIMER1 interrupt routine

void __attribute__((__interrupt__)) _T1Interrupt(void)

{

if (LED1 == 0) // toggle LED

LED1 = 1;

else

LED1 = 0;

IFS0bits.T1IF = 0; // brisi int flag

}