u potrazi za tartufima avr

Upload: eldina-mujagic

Post on 09-Jul-2015

229 views

Category:

Documents


1 download

TRANSCRIPT

U potrazi za tartufima AVR-a"U potrazi za tartufima AVR-a" Uvod - 1. dio Davno sam proitao jedan lanak iz svijeta elektronike "Regulacija temperature sa DS1820", no u tom delikventnom razdoblju dobro sam spajao otpornike, relaye i zaljevao cvijee, no naalost pojma nisam imao to je to DS1820, a jo manje to je AT89C2051. Nakon godinu dana muke s tim pojmovima, nabavom programatora i ulaskom u to sve, vrlo brzo sam zakljuio kako nita ne znam, ni danas nita ne znam, a vjerojatno nikad nita neu niti znati... To razdoblje zivota bavio sam se iskljuivo natjecanjima u robotici, elektronici, a opet pojma nisam imao, ili sam znao relativno malo vie od drugih. Svi ti programi koje sam nekad pisao bili su metoda razmiljanja bez znanja, no to se kasnije pokazalo kao apsolutna ogranienost u programiranju. No zato ovo piem? Uvijek se sjetim mojih poetaka kad smo internet vukli na slamku kroz 56k modem, i mislili da smo osvojili svijet ako znamo napraviti *.bat file... Tako nadobudni klinci kupovali smo Atmelove procesore, kao mi smo "programeri"... Sam pojam izazivao je strahopotovanje... no nita mi nismo znali, a informacije su bile nedostupne, a i ono to je dostupno bilo je, jel, na materinjem engleskom koji smo svi govorili teno jo u maternici... I tako mi smo programirali... Upali, ugasi. Ako si upalio probaj ugasit, ako si ugasio, a "pero" stisnuo tipku, odmah upali, no ako je to bio "mato" ekaj malo, pa upali, pa ugasi, pa provjeri "peru", pa "matu" pa "juricu". Dvije omiljene naredbe su WAIT i GOTO... Valjda svima poetnicima srcu prirasle. I naravno nekako smo mi sve programe navukli da rade, ali nismo naucili programirati! Ovu temu otvorio sam jer u pisati, kao to ste ve skuili, samo o programiranju. Razlog tome je jer nitko nikad nije pisao o tome kada je to meni trebalo, ili nije postojao meni razumljiv tekst koji bih shvatio... Davno sam postavljao poetnika pitanja po forumu i esto sam dobio profesionalne odgovore koje nisam shvaao. On meni tamo pie o nekim "registrima" udnih imena, boja i oblika, a ja nita ne kuim, kao da mi na "Turskom" objanjava "krini put 12 apostola", i onda tek izgubim volju za programiranjem. Dobar dio tih tekstova o programiranju esto izaziva totalno kompleksan i neshvatljiv sadraj za poetnike, i esto svi "normalni" jednostavno odustanu prije nego to uope krenu. Kod knjiga je opet problem jer su pisane dosta opirno, sa previe nevanih pojmova, kao da se Einstein s nekim natjee "Tko e napisati opirniju znanstvenu knjigu!"... Naime, dobro je znati sve stvari iz knjiga, no teko ih je u potpunosti drati u glavi, pa stoga i najbolji programeri esto imaju podeblju knjigu programskog jezika kraj svog stola... isto iz razloga jer se neki dijelovi programskog jezika koriste rijetko, pa se dobro podsjetiti iz knjige... U ovom topicu pisati u o programiranju, ipak o sutinskom, a ne znanstevnom. Svaki programerski pojam pokuat u objasniti na to jednostavniji i razumljiviji nain svojoj baki, a istovremeno gledano sa programerske strane nepobitno tono. Najtei poetniki problem je napraviti programator, odabrati procesor, programski jezik i compiler, jer na internetu ima toliko toga da me ponekad zaboli eludac i pomislim da bih se

mogao pristojno ispovraati od muke, kao i nauke... Zato u odabrati gotovo poetniko rjeenje na kojem e svi moji primjeri programa i opisi raditi dobro. Sve to u pisati biti e za istu platformu, isti procesor, isti editor i naravno isti compiler. Razlog tome je jer ne elim paliti i gasiti ledice na svim procesorima ovog svijeta, dosta je monotno i naporno... S druge strane, nemoguce je nauciti programirati na 100 procesora. Naui samo jedan, zna ih sve, no ako ui sve, nikad nee nauiti niti jedan... Postoji samo jedno parvilo: Molim vas ne komentirajte temu, sve to vas zanima aljite na PM, ili otvorite drugi TOPIC. Razlog tome je jer ne elim zaguiti ideju da piem postove o programiranju koji su zatrpani sa 1 000 000 pitanja i komentara... Tema ce biti uvijek ista sa mojim postovima, a sva pitanja slobodno posaljite na PM i dobiti cete odgovore... Sve ono to mi se uini nejasno potruditi u napisati post koji objanjava nedoumice AVR procesora i programskog jezika C. I naravno postove neu pisati svaki dan jer sam previe zauzet, i nemam dovoljno slobodnog vremena da bih pisao toliko esto... Prvi post, prvi dio ne treba puno teksta: MCU : ATMEGA32 - "Izgleda ko' ip, usudim se rei "JAK" ip AVR-a" Editor : AVR Studio - "Izgleda ko' program za pisanje. Eh, u njemu mi tipkamo program..." Compiler : WINAVR - "Ne izgleda. Samo ga koristimo kao prevodilac na strojni jezik i koristimo njegove biblioteke, tj gotove programe da ih ne pisemo ponovno jer je to vec netko drugi i iskusniji napisao..." Programski jezit: C/assembler - "Jezik kojim govorimo procesoru to da radi! Traio sam neki Turski ili Kineski jezik, ali ima samo "C". to je mikroraunalo? To je procesor. E ba nije, svi ga tako zovemo i dalje emo ga tako zvati no postoji bitna razlika. Mikroraunalo i procesor su dva odvojena pojma. Svi mi to mijeamo, pa u pojasniti ono to ini te drastine razlike izmeu "na oko" istog pojma. Procesor ili CPU je "Centralna Procesorska Jedinica" to bi znailo da procesor samo izvrava programske instrukcije. Procesor je onaj vrag u kompjuteru koji izvrava instrukcije sa vaeg Hard Diska, a rezultate eventualno pohranjuje u RAM na vaem raunalu. Ako dublje zabijete nos u matinu plou skuiti ete da su sve te stvari odvojene i razbacane po matinoj ploi. Procesor ne moe biti samostalan jer nema nikakve memorije iz koje bi izvravao instrukcije. Jer, recite vi meni u koji procesor je mogue strpati Windows XP? Takav ne postoji. Windows se na raunalo uitava sa Hard disk-a, i odrauje djelomino na Hard disk-u, a djelomino u RAM memoriji, a svim time upravlja procesor(CPU).

