Pozdrav,
pre svega cestitam na izboru programatora i PIC-a, uzeo si vrlo fine spravice, videces vec kad budes krenuo nesto "ozbiljnije" da radis ...
Ne znam odakle da pocnem ali ajd ovako za uvod da napravim mali osvrt samomg tog dsPIC, njegove dobre a i neke lose osobine.
U pitanju je vrlo mocan/brz (70 MIPS) 16bitni RISC mikrokontroler, tacnije digitalni signalni kontroler (DSC) sa 128KB flash memorije prvenstveno namenjen za napredno analogno/digitalno procesiranje signala. Takva vrsta procesiranja je uglavnom potrebna za brze i kompleksne procese kojie cesto vidjaju u sklopovima za kontrolu brzine motora (razni tipovi) kao i kod prekidackih napajanja (SMPS). Naravno moze i za bilo kakve druge vrste skopova ali za ove dve oblasti se u tom dsPIC nalaze neki specificni moduli koji drasticno olaksavaju pisanje programa i hardwersku implementaciju. Sto se kaze, "natridzeni" su za te primene.
Tu se izdvajaju dva bitna modula, prvi, vrlo brz A/D konverter sa 12bit rezolucijom i brzinom uzorkovanja od 500KSPS (500.000 uzoraka u sekundi) ili ako se izabere/konfigurise druga opcija, 10bit sa 1MSPS (milion uzoraka u sekundi). Ovo je neophodno, kao sto spomenuh, za brze procese koje se desavaju kod Motor Control aplikacija (otuda u oznaci ono "MC").
Sa druge strane ako se ne bavimo tako brzim procesima vec nekim dosta sporijim, ta brzina uzorkovanja nam omogucava da signal "izmerimo" ne jednom nego dosta vise puta u nekoj jedinici vremena i kasnije vrlo prostom matematikom (sabiranje i deljenje) uradimo "ujednacavanje" sto dovodi do toga da dobijemo dosta realniji rezultat merenje, cak je moguce dobiti i vecu rezoluciju merenja, npr ako bi radili 256 puta vise uzorkovanja moguce je povecati rezoluciju za citavih 4 bita. Taj proces se zove "oversampling" i vise o njemu mozes procitati u raznim tehnickim publikacijama, nevezano za ovaj konkretan MCU. Takodje na ovaj nacim se moze uprostiti analogni ulazni deo (front-end) jer nije potrebno dodatno analogno filtriranje signala pre ulaza u sam dsPIC.
Drugi modul koji izdvaja ovu seriju dsPIC-ova od ostalih "braca" je njegov napredni PWM modul. PWM je skracenica od "pulsno sirinske modulacije" (Pulse-width modulation).
Da ne ulazim u objasnjavanje te PWM price, o tome mozes procitati opet u gomili raspolozivih tehnickih publikacija. Ono sto je bitno ovde spomenuti je to da imamo na raspolaganju jako brz i precizan PWM modul / generator sa dodatnim pod sklopovima oko njega opet vrlo zgodnih za MC i SMPS primene.
Posto taj PWM modul mozemo da posmatramo, izmedju ostalog, i kao digitalno/analogni konverter (D/A), njegova rezolucija/brzina nam daje mogucnost za generisanje dosta preciznijeg analognog napona. To ces vec videti kada se budes dotakao te problematike.
Posto je u pitanju vrsta DSP mikrokontrolera (Digital signal processing), to znaci da on u sebi ima vrlo brz modul za matematiku. Gore spomenute MC i SMPS aplikacije zahtevaju vrlo slozene matematicke racune i zbog toga je neophodno imati specificne module koji te matematicke operacije mogu odraditi najcesce u jednoj instrukciji, neke jos slozenije operacije zahtevaju naravno vise instrukcija ali u poredjenju sa ostalim mikrokontrolerima ovaj dsPIC moze to odraditi drasticno brze. Naravno opet te mogucnosti mozemo iskoristiti za bilo koju drugu namenu nevezano za ove oko MC i SMPS.
Ostali moduli poput SPI, I2C, UART i slicni su klasika koja se vidja prakticno sad na svim modernim mikrokontrolerima i necu ulaziti u dublju pricu oko toga. Taj dsPIC to sve ima.
Ono sto je (po meni) mana je sto nema USB modul. Medjutim to je do nekle i logicno (mada nebi nista falilo da ga ima) jer MC i SMPS aplikacije su vrlo specificne jer se uglavnom radi sa nekim viskom naponima, velikim strujama i snagama, dakle neki uredjaji koji nisu bas "za poneti" i da stoje na stolu pored racunara prikljuceni na USB :)
Druga mana je sto nema DCI modul a koja neka druga "braca" imaju, modul koji sluzi za kodiranje i dekoriranje raznih Audio protokola poput S/PDIF ili AES3.
----
Oko programiranja, huh, ne mogu to sve tako ukratko i sazeto da prepricam. Uglavnom, programiranje ovog ili bilo kog drugog MCU se svodi na isto. Najcesce se programi pisu u jeziku C / C++ pa je poznavanje istih neophodno. Naravno postoje opcije i za druge jezike ali su ovi standard i za njih ima detaljno objasnjenje, primera, kompajlera itd.
Za ovaj konkretan dsPIC je trenutno najzgodniji XC32 kompajler koji mozes naci na Microchip-ov sajtu. Taj kompajler se nudi i u potpuno besplatnoj verziji koja je skroz funkcionalna, bez ogranicenja na velicinu coda ili nekih drugih limita. Postoji Pro verzija ali ona ima samo neku dodatnu optimizaciju izvrsnog code-a koja dovodi do manjeg zauzeca memorije ali obzirom da ovde imamo 128KB memorije to uopste ne predstavlja neki bitan faktor.
Dakle kompajler XC32 je posebna prica i nije vezana za sam IDE (Mplab-X), znaci mora se nezavistno skinuti i instalirati.
Kao vrlo fin i sazet prirucnik oko ovog programiranja bih ti preporucio da nabavis ovu knjigu:
http://www.infoelektronika.net/knjiga/n=pic-c
----
U vezi Mplab-X, postoji gomila upustva oko toga na YouTube, evo prvih par koje sam nasao:
http://www.youtube.com/watch?v=iZuucxaAVLg
http://www.youtube.com/watch?v=Jorqs469QoE
----
Za kraj evo i jedan primer za "blinkanje" LED koji koristi tajmer za generisanje pauze izmedju ON / OFF stanja.
Ja se izvinjavam sto primer nije jos prostiji nego je sa tajmerima, probao sam bez njega i nesto me je zekilo pa sam napravio ovakvu verziju.
Proverio kod mene i radi. LED se pali/gasi na odprilike svakih 0.5 sekundi.
LED je prikljucena na nozicu 14 preko otpornika od 390ohm ka masi, isto kao na shemi na sledecem linku.
Na shemi se vidi i kako je realizovano napajanje od 3.3V, gde se prikljucuje programator, MCLR (reset) deo, decoupling kondenzatori za dsPIC, ostalo sa sheme je nebitno.
http://yu3ma.net/wp/wp-content...U3MA-Digital-ClassD-AMP-r3.pdf
Sve sto ti nije jasno slobodno pitaj ...
Code:
//Blinky LED primer za dsPIC33EPxxxMC502 pomocu tajmera
#include <xc.h> //glavni include
//Konfiguracija
#pragma config FNOSC = FRCPLL //RC oscilator sa PLL (FRCPLL)
#pragma config PWMLOCK = OFF //Iskljuci PWMLOCK!!!
#pragma config FWDTEN = OFF // Iskljuci WDT
#pragma config JTAGEN = OFF // Iskljuci JTAG (da bi radio RB5)
#pragma config ICS = PGD3 // Prebaci se na treci port za debugiranje (programiranje sam skonta)
//Prototip funckije za interapt
void __attribute__((__interrupt__, __auto_psv__)) _T2Interrupt(void);
//Funckija koja obraduje interapt/prekid za Tajmer2
void __attribute__((__interrupt__, __auto_psv__)) _T2Interrupt(void) {
//Ocisti Timer 2 interrupt flag
_T2IF = 0;
//Togluj tj invertuj stanje (ON/OFF) za RB5
_LATB5 = 1 - _LATB5;
}
//glavna startna funkcija
int main(void)
{
//Za mskimalnu brzinu procesora je potrebno ovo uraditi
_PLLDIV = 256;
_PLLPOST = 1;
_PLLPRE = 2;
//Sacekaj dok se oscilator ne stabilise (zakljuca PLL)
while(_LOCK == 0);
//Definicija izlaznog porta
//Za primer koristimo samo RB5 - nozica broj 14
//Na tu nozicu je preko otpornika od 390ohm vezana LED ka masi
TRISBbits.TRISB5 = 0; //0 znaci da je izlaz
//postavimo pocetno stanje za RB5 da bude logicka nula (ugasen LED)
_LATB5 = 0;
/* -------------- TAJMER2 -------------------------- */
T2CON = 0; // Clear Timer 2 configuration
T2CONbits.TCKPS = 3; // Set timer 2 prescaler (0=1:1, 1=1:8, 2=1:64, 3=1:256)
PR2 = 58594; // Set Timer 2 period (max value is 65535)
_T2IP = 3; // Set Timer 2 interrupt priority
_T2IF = 0; // Clear Timer 2 interrupt flag
_T2IE = 1; // Enable Timer 2 interrupt
T2CONbits.TON = 1; // Turn on Timer 2
//Beskonacna petlja
while(1)
{
//Ovde se program vrti i ne radi nista
//Tajmer 2 ce praviti interapt/prekid koji ce na odredjeni vremenski
//period (definisan iznad) da pali/gasi RB5 tj nasu prikljucenu LED
}
}