Programiranje PIC Mikrokontrolera Assemblerom

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
Dzenny_assembly
Napredujem
Napredujem
Posts: 118
Joined: 11-09-2014, 04:03

Programiranje PIC Mikrokontrolera Assemblerom

Post by Dzenny_assembly »

Pozdrav!

Otvaram post u kojem ču pisati o programiranju PIC mikrokontrolera assemblerom. Krenuti odmah od opisa pojedinih instrukcija i primjera mi nije baš logično jer, iako se večina teorije nalazi na netu opet je najviše onih kojima je to daleko od razumljivog. Naravno največi uzrok je nedovoljna zainteresiranost pa tako i ovo o čemu ču govoriti mnogima neče biti zanimljiva i privlačna tema. Kako god, ipak je najbolje krenuti od početka pa šta se kome svidi neka čita. Potrudit ču se da svaki veči dio texta ima svoj naziv radi preglednosti i lakšeg pronalaženja. Govorit ču samo o PIC familiji Mikrokontrolera i njihovom načinu programiranja isključivo assemblerom. Vidim da su kolege dosta pisale o PIC-ovima ATMEL-u i njihovom načinu programiranja u svim jezicima. Medžutim koliko sam upratio slabo je pisano o PIC-ovima i assembleru pa bih ovaj post htio posvetiti tome. Imam dosta primjera koje sam prije pisao i isprobavao na matadoru pa bi ih htjeo ovdje iznijeti i obijasniti kako sam ja riješavao pojedine probleme na koje sam nailazio. Da napomenem, nisam nikakav profesor ni stručnjak nego jednostavno zaljubljenik u Mikrokontrolere! Nakon uvoda krenut ču sa opisivanjem izabranog Mikrokontrolera i osnovama koje su svakome potrebne za dalji rad. Velika večina maksimalno izbijegava assembler a razlog je jednostavan, jednu instrukciju u nekom večem programskom jeziku čini nekoliko assemblerskih. I laik zaključuje da za odredženu rutinu programski kod neče biti isti, tj. u assembleru če biti mnogo veči, složeniji pa samim tim i teži za razumijeti. Medžutim u assembleru se mogu napisati mnogo brže rutine koje takodže zauzimaju manje programske i RAM memorije. Največa prednost (ili nedostatak, zavisno od aspekta gledanja) assemblera je što nas tjera da upoznamo unutrašnju strukturu kontrolera sa kojim radimo, ali kad naučimo programirati jedan kontroler u assembleru naučili smo ih sve. Takodže nam nije nikakav problem raditi i sa drugim familijama jer poznajemu osnovnu strukturu na kojoj se bazira rad svih Mikrokontrolera. Assembler jeste neudoban, medžutim kada jednom savladamo sve njegove mane i nedostatke tek tada shvatamo koliko je kontroler zaista močna sprava te da je programska i RAM memorija (naročito početnicima) i više nego dovoljna.

Kontroler na kojem ču obijašnjavati primjere je PIC16F84A.
PIC16F84A.jpg
PIC16F84A.jpg (31.82 KiB) Viewed 18489 times
Osnovne karakteristike PIC16F84A
- 8-bitni Mikrokontroler
- 1kb Programske memorije
- 68 bayta RAM memorije
- 14-to bitne instrukcije, 8-bitni podaci
- 8 nivoa stack memorije
- 13 Ulazno izlaznih linija za korištenje
- Maximalna frekvencija rada 20MHz

Ovo je kontroler na kojem sam i ja učio i dobar je za početnike jer ima dovoljan broj ulazno - izlaznih pinova za domonstraciju večine primjera a od dodatnih periferija ima samo jedan Tajmer što ga čini pogodnim za učenje i osnovu.




A sad ispočetka...