Mikroraunalo ili "Microcontroller"(MCU) je itav mali kompjuter strpan u samo jedan ip (Naravno, bez monitora). Samom izjavom da je to itavo raunalo dolazimo i do tih osnovnih djelova mikro raunala. Nemamo Hard Disk, no zato imamo FLASH memoriju kojoj je svrha da memorira program koji elimo izvravati. Imamo vlastitu RAM memoriju, imamo vlastiti procesor ili jezgu (core), i imamo vlastitu periferiju mikroraunala. Najbolje od tog svega je injanica da se sve nalazi u samo jednom malom ipu. I dalje emo ga zvati procesor, no isto da se zna, to nije procesor nego mikrokontroler... Koja je onda uloga compilera, i programskog jezika? Da bih mogao napisati ulogu moram napisati sutinsku povijest nastanka, pa ovaj daljni dio teksta piem samo kao primjer razmiljanja prilikom nastanka mikroraunala: Davno prije kada je nastao procesor kao izvrna jedinica ljudske kreativnosti nastale su i prve naredbe: (HEX FILE) AABF DC52 110C 2135 12B6 Izmiljam naredbe, no odprilike tako se programiralo. Prvi parametar je bio to treba napraviti, a ostali parametri ako ih je naredba zahtjevala bili su "odakle i gdje"? I sami ti kreativci nisu bili toliki konji da ne vide osnovni problem ovog pristupa programiranju -> Neitljivo, teko, nerazumljivo!!! I osmislili su najnii programerski jezik "assembler". Zapravo su samo brojeve zamjenili sa slovima bliim ljudskom umu, pa onda ovaj isti tekst moe izgledati ovako: (ASM FILE) SEI MOV R21,R20 LDI R19,0xFF Ovako je program izgledao dosta itljivije. Assemblerska naredba SEI (Set Enable I) izvrava "Enable Global Interrupts", assemblerska naredba MOV registar R20 kopira u registar R21, a LDI (Load Immediate) konstantu 0xFF upisuje u registar r19. Assembler kao programerski jezik ima puno veih ogranienja od tog teksta -> Sve moramo raditi na bazi DIGITRONA. Moemo samo zbrajati, oduzimati usporeivati... te rezultate pohranjivati na eljenu lokaciju u RAM memoriji ili ostavljati rezultate u radim registrima mikroraunala. To je bilo ogranieno ubijanje mozga sa glupostima, glupostima savrenstva. Assembler je savren programerski jezik, baziran na upravljanju svakog ciklusa i svakog dogaaja na raunalu, no isto tako je besmisleno ubijanje mozga programera koji mora paziti na svaki korak mikrokontrolera. Drugi problem je to assemblerski napisan program moe raditi iskljuivo na mikrokontroleru za koji je pisan, i jako teko ga je preseliti na drugi tip mikrokontrolera jer su drugaije i same naredbe, arhitektura, adrese registara... Iz tog razloga nastali su vii programerski jezici koji glase ovako:

Broj1 = Broj2 + Broj3; No naalost ovaj tekst nita ne znai za mikroraunalo, njemu jednostavno treba dati one "Guraj-Vuci" komande i za to postoji "Compiler". Stoga "Compiler" je program koji e programerski jezik vieg i razumljivijeg nivoa prevesti na primitivni nivo jednog mikroraunala. (10100010110110111100101010001110000000110101) Sve programe u pisati u C-u (jednostavnijem i viem programskom jeziku), a WINAVR koristim da mi to prevede na strojni (HEX) file, tj da moj jednostavniji nivo razmiljanja prevede tom primitivnom mikroraunalu. Zbunjuje me totalno platforma. Rekoh moram odluiti, i stalno vaem , no nikako da vie odluim za koji AVR pisati. Napisao sam u prvom postu kako e to biti MEGA32, no to ba i ne spada u poetniki AVR s obzirom da je dosta opiran. Isto pitanje vratio sam si 5 godina unazad i postavio ga ponovno. Dragi Josipe, s kojim bi ti mikrokontrolerom AVR-a volio poeti? I gle odgovor je tu: Definitivno ATMEGA88. Moda mi je taj AVR malo prirastao srcu, no ta serija ATMEGA48, ATMEGA88 i ATMEGA168 ipak je najbolji poetak. Zapravo radi se o procesoru koji je "skoro" identian kao ATMEGA8(najpopularniji), no jai je u tome jer ima 1-wire Debug. to je 1 wire debug? Veina programera najprije programiraju, onda to upucaju u MCU, i metodom palac-oko procjene jel radi, ili ne radi. Ako neto ne radi onda bulje u program i po njemu trae greku. Dakle, vide oni jako dobro da to ne radi kako treba, no ne znaju zato? to dakle da ine, osim da kopaju po svom programu i razmiljaju gdje su se zeznuli. Iz tog razloga je nastao pojam "On-Chip Debug". Zamislimo da imamo 20 000 linija programa, i neto nekad, iz udnog razloga poludi. Prva metoda kopanja po programu odmah pada u vodu, jer nemogue je toliko linija programa drati u glavi, a kamoli iz toga svega pronai razlog zbog kojeg se program sruio. On-Chip Debug nam dozvoljava da sa PC-a izvravamo instrukciju po instrukciju programa, da analiziramo sve to se dogaa na mikrokontroleru, mijenjamo sve to elimo, zaustavljamo program kad elimo, kako elimo. Svaki puta kada program zaustavimo imamo detaljan uvid u stanje svih memorija, svih registara i svega to se nalazi u mikrokontroleru. Nemojte mijeati ovaj DEBUG sa simulatorom. Simulator simulira ono to bi se trebalo dogoditi, a one wire debug govori ono to se tono dogaa. 1 Wire Debug se ne izvrava na PC-u, on se izvrava direktno na mikrokontroleru i prema PC-u alje sve informacije iz svoje memorije, stoga je toan prikaz onoga to se dogaa na vaem hardware-u. Ovaj dio i nije tako bitan za poetnike, no upravo zbog toga "one wire debug-a" u odabrati ATMEGA88 jer mogu izvravati program direktno na njemu, te imati uvid u sve to se dogaa, a samim time mogu bolje i objasniti razloge nekih dogaaja koje u sutini esto predvidimo, ili ih nemamo ime pogledati da bi ih shvatili... A opet na kraju svega odabrao sam AVR koji je kao natiman za poetnike. Nije toliko opiran, a ima gotovo sve to ima i svaki AVR mikrokontroler. Platforma za koju u pisati jer nju imam doma je ova: CPU 4U4I http://www.inovatic.hr/default.aspx?id=69 Ba gledam, ima ih tu nekoliko, no ovu drugu odozgora imam doma tako da u sve pisati za nju, a sad tko voli nek si prevodi

