1 / 27

Primena mikrokontrolera

Primena mikrokontrolera. 2011. Nenad Jovičić, nenad @ etf.rs PART 2. Serijski portovi – klasa Serial http://mbed.org/handbook/SerialPC.

mizell
Download Presentation

Primena mikrokontrolera

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Primena mikrokontrolera 2011. NenadJovičić, nenad@etf.rs PART 2.

  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"); }

  3. Klasa Serial - funkcije

  4. 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; } } }

  5. Serijski protovi – testiranje korišćenjem Hyper Terminal-a

  6. 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().

  7. 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  }

  8. 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; } } }

  9. AnalogIn - funckije

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

  11. 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); • } • } • }

  12. Klasa AnalogOut

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

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

  15. 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); } }

  16. 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); • } • }

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

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

  19. 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); • } • }

  20. Klasa Timer – merenje vremenahttp://mbed.org/handbook/Timer • Klasa koja može da se koristi prilikom testiranja za merenje vremena.

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

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

  23. 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); • } • }

  24. 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); • }

  25. 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);

  26. I2C kontrolerhttp://mbed.org/handbook/I2C

  27. Zadatak 6 • Implementirati i istestirati projekat povezivanja digitalnog kompasa HMC5834 na MBED. • Koristiti dizajn opisan na stranici: • http://mbed.org/cookbook/HMC5843-Digital-Compass

More Related