Ovako je sve počelo!
1969-e godine u SAD je stigla ekipa japanskih inženjera da se po njihovim projektima izradi nekoliko integrisanih kola. Zahtjev su postavili firmi INTEL, a od strane intela za projekat je bio zadužen Marcian Hoff. S obzirom da je on več imao iskustva sa sličnim projektima na pamet mu je palo sasvim drugačije riješenje koje je značilo da se funkcija integrisanog kola odredžuje programom smiještenim u njemu. To je bilo mnogo genijalnije riješenje, medžutim takav sklop je zahtijevao više memorije što u to vrijeme nije bilo lahko izvesti. Nakon nekog vremena, u kojem su japanski inženjeri pokušavali pronači bolje i jednostavnije riješenje, pobijedila je Marcianova ideja i tako je nastao prvi mikroprocesor. To je bio prvi
4-bitni mikroprocesor sa brzinom od 6000 instrukcija u sekundi pod nazivom 4004.
INTEL 4004_1.jpg
INTEL 4004_1.jpg (42.72 KiB) Viewed 18489 times
INTEL 4004_2.jpg
INTEL 4004_2.jpg (22.18 KiB) Viewed 18489 times
Nedugo nakon toga firma CTC zahtijeva od Intela i Texas Instrumenrs-a da proizvedu 8-bitni mikroprocesor. Iako je CTC u medžuvremenu odustao od zahtijeva Intel i Texas Instruments nastavljaju sa radom i u aprilu 1972 godine na tržište iznose prvi 8-bitni mikroprocesor pod nazivom 8008 koji je mogao adresirati do 16Kb memorije, razumio 45 naredbi i imao brzinu od 300 000 instrukcija u sekundi.
Intel 8008_1.jpg
Intel 8008_1.jpg (20.25 KiB) Viewed 18489 times
Intel 8008_2.jpg
Intel 8008_2.jpg (51.86 KiB) Viewed 18489 times
Taj mikroprocesor je bio predhodnik svih današnjih. Večina današnjih mikrokontrolera sa kojima radimo je 8-bitna i to je standard kada su u pitanju podaci sa kojima se radi pa je tako nastala skračenica Bajt koja podrazumijeva 8 bita odnosno 256 mogučih stanja.

Nastavit če se...
Dzenny_assembly
Napredujem
Napredujem
Posts: 118
Joined: 11-09-2014, 04:03

Re: Programiranje PIC Mikrokontrolera Assemblerom

Post by Dzenny_assembly »

Bit i Bajt

Da bi smo najbolje razumijeli šta je to bajt prvo moramo shvatiti šta je bit. Za pohranjivanje brojeva u računaru služe elekektronski sklopovi sačinjeni od tranzistora dioda i otpornika i nazivaju se bistabili. Bistabili su sklopovi koji mogu zauzeti samo dva stanja 0 ili 1 tj. na njihovom izlazu možemo dobiti plus ili minus pol napajanja. U elektronici osam bistabila poredanih jedan do drugog čine jedan registar pa tako u teoriji bistabile nazivamo bitovima a osam bitova jednog do drugo bajtom. Inženjeri su se služili raznim nazivima kako bi sebi olakšali programiranje pa se tako javio i pojam Nibl. Nibl je ustvari jedna polovina bajta.
Nibl.jpg
Nibl.jpg (14.82 KiB) Viewed 18486 times
Nekadašnji način programiranja

U samim počecima razvoja računarskih sistema postojali su na papir zapisani binarni brojevi koji su predstavljali neko značenje tj. neku instrukciju. Oni koji su s tim radili su imali velike poteškoče, stalno preturanje po papirima, program neradi kako treba neka instrukcija ili je pogrešno napisana ili je greška u samom algoritmu programa, po stoti put pregledan jedan te isti program pokušavajuči uočiti grešku... ukratko bilo je gadno! Koliko je gadno bilo najbolje čemo shvatiti iz sljedečeg primjera. Na slici ispod su dva niza binarnih brojeva a razlika je samo u jednom redu. Pokušajte nači u kojem!
Binarni brojevi, razlika.jpg
Binarni brojevi, razlika.jpg (52.52 KiB) Viewed 18486 times
Kao što vidite razliku nije nimalo jednostavno nači. Zamislite ovakav niz od nekoliko hiljada binarnih brojeva u kojem trebate nači razliku ili više njih! Problem je više nego očigledan. Nepreglednost, veoma brzo se zavrti u glavi, lako se desi da se preskoči neki red...itd. Pored svih nabrojanih muka mora se voditi računa o ideji programa tj. redosljedu pisanja instrukcija. Ako je neka instrukcija pravilno napisana to neznači da če program raditi ispravno. Prvo a samim tim i logično riješenje, koje se i samo nametalo, je bilo da se svi ti brojevi zamijene riječima koje za čovijeka imaju neko značenje. I tako je nastao prvi programski jezik Assembler. Svi dotadašnji brojevi su zamijenjeni riječima od kojih je svaka imala svoje značenje. Naravno za takvo nešto je morao postojati računar sa odgovarajučim softverom koji če sve te riječi konvertovati u binarne brojeve. Takvu vrstu softvera danas nazivamo Kompajlerom. U principu, assembler nije jezik nego više neka vrsta matrice ili konvertora izmedžu riječi i brojeva. Dakle, Assembler je jedini alat koji odvaja čovijeka (programera) od gomile brojeva koji za Mikrokontroler imaju odredženo značenje. I da...na predhodnoj slici razlika je u dvanaestom redu. :)