Registracija na www.atmel.com je obavezna... no AVR studio je besplatan i moe se skinuti ovdje: http://www.atmel.com/dyn/products/tools_card.asp? tool_id=2725&category_id=163&family_id=607&subfamily_id=760 AVR Studio 4.18 (build 684) AVR Studio 4.18 SP3 (b716) I jo trebam prevodilac, opisan nedavno (WINAVR): http://winavr.sourceforge.net/download.html Skidajte uvijek zadnju verziju, trenutno vidim da je neka: 20100110 Znai ono to bi trebalo instalirati je ovim redom: AVR Studio 4, AVR Studio Service Pack 3, WINAVR. "U potrazi za tartufima AVR-a" Misija - 1. Upaliti LED Ovo je valjda najjednostavnije to sam mogao smisliti. Neemo za sada blinkati LED-icom, niti emo itati tipke. Sve to treba napraviti je upaliti jednu LED diodu. Mislim da ovo svi poetnici znaju, a isto tako mislim da niti jedan poetnik ne razumije to je napravio. On tamo u bascomu ili nekom drugom programu upie 3 linije programa i LED svijetli, a samim time ogranii svoju kreativnost jer ne razumije to se u pozadini uope dogaa. Evo i nae omiljene knjige u kojoj ima sve to trebamo, te puno vie od toga. Proitao sam je nekoliko puta, ovisno to sam kada radio i koje poglavlje mi je kad trebalo. Ovo nije "Biblija" da je itamo po redu. I esto emo je proitati, ali naim redosljedom onoga to nas u kojem trenutku zanima. http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf Ovako izgleda mikroraunalo ATMEGA88: http://img340.imageshack.us/img340/5056/mega881.jpg Vidim ima tu nekih puno udnih kvadratia, pa u ja u svrhu ovog palenja LED-a obrisati one koji me ne interesiraju trenutno: http://img847.imageshack.us/img847/9530/mega882.jpg Ovako je ve bolje Napisati u osnovne stvari o svakom kvadratiu, pa prije nego to moemo upaliti LED-icu ovo bi morali razumjeti. 1. Power Supervision POR/BOD & RESET Ovo slui da na neki nain nadgleda MCU, osigurava dobar Start izvravanja programa, te nekakve zatite od kritinih situacija sa naponom. POR -> "Power On Reset" ima ulogu da svaki puta kada ukljuimo mikroraunalo on resetira program na poetak, tj postavi to poetno stanje iz kojeg uvijek kree rad mikroraunala. BOD -> "brown-out detection" procesor ne smije izvriti niti jednu krivu instrukciju, a moe ih izvravati 20 000 000

u sekundi, dakle jako brzo i puno instrukcija, a sve moraju biti bez greke. Jedini pravi problem je u naponu napajanja, te vanjskim smetnjama. Ako napon napajanja padne na kratko procesor moe poluditi, a da se to ne dogodi slui ovaj BOD. Njega moemo ukljuiti ili iskljuiti. BOD monitorira napon na procesoru, te u sluaju da on padne ispod dozvoljene razine BOD e resetirati MCU kako bi program koji se izvrava krenuo od poetka. Ovisno o onome to radimo, sami odluujemo dali elimo da BOD titi program restartom ili ne. RESET -> Bio externi, interni POR, ili BOD ovo e resetirati procesor te program pokrenuti ispoetka. 2. FLASH Tu ide onaj HEX file, program, instrukcije ili zovite to kako hoete. To slikovito moemo zamisliti kao XXXX instrukcija od kojih se prva uvijek nalazi na adresi 0, a svaka sljedea ima veu adresu. U MCU postoji neto to se zove PC "Program counter", a to govori procesoru ili jezgri koju instrukciju treba izvriti. Ovo govorim iz razloga jer je povezano sa resetom. Dakle kad resetiramo mikroraunalo onaj RESET e uvijek postaviti PC (program counter) na adresu 0. Dakle prva instrukcija koju e AVR jezgra izvriti uvijek se nalazi na adresi 0 u FLASH-u. Postoji jo neto to se zove BOOTLOADER, pa se ta adresa moe postaviti i na lokaciju BOOTLOADER-a, no za sada svi poetnici uvijek trebaju znati da je prva instrukcija na adresi 0 u FLASH-u. ATMEGA88 ima 8k programske memorije(tonije 8192 bytea), seljaki reeno ima mjesta za 8192 broja od 0-255. Ti brojevi su instrukcije za AVR jezgru. 3.SRAM Tamo se sprema ono to se zove varijabla u programiranju. AVR jezgra ima svoje radne registre gdje moemo drati nekakve brojeve, no njih je premalo i ne bi mogli u to strpati puno podataka. Zato postoji RAM memorija u koju procesor prema instrukcijama pohranjuje podatke, vue ih nazad u registre te opet po programu neto izvrava s tim podacima. to je najgore da upalimo ledicu u ovoj naoj misiji, RAM nam nije potrebam, jer program je toliko jednostavan da nita neemo pohranjivati u RAM, samo trebamo napisati instrukcije za AVR jezgru koja e upaliti LED-icu. ATMEGA88 ima 1 kB RAM-a, ili seljaki reeno tamo moe pohraniti 1024 razliitih slova ili brojeva od 0-255; Najbitnija razlika izmeu RAM-A i FLASHA je ta da FLASH programiramo i tamo instrukcije ostaju bez obzira jel procesor na napajanju ili nije. One su tamo trajno upisane kako bi mogli iskljuiti MCU, a da naredbe ostanu sigurne. RAM memorija uvijek je prazna, tj sve je "log 0", prilikom restarta procesora, te tamo procesor pristupa prema naem programu kako bi neto privremeno pohranio. 4.AVR CPU E to je procesor, jezgra. Na svaki "clock" koji doe sa oscilatora jezgra izvri jednu assemblersku instrukciju iz FLASH-a. U sekundi moe ih izvriti po pravilima datasheeta maksimalno 20 000 000. Za one koji ele znati koliko je to brzo: 1/20 000 000 = 0,000 000 05 Sekundi ili 50 nS Kao programeri prisiljeni smo razmiljati u takvom vremenu stoga stvarnosti "byebye".

