280 likes | 566 Views
Primena mikrokontrolera. 2011. Nenad Jovičić, nenad @ etf.rs PART 2. Serijski portovi – klasa Serial http://mbed.org/handbook/SerialPC.
E N D
Primena mikrokontrolera 2011. NenadJovičić, nenad@etf.rs PART 2.
Serijski portovi – klasa Serialhttp://mbed.org/handbook/SerialPC • Klasa Serial se koristi za korišćenje bilo kog serijskog porta LPC1768 uključujući i onog koji se koristi za vezu preko USB prema PC-ju. U tom slučaju koristi se UART0 i cela komunikacija prelazi preko specijalnog čipa za vezu. #include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx int main() { pc.printf("Hello World!\n"); }
Serijski portovi • Osim funkcije printf() koja se standardno koristi za prenos preko serijskog porta moguće je koristiti i funkcije koje su orjentisane ka prenosu karaktera. #include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx PwmOut led(LED1); float brightness = 0.0; int main() { pc.printf("Press 'u' to turn LED1 brightness up, 'd' to turn it down\n"); while(1) { char c = pc.getc(); if((c == 'u') && (brightness < 0.5)) { brightness += 0.01; led = brightness; } if((c == 'd') && (brightness > 0.0)) { brightness -= 0.01; led = brightness; } } }
Zadatak 1 • Napisati program koji korišćenjem serijskog porta prima sa računara jednocifren broj i ispisuje ga na sedmosegmentnom LED displeju. • Brzina komunikacije treba da bude 19200 bit/s. • Istovremeno sa uključivanjem displeja poslati broj treba da određuje i periodu PWM signala koji se šalje na diodu LED1. Osnovna učestanost PWM signala treba da bude 100 Hz. • Program realizovati korišćenjem funkcije getc().
Korišćenje prekidahttp://mbed.org/cookbook/Serial-Interrupts • Osnovna mana funkcija kao što su printf() i scanf() je to što se program praktično zaglavljuje u tim funkcijama sve dok traje prenos podataka. • Jedan od načina obezbeđivanja “pozadinske obrade” je korišćenje prekida. • Klasa Serial dozvoljava povezivanje korisničkih funkcija za dva tipa prekida: Rx i Tx. #include "mbed.h" Serial pc(USBTX, USBRX); PwmOut led(LED1); void UserInterrupt (void){ led=(float)pc.getc()/255; }; int main() { pc.attach(&UserInterrupt, Serial::RxIrq); while (1);//glavni program ne radinista, tj. slobodan je za NESTO }
Analogni ulazihttp://mbed.org/handbook/AnalogIn • LPC1768 poseduje 12-bitni 8-kanalni AD konvertor. 6kanala je dostupno na pinovima MBED-a. Direktno upravljanje AD konvertorom zahteva konfigurisanje nekoliko kontrolnih registara. • Upotrebom klase AnalogIn koja je sastavni deo MBED biblioteke jednostavno se konfiguriše AD konvertor i dobija rezultat konverzije. //Turn on a LED when AnalogIn goes above 0.3 #include "mbed.h" AnalogInain(p20); DigitalOut led(LED1); int main() { while (1){ if(ain > 0.3) { led = 1; } else { led = 0; } } }
Zadatak 2 • Napisati program kojim se vrši AD konverzija na kanalu na koji je priključen potenciometar. • Rezultat AD konverzije treba da određuje periodu PWM signala na diodi LED1, čija je osnovna učestanost 100Hz. • Osim toga intenzitet treba da se očitava i na sedmosegmentnom LED displeju. • Konačno, nakon svake konverzije potrebno je poslati serijskim putem poruku koja će na računaru da se manifestuje kao BARGRAPH. • Na primer intenzitet 30-40% odgovara poruci xxx, dok intenzitet 40-50% odgovara prouci xxxx. • Da bi se nakon svake poruke prešlo u novi red potrebno je dodati kao poslednje karaktere /n/r.
Analogni izlazi • LPC1768 poseduje DA konvertorsa 10-bitnomrezolucijom. • U MBED razvojnomokruženju pristupa mu se preko klase AnalogOut na vrlo jednoatvan način. • #include "mbed.h” • AnalogOut signal(p18); • int main() { • while(1) { • for(float i=0.0; i<1.0; i+=0.1) { • signal = i; • wait(0.0001); • } • } • }
Organizacija programa • Svaki ozbiljan program namenjen upravljanju nekim realnim procesom poseduje sledeće celine: • inicijalizacija na poečtku glavnog programa, • petlja glavnog programa, • prekid sistemskog časovnika, • prekidi koji obezbeđuju efikasnu komunikaciju sa periferijama.
Sistemski časovnik http://mbed.org/handbook/Ticker • Klasa Ticker daje jednostavan način realizacije periodičnog poziva korisničke funkcije, što praktično predstavlja sistemski časovnik.
Ticker - primer programa #include "mbed.h" Ticker flipper; DigitalOutled1(LED1); DigitalOutled2(LED2); void flip() { led2 = !led2; } intmain() { led2 = 1; flipper.attach(&flip, 2.0); // the address of the function to be attached (flip) //and the interval (2 seconds) // spin in a main loop. flipper will interrupt it to call flip while(1) { led1 = !led1; wait(0.2); } }
Povezivanje sa funkcijom članicom neke klase • #include "mbed.h" • // A class for flip()-ing a DigitalOut • class Flipper { • public: • Flipper(PinName pin) : _pin(pin) { • _pin = 0; • } • void flip() { • _pin = !_pin; • } • private: • DigitalOut _pin; • }; • DigitalOut led1(LED1); • Flipper f(LED2); • Ticker t; • int main() { • t.attach(&f, &Flipper::flip, 2.0); // the address of the object, member function, and interval • // spin in a main loop. flipper will interrupt it to call flip • while(1) { • led1 = !led1; • wait(0.2); • } • }
Zadatak 3 • Modifikovati Zadatak 2 korišćenjem klase Ticker tako da se očitavanje analognog ulaza i slanje poruka na računar izvršava frekvencijom od 10Hz.
Klasa Timeouthttp://mbed.org/handbook/Timeout • Klasa Timeout se koristi kada je potrebno generisati akciju nakon isteka određenog vremena. • Praktično ima isti interfejs kao klasa Ticker, ali se izvršava samo jedan interval.
Timeout • #include "mbed.h" • Timeout flipper; • DigitalOut led1(LED1); • DigitalOut led2(LED2); • void flip() { • led2 = !led2; • } • int main() { • led2 = 1; • flipper.attach(&flip, 2.0); // setup flipper to call flip after 2 seconds • // spin in a main loop. flipper will interrupt it to call flip • while(1) { • led1 = !led1; • wait(0.2); • } • }
Klasa Timer – merenje vremenahttp://mbed.org/handbook/Timer • Klasa koja može da se koristi prilikom testiranja za merenje vremena.
Timer -primer • #include "mbed.h" • Timer t; • int main() { • t.start(); • printf("Hello World!\n"); • t.stop(); • printf("The time taken was %f seconds\n", t.read()); • } Zadatak 4 • Korišćenjem klase Timer izmeriti performanse AD konvertora, tj. klase AnalogIn. Ideja za preciznije merenje je ponavljanje akvizicije više puta, pa naknadno usrednjavanje.
Sat realnog vremena - RTChttp://mbed.org/projects/libraries/api/mbed/trunk/rtc_time • Sat realnog vremena je realizovan kao periferija unutar LPC1768 i omogućava precizno merenje vremena i u režimima smanjene potrošnje čipa, tj. low power modovima. • Za podršku su kreirane MBED funkcije.
RTC • #include "mbed.h" • int main() { • set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37 • while(1) { • time_t seconds = time(NULL); • printf("Time as seconds since January 1, 1970 = %d\n", seconds); • printf("Time as a basic string = %s", ctime(&seconds)); • char buffer[32]; • strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); • printf("Time as a custom formatted string = %s", buffer); • wait(1); • } • }
Lokalni Fajl Sistem • MBED biblioteka omogućuje pristup lokalnom Flahs disku na MBED pločici kreiranjem objekta tipa LocalFileSystem. • #include "mbed.h” • LocalFileSystem local("local"); • int main() { • printf("Hello World!\n"); • wait(5.0); • printf("Opening File...\n"); // Drive should be marked as removed • FILE *fp = fopen("/local/test.txt", "w"); • if(!fp) { • fprintf(stderr, "File /local/test.txt could not be opened!\n"); • exit(1); • } • wait(5.0); • printf("Writing Data...\n"); • fprintf(fp, "Hello World!"); • wait(5.0); • printf("Closing File...\n"); • fclose(fp); • // Drive should be restored. this is the same as just returning from main • wait(5); • }
Zadatak 5 • Modifikovati Zadatak 3, tako da se umesto slanja podataka serijskim putem vrši snimanje podataka u tekstualni fajl na lokalnom flash disku. • Učestanost akvizicije treba da bude 1kHz. • Da bi se ograničila veličina fajla potrebno je izvršiti konačan broj merenja. Na primer 10,000. • Vršiti akviziciju 2 kanala. Na oba kanala dovoditi isti signal sa jednog potenciometra. • U toku akvizicije jedna LE didoa treba da bude uključena. • Podaci u fajlu treba da budu u formi pogodnoj za očitavanje u MATLAB-u, a to je na primer csv fajl: 120,550 123,530 160,400 ...... • Podaci se u MATLAB-u jednostavno očitavaju funkcijom: • M = csvread(‘F:\local\userfile.csv', 0, 0);
Zadatak 6 • Implementirati i istestirati projekat povezivanja digitalnog kompasa HMC5834 na MBED. • Koristiti dizajn opisan na stranici: • http://mbed.org/cookbook/HMC5843-Digital-Compass