Šta je to Mikrokontroler?

Mikrokontroler je čip u kojem su smiješteni svi elektronski krugovi koji su potrebni da bi smo dobili jedan računarski sistem. Postoje četri osnovna sklopa unutar čipa koji su potrebni da bi smo ga mogli zvati računarom a to su: CPU, Programska memorija, RAM memorija i ulazno - izlazni portovi. Da bi smo bolje razumjeli navest ču primjer. Za riješenje nekog matematičkog zadataka potrebno nam je: Mozak (CPU), formula po kojoj čemo voditi postupak (Prog. Mem.) i papir na koji čemo to sve zapisivati (RAM). Kada ispunjavamo ova tri uslova onda se možemo upustiti u riješavanje bilo kojeg zadatka. Jednostavno, u glavi možemo vršiti neke osnovne operacije sabiranja i oduzimanja manjih iznosa baš kao što može i procesor. Ako imamo neki složeniji zadatak potrebna nam je formula na osnovu koje čemo pravilnim redosljedom unositi podatke i doči do riješenja. Baš tako radi i procesor, iz programske memorije pravilnim redosljedom dobija instrukcije koje mu "govore" šta treba raditi sa odredženim podacima. Naravno u toku riješavanja zadatka javljaju nam se neki ostaci ili brojevi koje bi trebali zapamtiti ili zapisati sa strane pa ih kasnije dodati na pravo mijesto da bi zadatak bio uspiješno riješen. Mi za takvo nešto koristimo papir i olovku a Mikrokontroler RAM memoriju na koju smiješta podatke i medžurezultate do kojih dolazi u toku rada. Da bi smo na nekog prenijeli dobijeni rezultat mi to možemo na više načina, medžutim Mikrokontroler ima samo jedan a to su ulazno - izlazni portovi. Najjednostavnije rečeno portovi su izvodi na kontroleru koje lemimo na pločicu. Svaki port je veličine jednog bajta tj. 8 izvoda preko kojih kontroler komunicira sa okolinom. Dakle, sve gore nabrojano su osnovni elementi jednog računarskog sistema. Od početka pa do danas Mikrokontroleri, kao i sve ostalo, su evoluirali tako da svaki pored gore nabrojanih sklopova u sebi imaju integrisane i druge dodatne kao što su: Tajmeri, AD konvertori, moduli za serijsku komunikaciju, CCP ili PWM moduli itd. Kakav god sklop da pravili večinom če nam biti potrebni neki ili više njih od pomenutih dodatnih sklopova.

Nastavit če se...
Dzenny_assembly
Napredujem
Napredujem
Posts: 118
Joined: 11-09-2014, 04:03

Re: Programiranje PIC Mikrokontrolera Assemblerom

Post by Dzenny_assembly »

Memorije

ROM
Mikrokontroleri sa ROM (Read Only Memory) memorijom su namijenjeni velikim proizvodžačima. Ova vrsta memorije, kako sama riječ kaže, omogučava samo čitanje tvornički upisanih podataka i u slučaju serijske proizvodnje cijena im je relativno pristupačna. Nama, krajnjim korisnicima mikrokontrolera, ova vrsta memorije nije dostupna i nije nam ni potrebna... zaboravite.

OTP ROM
Mikrokontroleri sa OTP (One Time Programmable) memorijom omogučavaju upis programa samo jednom. Izvedene su tako da se prilikom programiranja prekidaju veze u memoriji što dovodi do fizičkog odvajanja pa je nakon toga možemo samo čitati. Ovakve vrste memorija su takodže namijenjene proizvodžačima za serijsku proizvodnju. Dakle, pravljene su za upis več provijerenih 100% ispravnih programa.

UV EPROM
Mikrokontroleri sa UV EPROM (UV Erasable Programmable ROM) memorijom imaju mogučnost reprogramiranja. Izvedeni su tako da se površina čipa može vidjeti preko malog prozora kroz koji ga možemo osvijetliti UV svijetlom što nakon nekoliko minuta dovodi do brisanja programa.

Izgled mikrokontrolera sa UV EPROM memorijom
UV EEPROM.jpg
UV EEPROM.jpg (16.78 KiB) Viewed 18121 times
Naravno, ugradnja ovakvog prozora na čipu nije baš jeftina, što je opet jedan od nedostataka.