5. Oscilator Circuits/Clock Generation Dio procesora koji generira CLOCK za AVR jezgu te periferiju o kojoj emo kasnije govoriti puno vie. AVR moemo svakako konfigurirati. U sebi ima ugraen interni oscilator koji moemo podesiti da radi na MAX 8 000 00 Mhz, a isto tako moemo podesiti da se clock uzima sa vanjskog kristala MAX 20 Mhz. Isto tako moemo biti i dovoljno ludi da ga konfiguriramo na "Vanjski impuls" preko X2 pina, spojimo obini prekida te mu mi govorimo u realnom vremenu da izvrava jednu po jednu assemblersku instrukciju. Za sada o clocku treba znati da je to takt rada jezgre, te za palenje LED diode bilo kakav takt nam odgovara, stoga ovaj dio u ostaviti kako je podeen na mojoj ploi. Svaki taj takt CPU jezgra izvri jednu instrukciju iz FLASH-a. 6. PORT E tamo su spojeni pinovi ipa. Nakon RESET-a mikroraunala svi PORTOVI (PORT B, PORT D PORT C) konfigigurirani su kao ULAZI. Postoje tu joe nekakva default pravila prilikom isporuke novog MCU-a iz atmela, pa recimo RESET linija nikad nije konfigurirana kao PORT, nego kao RESET pin... neu ih sad sve nabrajati jer jo nisam pisao nita o FUSE, stoga to u ostaviti za neka druga vremena. Program koji pali LED diodu trebao bi izgledati ovako: 1.Konfiguriraj PORT na kojemu je spojena LED-ica da bude IZLAZ. 2.Postavi Stanje PORT-a da bude na logikom stanju koje pali LED. 3.Nemoj vie nita raditi. (ako je mogue). Ispravak i korekcija smislenih neistina... Naravno, @Kizo me prvi isprvio jer decko zna previe , no to je pozitivno, svi koji moete i znate puno obavezno me ispravljajte, jer nitko ne zna sve i dobro je da se tekst moe korigirati za budue itatelje... Kako ve piem za poetnike ponekad da pojednostavim stvari ne piem apsolutnu istinu, nego istinu koju bi poetnik moda trebao znati prije nego se upusti u totalno nizak podhvat : "Razumjevanje mikroraunala". Postove piem javno, pa stoga javno mogu pisati i neistine, no u svakom sluaju ako u teksovima napiem neto to ba i ne bi trebalo biti tako napisano jer je pretjerano daleko od prave istine obavezno mi poaljite poruku kako bi na kraju dobili to jednostavnije i smislenije upute za uenje programiranja AVR-a. Sve tekstove koje piem u tjekom vremena iznova aurirati i doraivati, stoga je sasvim uredu da u tekstu moe biti eventualnih propusta i greaka. Oni koji su itali postove ranije primjetili su moda da ATMEGA88 radi na 16 000 000. No to nije sasvim tono jer u datasheetu pie da radi na 20 Mhz. Stoga na takve propuste upozoravajte jer veinu teksta piem iz glave, a ne iz datasheeta s obzirom da bi mi trebalo puno vie vremena da sve to napiem provjerim u datasheetu. Zapravo se trenutno borim sa nekim ARM procesorom koji je svoja vrsta kompleksne nauke, a njegov datasheet ima oko 900 stranica, stoga postoji mogunost da pomjeam sve te informacije u jednu trenutnu neistinu na forumu...

Hvala na uvaenim isprikama. "U potrazi za tartufima AVR-a" Misija - 1. Upaliti LED Dakle malo sam se igrao instrumentom oko platforme UI 4x4 i skuio da postoji spojena LED dioda i RELAY koji se nalaze na PINU 23 mikroraunala ATMEGA88. Pogledam u datasheet, onu knjigicu sa 300 stranica i vidim da se radi o PC0 (PORT C 0). Takoer sam primjetio da se ta LED-ica i RELAY pale sa logikom nulom. (0V). Stoga program mora postaviti PC0 kao izlaz, te na njega upisati logiku nulu, i po mogunosti vie nita ne raditi. No moram malo odlutati od teme: Znate li da moj laptop ima 32 bitni procesor? Va je moda 64 bitni, pa vas pitam koliko je to bitno? Bitno je, naravno da je bitno. Va je 64 bitan, a moj samo 32 bitan, stoga je va duplo bitniji nego moj? to znae ti bitni brojevi 32,8,64? Evo jedan 8 bit-ni broj: (BIN)11111111 Evo jedan 32 bitni broj: (BIN)11111111 11111111 11111111 11111111 Po tome 64 bitni broj sastoji se od 64 znamenke ( 0 ili 1 ). No zato je to bitno? Zakljuili smo kako procesor samo izvrava instrukcije: zbroji, oduzmi, usporedi, poguraj, povuci, skoi tamo-vamo. 32 bitni, 64 bitni ili 8 bitni procesor znai broj bitova s koliko on rauna "neto" u jednoj assemblerskoj instrukciji. ATMEGA88 je 8 bit-no raunalo, pa mogu zakljuiti kako je maksimalni broj s kojim on zna raunati: BIN:11111111, HEX:FF ili DEC:255. Za prebacivanje brojeva iz DEC, u HEX ili BIN najjednostavnije je koristiti Windows Calculator. Dobro je za poetnike uhvatiti se malo www.google.com i prouiti kako se rauna u HEX, DEC i BIN jer to su osnove koji bi ipak trebali znati. Vraam se temi LED-ice na portu PC0. Kako 8 bit-no raunalo uvijek rauna iskljuivo sa 8 bit-ova zato sve u tom raunalu uvijek izgleda kao 8 nekakvih stanja (0 ili 1). Pa tako i portovi imaju imena od recimo PB0 do PB7. Kako to u AVR studio izgledaju ti registi PORT-a C? http://img857.imageshack.us/img857/7311/mega883.jpg "U potrazi za tartufima AVR-a" Misija - 1. Upaliti LED Ako se malo bolje zagledate u zadnju objavljenu sliku, skuiti ete kako svaki PORT AVR-a ima 3 registra: DDRC PINC PORTC

