Atmel Flash RISC Mikrokontroleri
Verovali ili ne, mozete imati flash i RISC sve spakovano u 8-bitnu arhitekturu pin
kompatibilnu sa 8051. Kao od Boga poslato? Evo prikaza jednog inžinjera.
Bolje, Brze, Manje, Jeftinije, Lakše ili Ispadaš. Iako inžinjeri teže za necim novim i
boljim, teško je uhvatiti se u koštac sa novim mikrokontrolerima pogotovo kada je rok za
završetak projekta juce prošao. Nedavno sam se susreo sa problemom gde mi standardni
8051 nije bio dovoljan. Rešenje sam našao u Atmelovoj flash, 8-bitnoj RISC arhitekturi
zvanoj AVR.
U ovom pregledu AVR arhitekture fokuširaću se na ono što je jedinstveno za ovu
arhitekturu. Prvo ću diskutovati ovu familiju uopšteno.
Nešto zajedničko
Svi smo culi reklame za flash memoriju koje isticu njene prednosti u odnosu na OTP-EPROM.
I zaista je tako, što moze da se vidi po rastucem broju kupaca mikrokontrolera sa flash
memorijom.
Kao i Atmelovi 8051 kompatibilni mikrokontroleri i mikrokontroleri iz porodice AVR sadrze
flash memoriju. AVR je pin kompatibilan sa Atmelovom 51 serijom (sa izuzetkom reset pina
koji je aktivan na nizak nivo). Svi AVR mikrokontroleri imaju integrisan EEPROM za
promenljive. Flash i EEPROM se mogu programirati dok se nalaze na razvojnoj ploci preko
sinhronog serijskog interfejsa. Ovo vazi za sve mikrokontrolere iz serije a ne samo za
najbolje, kako je inace obicaj kod proizvodaca. Takode, postoji zaštita neovlaštenog
citanja memorije preko lock bita.
Ostale prednosti vezane za sve AVR cipove jesu odvojeni interapt vektor za svaki interapt
izvor, analogni komparator koji je takode sam izvor interapta, barem jedan eksterni
interapt pin, barem jedan brojac-tajmer visoke rezolucije, watchdog tajmer (programabilan
od 16ms do 2s) i 32 odvojena 8-bitna akumulatora koji se mogu koristiti u parovima sa
16-bitnim operacijama.
Nedostaci
Ne volim da pišem o ogranicenjima na samom pocetku clanka iz straha da bi to odbilo
citaoca. U ovom clanku je to neophodno jer cemo se kasnije na ta ogranicenja osvrtati.
Jedna beznacajna mana svih clanova familije je da samo gornja polovina akumulatora (R16 -
R31) podrzava "immediate" operacije koje sadrze konstante. Razlog za ovo
ogranicenje nije ocigledan. Mozda je to kompromis koji je morao biti napravljen da se
ostavi prostora za druge vazne operacije.
Neobicno je da nema ADD IMMEDIATE naredbe. Mozete postici istu stvar preko makroa koji
zamenjuje SUBI instrukciju bez razlike u velicini koda. Morate biti pazljivi sa flegovima
zato što oduzimanje invertuje Carry i Half-carry od onoga što bi se normalno ocekivalo
od ADD instrukcije. Medutim, postoji prava ADD instrukcija koja sabira sadrzaje bilo koja
dva registra i deluje na flegove na normalan nacin za ADD instrukciju.
Više instrukcija, više MIPS-ova
AVR koristi, takozvanu, naprednu RISC (Enhanced RISC) arhitekturu. Ona je napredna u
smislu da ima od 89 do 120 razlicitih instrukcija, mnogo više nego što bi ocekivali od
tradicionalnog RISCa. U duhu RISCa ova arhitektura izvršava instrukciju u jednom taktu,
što joj omogucava dostizanje 16 MIPS sa kristalom od 16MHz. U tipicnim primenama prosecan
broj MIPS ide od 80% do 90% frekvencije, uglavnom zbog instrukcija grananja.
Vecina proizvodaca tvrdi da im se instrukcije izvršavaju u jednom ciklusu. Medutim
definicija ciklusa se razlikuje od proizvodaca do proizvodaca. Obicno treba duboko kopati
da bi se pronašlo da se ciklus zapravo sastoji od 4, 6 ili više perioda oscilatora. Neki
idu cak toliko daleko da koriste rec clock u znacenju CPU cycle dalje povecavajuci zabunu.
Kompaktniji kod?
Nagovestio sam da se sa AVR moze dobiti kraci kod. Pitate se: uporedujuci sa cim? To je
pravo pitanje, a evo i odgovora: zavisi. Na primer, 8051 ima operacije nad pojedinacnim
bitima. Ukoliko one cine veliki deo koda, mozda necete dobiti manji kod sa AVR. Medutim,
99.9% primena sadrze mnogo više drugih operacija.
Velik broj instrukcija znaci manje linija koda za implementaciju date funkcije. Sledeca
karakteristika koja omogucava visoku gustinu koda je korišcenje arhitekture bazirane na
registrima. Ona omogucava operacije nad podacima u registrima bez njihovog premeštanja u
i iz akumulatora.
Sposobnost grananja na osnovu bilo kog bita u statusnom registru, takode pomaze izradi
manjeg koda. Postoji 16 razlicitih uslova grananja. Neki od aritmetickih uslova su
bazirani na više bita u statusnom registru. Povrh svega je mogucnost da se preskoci
sledeca instrukcija na osnovu stanja bilo kog bita unutar 32 registra ili unutar donje 32
adrese I/O prostora. Zahvaljujuci tome moguce je direktno proveriti stanja portova ili
stanja flegova. Postoji mogucnost specijalnog preskoka ukoliko je sadrzaj bilo koja dva
registra jednak (CPSE).
Poboljšana gustina koda moze vam uštedeti novac jer dozvoljava da upotrebite manju
komponentu. Medutim, na osnovu mog iskustva to obicno znaci dodavanje novih opcija ili
ostavljanje prostora za buduci razvoj. Koliko je stvarno poboljšanje? Projektanti AVRa su
konvertovali najefikasnije kodove napisane za razne mikrokontrolere. Oni tvrde da su
dobili 10 - 30% manji kod bez obzira na stvarni format memorijske reci (na primer, 1K*8
ili 512*16). Manji kod se brze izvršava (za manje instrukcija treba manje ciklusa takta).
Sadašnji AVR mikrokontroleri ne podrzavaju spoljnu programsku memoriju jer bi u tom
slucaju bio potreban veliki broj pinova.
Matematika
Skoro sve primene zahtevaju neku matematiku. Sve logicke operacije (AND, ANDI, OR, ORI,
EOR, COM) se izvršavaju u jednom taktu i rade sa bilo koja dva registra ili registrom i
konstantom. Takode, postavljanje registara na nulu ili jedinice izvršava se u jednom
taktu. Bilo bi lepo da postoji immediate mode ekskluzivno ili (EORI) ali na zalost to nije
slucaj. Umesto toga treba staviti konstantu u bilo koji registar pa zatim uraditi EOR
izmedu dva registra.
Osmobitna aritmetika nije problem za vecinu procesora, iako neki nemaju ni oduzimanje ni
oduzimanje sa carry flegom. AVR ima sve to, kao i nedestruktivne instrukcije poredenja.
Kod 16-bitne i 24-bitne matematike AVR dolazi do izrazaja. Trik je u tzv. Zero-flag
propagaciji (ZFP).
ZFP postavlja Z fleg na nulu ukoliko je rezultat poredenja razlicito; inace fleg se ne
menja. Ovo se lako koristi u praksi. Sledeca sekvenca poredi dva 32-bitna broja u 4 takta:
cp r0,r4
cpc r1,r5
cpc r2,r6
cpc r3,r7
Brojevi mogu biti bilo oznaceni bilo neoznaceni. Na kraju poredenja mogu se koristiti
sledeci flegovi: vece od, manje od, vece ili jednako, manje ili jednako, jednako. Na
procesorima bez ZFP za ovo bi trebalo mnogo više linija koda.
Kao sledece posmatrajmo mnogo jednostavniji zadatak: poredenje dva oznacena 16-bitna
broja. Kada ne bi bilo ZFP trebalo bi uraditi sledece tri stvari: provera da li su viši
bajtovi razliciti, provera da li su viši bajtovi jednaki dok su nizi bajtovi razliciti i
na kraju provera da li su nizi i viši bajtovi jednaki. Rezultat poredenja vece ili
jednako na poštovanom 8051 zahteva 9 bajtova koda uz pretpostavku da su vrednosti koje
poredimo vec smeštene u registre R0-R3. AVRu je za tako nešto potrebno samo 4 bajta (dve
reci) i dva takta. To je 56% smanjenja u velicini koda.
ZFP se takode koristi kod oduzimanja (SBC, SBI). Razlog tome je verovatno brojac petlje
gde se brojac obicno smanjuje do nule. Cudno je što sabiranje medu registrima (ADD) ne
koristi ZFP tako da Z fleg nece pravilno ukazati da je rezultat nula ukoliko vršimo
sabiranje 16-bitnih i vecih brojeva.
Prednosti u slucaju baterijskog napajanja
Smanjivanje potrošnje je moguce drasticnim snizavanjem frekvencije takta oscilatora. Na
primer, tamo gde se na 8051 zahteva rad sa 12 MHz kristalom kada bi upotrebili AVR bio bi
dovoljan kristal od 1 MHz (potrošnja CMOS kola je srazmerna frekvenciji takta).
Snizavanjem frekvencije takta smanjuje se i RF zracenje.
AVR je ekspert za rad pri niskim naponima napajanja. Standardno dostize 4 MIPS na samo
2.7V. Poredenja radi, da bi isto postigli i sa 8051 potreban bi nam bio kristal od 48MHz!
Na osnovu mojih testova, AVR moze da radi i pri nizim naponima napajanja od 2.7V ukoliko
se uspori takt ali to nije kataloški zagarantovano. AVR ima uobicajene modove rada koji
štede struju ukljucujuci i sposobnost budenja na interapt. Na 3V AVR troši 11(A u sleep
modu sa ukljucenim watchdog tajmerom. Ako se watchdog tajmer iskljuci potrošnja pada
ispod 1(A.
Moguce je ostvariti budenje sa programiranim kašnjenjem. Kada se to realizuje
zaustavljanjem kristala, potrebno je više vremena za stabilizaciju kristala pre nego što
procesor moze da radi.
AVR ne radi pouzdano na niskim frekvencijama (32kHz), niti mu je potrošnja mala, kao što
bi se ocekivalo. Ako mikrokontroler treba nešto da radi periodicno bolje je da radi na
višoj frekvenciji. Posle uradenog posla mikrokontroler se uspava a zatim ga watchdog budi
periodicno.
Arhitekturna višejezicnost
AVR arhitektura je projektovana za C jezik. Sa njegova tri pointer registra (X, Y, Z) i
automatskim uvecavanjem i umanjivanjem registara, on sadrzi osobine koje olakšavaju
proizvodacima pisanje C kompajlera sa dobrim optimizacijama.
Za pristup podacima u tabelama koristi se data indirect with displacement nacin
adresiranja. Pointer registar se napuni sa baznom adresom tabele. Pristup bilo kom
elementu tabele se vrši preko 6-bitnog ofseta koji je sadrzan u instrukciji.
Jedan lep dodatak setu instrukcija (nije bio u verziji AVR 1996) je mogucnost da se doda
mali pozitivan ofset bilo kom od gornja 4 registarska para preko ADIW (ADD immediate to
word). Ova karakteristika podrzava ne samo tri pointer registra nego i registarski par
R25/R24. Stoga, ovaj registarski par postaje narocito koristan za asembler programere kao
matematicki registar opšte namene.
AT90S1200
Prva AVR komponenta je AT90S1200. Ona poseduje 512 reci 16-bitne programske memorije i 64
bajtova EEPROM-a. Iako ne sadrzi pravi SRAM za podatke (kao što je to slucaj sa ostalim
clanovima familije), 1200 sadrzi standardnih 32 akumulatora koji mogu posluziti kao SRAM.
1200 je projektovan da bude jeftiniji u odnosu na svoju veliku bracu. Programiranjem
fleša projektant moze da koristi ugradeni oscilator na 1MHz umesto skupog spoljnog
kristala ili rezonatora ukoliko mu tacnost oscilatora nije kriticna. Ugradeni watchdog
tajmer, komparator i 15 linija porta pomazu smanjivanju broja okolnih cipova. Kako je
EEPROM takode na cipu I/O linije ostaju slobodne za druge potrebe.
Ono što nedostaje je UART, potpuniji tajmer, SRAM i SPI port. Mikrokontroleri sa 1K i 2K
imaju SPI ali samo za programiranje ugradene fleš memorije. Sa visokim performansama
mikrokontrolera lako se mogu emulirati nedostajuce periferije. Atmel ima nekoliko clanaka
koji opisuju kako se to izvodi (www.atmel.com).
I/O portovi su fleksibilni, sa pet modova rada: ulaz visoke impendanse (manje od 1(A
struje curenja), ulaz sa pull-up otpornikom, izlaz koji daje do 4mA i guta do 28mA,
open-drain izlaz ili open-drain izlaz sa pull-up otpornikom. Portovi su organizovani na
nacin koji je lak za programiranje. Postoje posebno izlazni lec, ulazni bafer i registar
koji ukazuje na smer podataka.
Nezgodna situacija moze da nastupi kada koristite spoljne bus periferije. Svi
mikrokontroleri zahtevaju sinhronizovani lec na ulaznim portovima kako bi se redukovao
problem sa metastabilnošcu i da bi se dalo više rezervnog vremena. Na vecini
mikrokontrolera, ovi lecevi su podešeni tako da se ukljuce pre port instrukcije (kao što
je in). Pošto ti mikrokontroleri ne koriste višefazni klok, lec se menja na svakom
ulaznom pinu u novi podatak iskljucivo na kraju svake instrukcije. Ako koristite
periferije promenom pojedinacnih pinova porta (umesto eksternim memorijskim mapiranjem),
mozete zapasti u nevolje kada ih citate.
Sledeci primer ce pomoci da sve ovo postane jasnije. Recimo, port B je rezervisan za
periferijski data bus. Port D0 je uzet kao /read signal.
cbi PORTD,0 ;I/O bit PD0=0 ;(/READ signal aktivan)
in r20,PINB ;cita podatke od
;periferije
sbi PORTD,0 ;I/O bit PD0=1
;(/READ signal neaktivan)
Na prvi pogled izgleda super, ali ne radi. Instrukcija cbi ima efekta na kraju kloka.
Instrukcija in koristi ono što je vec u ulaznom lecu tj. podatke prisutne na portu pre
nego što je /READ linija postala aktivna. Sadrzaj ulaznog leca nece se menjati sve do
ivice kloka na kraju in instrukcije. Tu se upravo nalazi teškoca.
Da bi stvar radila mozete staviti NOP pre in instrukcije. Medutim, postoji elegantnije
rešenje:
cbi PORTD,0 ;I/O bit PD0=0
;(/READ signal aktivan)
sbi PORTD,0 ;I/O bit PD0=1
;(/READ signal neaktivan)
in r20,PINB ;cita podatke od
;periferije
Preuredivanjem poslednje dve instrukcije dobija se da sada in instrukcija koristi podatke
koji su prisutni pre deaktiviranja /READ linije. Na ovaj nacin ostavljen je pun jedan
period kloka za pristup periferiji. Ako je to brzo, NOP-ovi se mogu ubaciti izmedu cbi i
sbi.
RAM memorija
Kao što je slucaj sa vecinom jeftinijih procesora problematicna tacka AT90S1200 je
velicina RAM memorije. Pošto raspolazemo samo sa 32 registra moramo pazljivo trošiti
svaki bit. Srecom, postoje instrukcije koje omogucavaju operacije nad bitima, tako da nije
sve izgubljeno.
Cak i ako se koristi sedmobitna promenljiva moze se iskoristiti i osmi bit bajta kao
jednobitni fleg. Upozorenje: bite unutar istog bajta ne bi trebalo da dele glavni program
i interapt servis rutina (ISR).
Kada imamo brojac manji od osam bita, jedan od nacina je da ih smestimo u gornji deo bajta
a da donji deo bajta iskoristimo za promenljivu koju necemo uvecavati ili umanjivati.
Promena brojaca je bezbolna (ADDI) i dobija se automatska indikacija dolaska brojaca na
nulu (preko carry flega).
Na primer, ukoliko gornja tri bita cine brojac, uvecavanje bez uticaja na donje bite se
moze ostvariti sa ADDI r??,0x20. Medutim, treba zapamtiti da ne postoji prava ADDI
instrukcija vec se vrši SUBI r??,(-0x20). Po oduzimanju carry fleg je invertovan tako da
je brojac na nuli kada je carry fleg nula posle SUBI. Suprotno tome, kada je carry fleg
setovan svi biti brojaca nisu nula.
ISR i rukovanje stekom
Pošto 1200 nema data SRAM, projektanti mikrokontrolera su ugradili stek sa tri nivoa za
potrebe podprograma i interapt rutina. Ugradeni stek sluzi iskljucivo za cuvanje povratnih
adresa. Ne postoje PUSH/POP instrukcije za ovaj mikrokontroler (drugi clanovi familije
imaju ove instrukcije). Ako ne koristite ugnjezdene interapte i ne koristite podprograme
unutar interapta, onda u glavnom programu mozete pozivati podprograme do dva nivoa.
Iako svi drugi clanovi familije podrzavaju C, 1200 ne podrzava C sem ako se koriste
iskljucivo globalne promenljive. Razlog tome je što se u stek ne mogu smeštati podaci
nego sluzi samo za povratne adrese.
Statusni registar (SREG) se ne cuva automatski pri pozivu interapt rutine. Jedan nacin je
da rezervišete registar za cuvanje SREG, a drugi je da ne koristite instrukcije koje
uticu na SREG. Druga opcija je realna pošto postoji mnogo instrukcija koje ne uticu na
flegove.
Dobro je koristiti R0 kao registar za cuvanje SREG jer su gornji registri dragoceni za rad
sa immediate-mode instrukcijama. U vecim AVR mikrokontrolerima R0 ima specijalnu funkciju:
pri radu sa look-up tabelama podaci završavaju u R0.
U praksi, cuvanje flegova je jednostavno: in R0,SREG ih cuva, dok ih out SREG,R0 vraca.
Kada je problem dubina steka, korisno je upotrebljavati neki alternativni metod umesto
CALL/RETURN metoda. Ako je potrebno nekoliko puta pozivati neki veliki podprogram (npr.
matematicku funkciju), efikasno je koristiti nekoliko slobodnih bita u vec delimicno
korišcenom registru za ukazivanje na tacke povrataka. Razmotrimo sledece:
.reg SIXBITS =R16 ; koristimo donjih
; 6 bita
.equ MYRET1 0x00 ; omogucava upotrebu
; viših bitova
.equ MYRET2 0x40
.equ MYRET3 0x80
.equ MYRET4 0xC0
Listing 1 prikazuje iskorišcenje dva gornja slobodna bita.
Listing 1.
;(Ovaj prvi ORI ne mora tu da stoji, ali je ostavljen zbog jasnoce)
ori SIXBITS, MYRET1 ;povratak je na HERE
rjmp BIG_MATH
FAKE_RET1:
...
ori SIXBITS, MYRET2
rjmp BIG_MATH
FAKE_RET2:
...
ori SIXBITS, MYRET3
rjmp BIG_MATH
FAKE_RET3:
...
ori SIXBITS, MYRET4
rjmp BIG_MATH
FAKE_RET4:
...
BIG_MATH:
; prevelik da bi bio napisan više puta
...
addi SIXBITS, 0x40 ;pogledaj da li je u granicama od 0xC0 do 0x00
brcc FAKE_RET4 ;pazi, sa ADDI C flag je invertovan!
addi SIXBITS, 0x40 ; ponovo dok ne završi
brcc FAKE_RET3
addi SIXBITS, 0x40
brcc FAKE_RET2
addi SIXBITS, 0x40
rjmp FAKE_RET1
Treba primetiti da nismo proveravali ZERO uslov, jer donji biti u registru ne moraju biti
nula. Umesto toga, proveravamo carry. Pošto je carry fleg invertovan kada se izvrši ADDI
instrukcija (u stvari izvrši se SUBI Rx,-K), carry ce biti nula kada su gornja 4 bita
nula.
Prikazani kod ima 11 reci više od programa koji bi koristio CALL, ali je uštedeo jedan
nivo steka. Svakako to je bolje od više kopija iste procedure. Ukoliko je potrebno manje
tacaka povrataka, navedeni kod se moze prema tome smanjiti.
Kada neki kod treba da se izvrši samo dva puta moze se koristiti T-fleg. On se setuje pre
pocetka koda i proverava se na kraju koda. Ako je T-fleg setovan postavi se na nulu i
vrati se na pocetak. Kada se sledeci put stigne do kraja T-fleg ce biti nula tako da ce
program nastaviti dalje.
Analogni komparator
Ukljuceni AVR komparator troši oko 0.5mA (moguce ga je iskljuciti radi štednje struje).
Zajednicki ulazni napon (common-mode input range) krece se u granicama napona napajanja
umanjenog za 100mV. Promena stanja se odigra za manje od 200ns pri napajanju od 5V bilo da
se radi o velikim ili malim signalima (testirano je pri 5V i 25mV). Ulazi komparatora su
ujedno i portovi PB0 i PB1. Velika prednost toga je mogucnost da se bilo koji ulaz veze za
bilo gornje bilo donje napajanje. To je narocito korisno kada se pravi A/D konvertor jer
je moguce vezati integrirajuci kondenzator za masu bez korišcenja dodatnih I/O pinova.
Izlaz komparatora je jedan od izvora interapta. Takode je prisutan i u statusnom registru.
Moze se odabrati izazivanje interapta na visoki nivo, niski nivo ili na promenu stanja.
Takode je moguce napraviti budenje iz idle moda koristeci komparator, mada to nije
preporucljivo zbog relativno velike struje komparatora u odnosu na struje idle moda.
Ako ste ocajni, mozete koristiti komparator kao izvor spoljnog interapta. Za to je
potreban najmanje jedan spoljni otpornik (ukljuciti unutrašnji pull-up tako da je
potreban samo spoljašnji pull-down) da postavi drugi ulaz komparatora na neki nivo izmedu
napona napajanja.
Operacije nad bitovima
Kod mnogih primena vazne su operacije nad bitima za gustinu koda i brzinu. Shvatajuci to
projektanti AVR mikrokontrolera ugradili su neke lepe osobine u cip.
Moguce je setovati ili resetovati više bita unutar bilo kog od gornjih 16 registara i to
u jednom taktu. Takode je moguce setovati ili resetovati bilo koji bit u bilo kom od 32
I/O registra u dva takta. Treba primetiti da je to read-modify-write operacija i da je
garantovano da ce rezultat biti korektan zahvaljujuci postojanju odvojenog izlaznog
registra i ulaznog bafera. Mikrokontroleri koji nemaju odvojene registre ne mogu
garantovati ispravan rad, vec se o tome morate postarati sami.
Bitima status registra (SREG) se takode moze pojedinacno pristupati. T-fleg je narocito
zanimljiv jer se moze vršiti grananje na osnovu njegove vrednosti, a moze se i kopirati u
i iz bilo kog registra. Na T-fleg ne utice ni jedna druga operacija.
Tu je i SWAP funkcija koja menja visoki i niski nibl (4 bita) bilo kog registra. To je
korisno za pakovanje i odpakivanje kada radimo sa EEPROMom, LCD displejom i sa BCD
pakovanim podacima.
Alati za razvoj programa
Radi lakšeg prelaska na novu arhitekturu, Atmel nudi besplatno set Windows baziranih
alata. U te alate su ukljuceni: makro asembler, softverski simulator i AVR Studio. Meni,
licno, se dopadaju svi ovi alati. Simulator cak simulira tajmer/brojac interapt
automatski. Takode prati klok cikluse, tako da se lako mogu proveriti performanse
pojedinih kriticnih rutina. Ja sam ga koristio za proveru matematickih funkcija koje bi
bilo teško proveriti starim burn-and-churn metodom.
Kada se radi o burn-and-churn metodima, moram reci da testiranje manjih kolicina koda i
nije tako teško jer zahvaljujuci fleš memoriji sve moze da se obavi u sekundi: izmena,
kompajliranje, upis u fleš.
Atmel ima svoj programmer/prototyping board MCU00100, koji sadrzi Windows programe,
tastere i LED diode.
Jedini C kompajler proizvodi IAR Systems. Njihova najjeftinija verzija (795$) po ANSI
standardu radi punu optimizaciju ali je ogranicena na 8K koda i ne ukljucuje matematicke
biblioteke za rad sa pokretnim zarezom.
Zakljucak
Pošto sam radio sa AVR, nekoliko dodatnih stvari bih voleo da vidim u setu instrukcija.
Jedna od njih bi bila mogucnost invertovanja bita u I/O u jednoj instrukciji (trenutno se
bit moze samo setovati ili resetovati). Druga stvar bi bila mogucnost invertovanja T-flega
u jednoj instrukciji.
Nekada je potrebno preskociti više od jedne instrukcije. Zato bi bilo pozeljno imati duze
preskoke (mozda dve, tri ili cetiri instrukcije). Još bolje bi bilo kada bi postojala
grananja zasnovana na bilo kom bitu u bilo kom registru. Medutim, kada se uradi malo
matematike jasno je zašto to ne postoji: jedan bit bio bi potreban za set ili reset, tri
bita za adresiranje jednog od osam bita u registru, pet bita za adresiranje registra, i
šest bita za definisanje velicine skoka. To je ukupno 15 bita što ne ostavlja baš mnogo
prostora za druge instrukcije. Ali mogu da sanjam, zar ne?
Sve nabrojane mane mogu se prevazici u softveru. Samo je potrebno malo više koda. Cak i
tako AVR mikrokontroler prevazilazi sve druge 8-bitne mikrokontrolere koje ja znam. Sve u
svemu, AVR je nešto novo u svetu 8-bitnih mikrokontrolera. Ono što je nekada bilo
nemoguce za jeftini mikrokontroler odjednom je lako dostizno. Sa pojavom AVR
mikrokontrolera 8-bitni svet izgleda mnogo manje ugrozen od strane vecih mašina.
Literatura
* Atmel AVR Microcontroller Data Book. San Jose, CA: Atmel, May 1997.
* Atmel CD-ROM Databook. San Jose, CA: Atmel, June 1997.
* www.atmel.com . Atmel Web site.
* www.iar.com . IAR Systems Web site (makers of the C
compiler).
* www.equinox-tech.com . Equinox Technologies
Web site (download tools).
Izvor teksta: Embedded Systems
Programming
| Pročitajte
više o ovoj temi |
|
|
|