FLASH i EEPROM Memorije
Ova vrsta memorije je nastala 80-ih godina u Intelovim laboratorijama kao nasljednik UV EPROM-a. Omogučuje upisivanje i brisanje memorije električnim putem i najpogodnija je za nas krajnje korisnike ali i za proizvodžače, zavisno od potrebe. FLASH memorija se najčešče koristi za čuvanje programske memorije. Upis se vrši tako što, nakon setovanja mikrokontrolera u programski mod, upisujemo bajt po bajt. Dakle ne postoji mogučnost adresiranja željenog bajta nego jednostavno programski brojač uvečava adresu za jedan svaki put nakon upisa jednog bajta. U principu to nam i jeste cilj, upisati program onim redosljedom kojim smo ga napisali. S druge strane EEPROM je izveden tako da se može pristupiti svakom pojedinom bajtu, tj. možemo upisati ili obrisati samo jedan bajt unutar memorije, dakle postoji mogučnost adresiranja. FLESH zauzima manje silicijumske površine na čipu pa je zbog toga, od strane proizvodžača, odabran za smiještanje programske memorije. Velika večina današnjih mikrokontrolera pored FLESH programske ima i EEPROM memoriju kojoj se može pristupati u toku rada mikrokontrolera. U EEPROM možemo smijestiti podatke koji su nam potrebni i nakon prestanka napajanja kontrolera. Najjednostavniji primjer je pin alarma koji samo korisnik može izmijeniti upisom predhodnog pina, a koji ostaje sačuvan i nakon prestanka napajanja!

Reprogramiranje ove dvije memorije se može vršiti praktično neograničen broj puta. Svi proizvodžači za svoje kontrolere u opisu karakteristika daju i največi broj mogučih reprogramiranja FLESH i EEPROM memorije. U slučaju našeg PIC16F84A FLESH iznosi 10 000 a EEPROM i do 10 000 000 mogučih upisa i brisanja što je i više nego dovoljno.

RAM
RAM (Random Access Memory) memorija je namijenjena za pohranjivanje podataka i medžurezulata do kojih se dolazi u toku rada. Za razliku od svih do sad pomenutih njen sadržaj se nepovratno gubi prilikom prestanka napajanja. Kako sam riječ kaže "Radna memorija", zbog toga nam nije ni potreban njezin sadržaj nakon nestanka napajanja. Svakim novim uključenjem procesor upisuje potrebne podatke u RAM (u zavisnosti od programa) pa iz tog razloga je RAM memorija takvog tipa koja čuva podatke samo dok je prisutno napajanje.

Nastavit če se...
Dzenny_assembly
Napredujem
Napredujem
Posts: 118
Joined: 11-09-2014, 04:03

Re: Programiranje PIC Mikrokontrolera Assemblerom

Post by Dzenny_assembly »

Brojni sustavi

Svima nam je poznat Decimalni brojni sustav koji svakodnevno koristimo. Sa samo deset različitih simbola može se opisati čitav univerzum. Ali da li je potrabno uvijek deset? Naravno da nije. U školi smo davno naučili brojeve i to nam je toliko svejedno, i toliko ih uzimamo zdravo za gotovo da nismo ni svijesni baze decimalnog sustava. Mahinalno čitamo brojeve i na pamet znamo o kojoj se cifri radi. Ako malo razmislimo o njemu vidjet čemo da nam se uvijek javlja broj 10! Primjer broja: 642 - Dvije jedinice, četri desetice i šest stotina. Prosto. Ovaj isti broj može da se napiše i malo komplikovanije: 2 + 40 + 600. Još komplikovanije! 2x1 + 40x1 + 600x1 Lako je primjetiti da se u prvom broju nalazi dvije jedinice, u drugom četri desetice, u trečem šesdeset desetica. Zašto se sve vrti oko broja 10? Zato što za pisanje brojeva koristimo deset različitih cifara ili simbola (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). Drugim riječima koristimo brojni sistem sa bazom deset, odnosno Decimalni brojni sistem. Kada nešto brojimo počinjemo od prve cifre ili simbola odnosno od broja jedan pa do broja 9 poslije devet nemamo više simbola pa koristimo kombinaciju več postoječih odnosno 10 itd... Ali, da li mora uvijek da bude tako? Da li mora biti baš deset cifri? Naravno da ne mora. Možemo izabrati bilo koji broj koji če nam biti baza. Davno je u svijetu standardizovan brojni sustav sa bazom deset odnosno Decimalni brojni sustav koji svakodnevno koristimo. Naravno, brojevi sa večom bazom bi bili pregledniji (manje cifri) al' bi zato imali više simbola za naučiti. Procijenjeno je da je sasvim dovoljno deset cifri ili simbola, koji se brzo uče. Realno, najčešče baratamo brojevima do 1000. Veče cifre se javljaju dosta rijedže pa su tako sve cifre s kojima se najčešče susrečemo pregledne, jasne, pa ih lahko i brzo pročitamo. Pored Decimalnog, standardizovani su još neki, tačnije 4 brojna sustava. Poredani po visini baze izgledaju ovako:

Binarni
Oktalni
Decimalni
Heksadecimalni



Binarni brojni sustav:
Računari su takvi da za pohranjivanje brojeva nemogu koristiti deset različitih simbola. Jednostavno, računari, za sve kalkulacije koje vrše, koriste struju a ona, kao što znamo, ima samo dva stanja odnosno dva različita pola, plus i minus. Davno je ustanovljeno da minus predstavlja niži a plus viši naponski potencijal, pa su im shodno tome dodijeljeni simboli (koji su posudženi od decimalnog) za minus 0, za plus 1. Sada možemo zaboraviti minus i plus i koristiti samo 0 i 1. E sad, pošto imamo samo dva simbola i več nakon drugog smo ih potrošili¸, tj. več poslije jedinice nemamo simbol za broj 2. Ono što nam se u decimalnom sustavu desilo poslije broja 9 sad nam se u binarnom dešava poslije broja 1. Poslije broja 1 dodajemo novu cifru pa je to broj 10. To je broj 2 u binarnom sistemu. Dalje, 11 je broj 3, 100 je broj 4, 101 je broj 5 itd...



oktalni brojni sustav:
Oktalni brojni sustav ima bazu 8 tj. koristi simbole od 0 do 7 (0, 1, 2, 3, 4, 5, 6, 7)
Brojanje do deset u oktalnom sistemu bi izgledalo ovako: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12

Hexadecimalni brojni sustav:
Još na početku razvoja računara uvidjelo se da je ljudima teško da rade sa binarnim brojevima. Primjer: Decimalni broj 642, binarno bi izgledao ovako 1010000010. Lako je uočiti nedostatak preglednosti binarnog sistema, mnogo jedinica i nula, zaista nepregledno. Zbog toga je ustanovljen Heksadecimalni brojni sistem sa bazom 16. Dakle koristi šesnaest različitih cifri.
Prvih deset je posudženo od Decimalnog a ostalih šest su slova abecede i to redom A, B, C, D, E, F pa svi simboli skupa izgledaju ovako: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)
Postavlja se pitanje čemu ovaj brojni sistem kad možemo koristiti i decimalni. U prošlim lekcijama sam objasnio pojam bajta, pa znamo da on ima 256 mogučih stanja. Pogledajmno kako ovaj broj izgleda u drugim brojnim sistemima.

Binarno 11111111
decimalno 255
Heksadecimalno FF

Da se primjetiti kako je u Heksadecimalnom sistemu ovaj broj najpregledniji. Jednostavno, računari rade sa brojevima veličine osam bita (jedan bajt) i to je standard kada je u pitanju osnovna računarska jedinica. Najjednostavnije rečeno, inženjeri su "sami sebi" prilagodili Heksadecimalni brojni sistem da im bude pregledan i jednostavan. Evo nekih primjera:
Največi broj koji se može predstaviti sa četri binarne cifre je 1111, to odgovara broju 15 decimalno.
To je ujedno i največi broj koji se u Heksadecimalnom sistemu može predstaviti sa jednom cifrom F.
Pogledajte kako se Heksadecimalni sistem savršeno uklapa kada su u pitanju osmocifreni binarni brojevi!




Treba pojasniti da je nula u računarskom svijetu broj kao i svaki drugi (nema razlike, računar je ne vidi) tj. i nula predstavlja neku vrijednost. Mnogi se tuj nadžu zbunjeni kako bajt ima 256 mogučih stanja a piše se 255. Odnosno kada u kalkulatoru u binarnom obliku unesemo osam jedinica i konvertujemo u decimalni dobijemo broj 255 ili FF u Heksadecimalnom. U svakodnevnom životu smo navikli da nula ne predstavlja vrijednost pa je zbog toga ne uračunavamo u konačni zbir, medžutim kod računara to nije slučaj.

Nastavit če se...
Post Reply