Opisati u vane stvari oko ova 3 registra (Barem vane kad elimo upaliti LED)... DDRC -> Data Direction Register C Ovaj registar sadri informacije o onoj noici mikrokontrolera (Ulaz ili izlaz). (Samo za PORT C, 8 Bitno raunalo, 8 linija, 8 svega) Procesor ili jezgra iz FLASH-a izvrava instukcije koje mogu upisati na ovaj registar 8 nula ili jedinica. A samim time na program e sigurno tamo morati upisati "00000001" jer mi elimo izlaz na PC0, poto elimo upaliti LED-icu koja se tamo nalazi. Ako bi imali spojenu LED-icu na PC7, onda bi u DDRC morali upisati ovo: 10000000 (BIN). Prva noica PORTA C, uvijek se zove PC0, a zadnja PC7. Ve sam naveo kako su svi PORT-ovi po default ULAZI, pa sada mogu napisati da logika "0" znai ulaz. Kada se procesor ukljui na napajanje te POR (Power on Reset) resetira CPU , te Program Counter bude postavljen na adresu 0 gdje se nalazi prva instrukcija FLASHA) svi registri PORT-ova biti e 0, tj ulaz. Lako je dakle zakljuiti kako mi moramo na DDRC upisati "00000001" (BIN) kako bi postavili PCO kao izlaz. Nemojte mjeati PORT C sa PC0 -> Port C je itav PORT (8 noica mikroraunala), a PORTC0 je nulta noica od tih 8... Dakle sve je 8 (PC0 - PC7). PINC-> "Dvolian registar" -> Moe biti jedno, ali ako zna malo vie o njemu zna, onda je sasvim drugo... Ovaj registar ovisi o tome kako smo konfigurirali smijer podataka (DDRC) registar. Za sada emo predpostaviti kako smo smijer (DDRC registar) odabrali kao izlaz zbog tog krajnjeg cilja palenja Led-a, onda PINC registar ima jednu linost... Prva linost PINC registra.... Stavka 1: Ako ga itamo, on e nam sigurno rei kakvo je stanje naeg izlaza -> Ovo moe biti korisno ukoliko pri programiranju ne elimo pratiti kada smo izlaz postavili na LOG 1, te kada smo ga postavili na LOG 0. Jednostavno proitamo PINC registar i tamo pie jeli izlazna linija na 0V ili na 5 V... Stavka 2: Imena TOOGLE -> Takoer korisna stvar. Ako na ovaj registar upiemo logiku jedinicu, izlaz kakav god bio e promijeniti trenutno stanje. Dakle, ako je bio 0 postati e 1, a ako je bio 1 postati e 0. Korisno je ukoliko recimo elimo blinkati LED-icom, ali nas ne zanima jeli LED trenutno upaljen ili ugaen, stoga samo na PINC registar upiemo 1 (na poziciju PC0 -> 00000001), i sigurni smo da e taj PC0 promjeniti stanje izlaza... O drugoj linosti ovog registra govoriti emo kada budemo noicu mikroraunala koristili kao ULAZ. PORTC -> Takoer "dvolian" registar... Drugaije se ponaa kada je DDRC registar konfiguriran kao ulaz, a drugaije kad je izlaz. Trenutno u opisati linost, samo kad je izlaz, jer to i je krajnji cilj ideje. Ako na PORTC upiemo log "0", noica mikrokontrolera e biti 0V povuena sa

tranzistorom, stoga kroz ovu logiku "0" moemo vui struju za LED. Ako u PORTC registar upiemo LOG "1", tada e noica mikrokontrolera biti 5V, no takoer 5V PNP zatvorenog tranzistora, stoga i iz ove situacije moemo takoer vui struju... Ovo je bitno ukoliko je netko radio sa 8051 arhitekturom, koja sve izlaze ima open-collector. Na 8051 postoji samo jedan tranzistor koji izlaz vue na 0V te je 0V jedino iskoristivo za vui struju dovoljnu za palenje LED-a, dok AVR ima 2 PUSH-PULL tranzisotra koji mogu koristiti i 0V i 5V da bi povukli struju iz mikrokontrolera... Kod 8051 bitno je kako okrenemo LED diodu, jer iskoristiva je jedino LOG 0 za dovoljnu struju koja moe upaliti LED, dok kod AVR-a kako god je okrenemo, koristili LOG "0" ili LOG "1" mikrokontrolera, uvijek imamo osiguranu dovoljnu struju za LED. Za poetnike dobro bi bilo prouiti pojmove: "Open Collector", "Push-Pull" Evo i neki link koji sam onako "odoka" metodom pronaao: http://www.ecircuitcenter.com/circuits/pushpull/pushpull.htm Tranzistor kao sklopka ovisno o tipu PNP, ili NPN moe liniju potroaa povlaiti na 0V (NPN), ili na 5V (PNP). Kod 8051 postoji samo jedan NPN tranzistor, stoga izlaznu liniju moramo vui na 0V ako elimo iskoristiti struju tog tranzistora. Kod AVR-a imamo 2 tranzistora, jedan je zaduen da moe povui struju prema 0V, dok je drugi zaduen da je moe povui prema 5V. Dosta zbunjeno ovo zvui, no vjerujem da e biti jasnije kada budem programirao, te sve ove primjere prezentirao... Mislio sam slikati fotiem konfiguraciju i programiranje, ali kasnije mi je dola ideja zato to da ne snimim i dignem na youtube?? Onda sam pogledao u monitor preko fotia, i skuio da se nita ivo ne vidi. Pa sad sam u potrazi za nekim programom koji moe snimati ono to se dogaa na monitoru... Ne znam postoji li takvo neto, no mislim da bi moralo postojati, jer ne vidim razlog da ne postoji, stoga ako netko zna takav program neka poalje PM. Iskreno, jo nisam ni kopao o tome po www.google.com jer sam danas planirao napisati barem jedan post o ovim registrima, pa sad bih ipak trebao nekakav takav program da sve ovo o emu serem mogu snimiti, kako bi to zajedno dobilo nekakav smisao teksta... Ovo o emu sam danas pisao nalazi se na stranici 71 datasheeta one knjigice koju ne itamo kao "Biblija": 13.2 Ports as General Digital I/O Page(71) "U potrazi za tartufima AVR-a" Misija - 1. Upaliti LED Hvala, @feko, program je odlian... Budem dizao na youtube, jer mislim da je tako najbolje i sigurno najpreciznije kako napraviti palenje LED-a. Jedina obavezna funkcija u programskom jeziku C je int main(void); i to po standardu C-a znai poetak programa. Netko bi mogao pomisliti kako se to nalazi na adresi 0 u FLASH-u, no ti nije sasvim tono. Compiler e za nas odraditi neto drugo na adresi 0 u FLASHU, a funkcija main biti e neto malo dalje od adrese nula FLASH-a. Ovo u kasnije objasniti detaljno, no za sada moramo znati da je svaki poetak programa u programskom jeziku C

uvijek funkcija "main", dok e se prevodilac pobrinuti da to dobro prevede na assemblerske naredbe. Evo youtube link kako napisati program palenja LED-a. http://www.youtube.com/watch?v=sbcrKH5aDco "Prebaciti u HD" Code: Code: Select all

#include int main(void){ DDRC = 1; while(1); }

Evo nedoumice koje bi mogle biti nejasne... Nisam pisao po PORTC registru? Zato? Ve sam do sad naveo kako su PORTC, PINC, te DDRC prilikom reseta mikrokontrolera uvijek logika nula, no naveo sam kako se LED na platformi UI4x4 pali sa logikom nulom. Dakle nisam morao ii upisati 0 na PORTC 0 jer je taj registar po defaultu 0 nakon reseta, stoga sve to sam morao napraviti je ulaz konfigurirati kao izlaz. DDRC = 1; Nakon izvravanja ove naredbe LED se pali. #include Da bih neto upisao u registar moram znati na kojoj se on adresi nalazi. Naveo sam kako emo koristiti biblioteke compilera WINAVR, stoga sam u svoj program ubacio njihovu gotovu biblioteku u kojoj se nalaze sve adrese ovih registara. Kada god hoete pisati po port registrima morate napraviti ovaj include. "{" "}" - otvorena zagrada znai poetak glavne funkcije programa int main(void); int znai da funkcije moe vratiti nekakav int parametar, no o tome u pisati kada budem pisao o funkcijama. Void znai da funkcija nema atributa, to u takoer pisati kada budem pisao o funkcijama. Za sada treba znati kako je ovo osnovna funkcija svih programa, i to god da radili u AVR studio, ona mora postojati i uvijek oznaava poetak programa. while(1); ili sve dok je jedan, no uvijek je 1 pa tako dobivam beskonanu petlju. U jednom od postova napisao sam da procesor mora "ne raditi vie nita", no to se ne moe ba tako jednostavno napraviti. Procesor je prisiljen na svaki clock izvriti jednu instrukciju. Stoga mu ja kaem da izvrava tu svoju jednu instrukciju, a ona glasi "sve dok je 1, izvravaj isti sve dok je 1". Dakle procesor e zaglaviti na toj naredbi, te je stalno izvravati, a zapravo nee raditi nita pametno. Time smo postigli da se program nikad ne zavri ili izgubi, te da LED svijetli... Postoje niz naina kako zaglaviti procesor. while(1) je programska petlja koja se izvrava sve dok ovaj parametar 1 ne postane 0, a mi

smo ga u samoj naredbi postavili na 1, te on nikad nee postati 0. klik na build/rebuild all prevodimo C napisan program na strojni HEX jezik, te time kreiramo hex datoteku koju treba upisati u FLASH mikrokontrolera. Fileove neu dizati na forum, jer mi nije cilj da poetnik ima gotov program, jer poanta prie nije imati gomilu programa, nego pisati sve sam i uiti se kako ovo programirati. "U potrazi za tartufima AVR-a" - Juri na assembler, bitka kod HEX-a Ovaj naslov je i tako ispred svog vremena i davno sam odluio da e takav biti. Prije ovoga mislio sam napisati post o "upucavanju" Hex file-a u ATMEGA88, no to u napraviti kasnije. Razlog tome je naravno bucin topic o assembleru i drago mi je da se odluio pisati takvo neto. Cilj posta je svakako prezentacija odnosa snaga assemblera i C-a. Program palenja LED-a u C-u sam ve napisao, no sa strane assemblera ovo izgleda potpuno drugaije. Bitka kod hex-a svodi se na najniu razinu na koju se u programiranju moemo spustiti... "Dno-Dna" -> Sve ispod ovoga bi bilo dizajniranje vlastitiog raunala... to je HEX file i kako izgleda? Samo ime HEX govori da je datoteka zapisana u Hexadecimalnom brojevnom sustavu: (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) Evo jedan red HEX file-a koji u rastaviti i objasniti znaenje HEX file-a: (Ovo je prvi red iz HEX file-a za palenje LED-a i programa kojeg sam napisao u C-u) :1000000019C020C01FC01EC01DC01CC01BC01AC00C Ovako je to zapisano u HEX datoteci, no ubaciti u nekoliko razmaka u taj red jer moram red drugaije formirati da bi razlikovali stvari koje se nalaze u jednom redu... : 10 0000 00 19C0 20C0 1FC0 1EC0 1DC0 1CC0 1BC0 1AC0 0C Hex rastavljen prema redosljedu logikih cjelina: : - oznaava poetak reda u HEX datoteci. (Poetak HEX zapisa) 10 - oznaava broj data byteova u tom redu. Ne radi se o 10 byteova nego o 16. Hex je pisan u Hexadecimalnom sustavu, pa probajte kalkulatorom prebaciti HEX 10 u DEC sustav i to je 16 Tih 16 znai da u jednom redu postoji 16 "data" byteova. 0000 - Adresa na koju se upisuje data zapis HEX filea. Kao to vidite prvi red u HEX datoteci za palenje LED-a ima adresu 0000 jer to je prva naredba koju e izvriti AVR jezgra. 00 - ovo oznaava tip zapisa hex filea. 00 oznaava "DATA" zapis. U INTEL HEX fileu postoji 6 razliitih tipova zapisa, no kad pie "00" sigurno se radi u DATA zapisu koji u sebi sadri 16 bitnu adresu.

Nakon descriptora jednog reda idu instrukcije: 19C0 20C0 1FC0 1EC0 1DC0 1CC0 1BC0 1AC0. Veliina svake instrukcije AVR jezgre je 2 byte-a. Postoje assemblerske instrukcije koje su 4 byte-a jer u 2 byte-a jednostavno je nemogue napraviti sve instrukcije AVR-a. No to nam nije toliko bitno jer kada bi analizirali svaku naredbu skuili bi koja je 4 byte-a a koja 2 bytea. Ovaj dio HEX filea sam izvukao iz palenja LED-a, pa takoer mogu zakljuiti kako e AVR jezgra za prvu instrukciju sigurno izvriti 19C0(HEX). Bez obzira to ovo nitko nikad ne mora koristiti bitno je zapamtiti da svaka assemblerska instrukcija za AVR jezgru moe biti 2 ili 4 byte-a. Ako znamo koliko je velika jedna instrukcija, jednostavno je izraunati koliko instrukcija assemblera moe stati u ATMEGA88. Ako imao 8192 Bytea FLASH-a, onda sigurno u to moe stati duplo manje assemblerskih instrukcija jer svaka instrukcija treba minimalno 2 byte-a. 8192/2 = 4096 -> ATMEGA88 moe pohraniti u FLASH 4096 assemblerskih instrukcija Ovo su instrukcije koje se nalaze u jednom redu HEX file-a. Prvi byte u HEX fileu oznaava broj data byte-ova -> 10(HEX), 16(DEC). Dakle idam zbrojiti koliko ima tih byteova assemblerskih instrukcija... 19C0 - 2 Bytea 20C0 - 2 Bytea 1FC0 - 2 Bytea 1EC0 - 2 Bytea 1DC0 - 2 Bytea 1CC0 - 2 Bytea 1BC0 - 2 Bytea 1AC0 - 2 Bytea ________________ Total = 16 bytes(DEC) (10HEX) Moramo izvui i zakljuak ovoga -> U jednom redu HEX filea postoji max 8 assemblerskih naredbi, ili 16 data byteova za AVR jezgru. Osatao je i famozni kraj HEX filea koji uvijek zavrava sa jednim byteom. U ovom sluaju pie -> "0C" Kontrolni byte jednog reda reda HEX file-a zove se "checksum" Dakle taj byte potvruje vjerodostojnost svih byteova u tom HEX redu i rauna se na sljedei nain: Ponovno mi treba itav red HEX-a -> :1000000019C020C01FC01EC01DC01CC01BC01AC00C Zadnji byte u obrisati kako bi ga mogao ponovno izraunati. :1000000019C020C01FC01EC01DC01CC01BC01AC0 Prvo to radim je to da razdvojim to na byteove -> 10 00 00 00 19 C0 20 C0 1F C0 1E C0 1D C0 1C C0 1B C0 1A C0

Pokrenem windows calculator, prebacim ga u HEX i raunam ovo: 10 + 00 + 00 + 00 + 19 + CO.... -> Zbrojim sve byteove u Hex redu. Osim zadnjeg kojeg smo obrisali jer njega raunamo. Rezultat koji dobivan je 06F4. Broj koji sam dobio vei je od jednog byte-a pa uvijek uzimam nii byte -> "F4". U calculatoru raunam "F4 XOR FF" i za relultat dobivam "0B". Dodam ovom "0B" rezultatu "01" i dobivam "OC". Dakle, OC mora biti na kraju ovog HEX reda. Evo univerzalna formula: Checksum HEX reda raunam tako da od zbroja svih byteova uzimam onaj nii (manje vaei), te raunam XOR sa 0xFF i uveavam rezultat za 1. Bitno je primjetiti da sam izbrisao checksum prilikom njegovog raunanja i taj zadnji byte ne ulazi u formulu za proraun checksuma. Dakle ovaj zadnji byte je izraunat prema svim ostalim byteovima u istom redu HEX filea samo kako bi mogao dokazati vjerodostojnost podataka u istom redu. Ako promjenimo samo jedan BIT u itavom HEX redu checksum nee odgovarati rezultatu checksuma i samim time na HEX file nije dobro zapisan. Koja je u tome najniem nivou mo assemblera? Ako moemo sami pisati HEX te izraunati sve to je potrebno za FLASH MCU-a to mi onda radimo? Programiramo ili piemo brojeve? Hex file je u principu strojni assembler, ovi brojevi su assemblerske naredbe koje su nazvane imenima isto da bi komande imale smisla. U notepadu to izgleda kao broj, no radi se o istoj, od majke roenoj assemblerskoj instrukciji. Tu nastaje ta prva rupa izmeu C-a i assemblera. U c-u mi ne moemo utjecati na HEX file jer ga generira compiler, i on odluuje kako e napraviti HEX file, dok u assembleru nas zapravo boli "k" za sve, jer mi smo ti koji odluujemo o svakoj instrukciji. Mi smo oni koji slau instukciju za instrukcijom i nitko drugi osim nas ne moe utjecati na redosljed instrukcija AVR jezgre. alosna istina na kraju ovog dijela napada na HEX je sljedea: Da bi mi upalili LED potebne su 3 assemblerske instrukcije (@buco vjerojatno zna i krai nain, no trenutno mi se ne kopa po assemblerskim instrukcijama da bih ovo napravio krae) Moda se pitate zato HEX file koji je napravio compiler WINAVR iz C-a izgleda ovako: Code: Select all:1000000019C020C01FC01EC01DC01CC01BC01AC00C :1000100019C018C017C016C015C014C013C012C034 :1000200011C010C00FC00EC00DC00CC00BC00AC064 :1000300009C008C011241FBECFEFD4E0DEBFCDBF82 :1000400002D004C0DDCF81E087B9FFCFF894FFCFA5 :00000001FF

dok Hex file koji sam kasnije napisao u assembleru izgleda ovako: Code: Select all:0600000081E087B9FFCF8B :00000001FF

Vidite da je zadnji red HEX file-a identian, i ako njega rastavimo po pravilima HEX file-a

dobijemo ovo 00 0000 01 FF. 00 -> Broj byte-a je 0 0000 -> Adresa zapisa je 0 01 -> Tip zapisa vie nije 00 nego je 01. Ovo u HEX-u znai kraj file-a. FF -> Onaj dosadni checksum -> Zbroj byteova je 01 -> 01 XOR FF = FE, FE + 1 = FF -> Dakle checksum mora biti FF U svakoj HEX datoteci moe postojati samo jedan kraj file-a i uvijek se oznaava sa tipom zapisa "01". Orginalna ideja (iz 1970) tog kraja je da u njemu postoji i adresa prve instrukcije koju izvrava jezgra, pa je u ovom naem HEX fileu dobro upisana adresa na 0000. No ovo u stvarnosti ba ne dri vodu jer ne bira HEX file odakle e jezgra startati, nego to bira FUSE AVR MCU-a o kojemu emo naravno kasnije. Ovaj tekst oko HEX file-a nije potrebno znati, ali onaj tko hoe moe si bez problema otvoriti HEX file i analizirati sve instrukcije AVR jezgre. Zato ja piem ove gluposti o HEX-u? Postoji samo jedna razlika izmeu pravih programera, i dakako onih koji to nisu. to napraviti kad nastane problem??? Bascom, C i svi jezici koji nisu assembler u sebi imaju neto to moemo nazvati RANDOM BUG, pa tu i tamo znaju popizditi i napraviti glupost. Te gluposti mogu biti ili neznanje programera da kae compileru to eli, ili compiler jednostavno ni sam ne zna kako da napravi to to programer eli, pa napravi sranje od HEX file-a. Snaga programera je samo u daljini koliko see njegovo znanje te oruja s kojima raspolae. Ako ja napadam "problem", koji ne eli odustati, sigurno da u otii u najgoru moguu krajnost assembera i HEX-a, dok programer C-a ili BASCOM-a mora ostati na razini vieg jezika i problem ne moe rijeiti narednih 200 godina. Povui u jednu zanimljivost o HEX file-u. Dok ne znate to je to svi mislite da se upisuje u FLASH MCU-a, no ti nije istina. Kada pogledamo to sve postoji u HEX redu vidimo da postoje gluposti kao adresa, broj byteova u jednom redu, tip zapisa i checksum reda. Koji bi to konj napravio MCU i upisao u FLASH itav hex? Ono to se stvarno upisuje u FLASH MCU-a su samo instrukcije, a sve ostalo to se nalazi u samom HEX-u potrebno je da bi se znalo kamo to treba upisati. Dakle u FLASH MCU-a ne ide HEX, nego samo instrukcije za jezgru. HEX je takav kakav je samo da bi protokol upisivanja FLASH-a znao kamo to upisati, pa mogu zakljuiti kako za prvi red HEX-a u MCU FLASHA biti e upisane samo instrukcije: 19C0 20C0 1FC0 1EC0 1DC0 1CC0 1BC0 1AC0 Istinski FLASH u AVR-u nije HEX, nego samo instrukcije poslagane upravo onako kao HEX file opisuje. "U potrazi za tartufima AVR-a" Misija - 1. Upaliti LED (2. dio) U C-u je neto kompliciranije upravljati pojedinim izlazima na MCU. Jasno je kako se LED dioda nalazi na PC0, no postavlja se pitanje kako da upravljate sa PC0, a ne dirate ostale linije porta C?

Ako vi izjednaite registar smijera podataka sa nekim brojem "DDRC = 1;" upravo ste prepisali svih 8 bitova. DEC "1" je BIN "00000001" to bi znailo da je zadnji desni bit PC0. injenica je da smo mi na tonu poziciju upisali "1", ali je isto tako injenica da smo na sve ostale linije upisali ponovno "0", a to nismo eljeli. to ako je neki od njih bio "1" i morao ostati "1" ? Moda se pitate zato u C-u "AVR Studio, WINAVR" ne postoji ono PC1, PC2, PC3, pa da mi mozemo upisati samo jedan bit a ne svih 8? Odgovor na to pitanje isto je politike naravi: Programski jezik C je striktan sa puno pravila kojih se moramo drati u programiranju. Neki alati C-a tipa "codevision" imaju implementiranu mogunost jednostavnog pristupa "bit-u", dok veina njih nema... No da se mi ne bavimo politikom, prava pravila C-a nemaju nikakve komande tipa PC0, PC1, PC2 ( na bazi jednog bita) i upravo zato AVR studio nije htio kriti pravila C-a i napraviti nekakve svoje komande koje ne postoje u programskom jeziku C. Jednom "bit-u" u AVR Studiu pristupamo operatorima "AND" i "OR" 1. Postavljanje prvog desnog bita (PC0) DDRC registra u logiku jedinicu radimo ovako: DDRC |= (1