 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pet Sep 10, 2010 11:41 pm Naslov sporočila: Mala šola AVR - 1.dan |
|
|
Ko bom končal, bom sporočilo odprl za razpravo. Če že sedaj koga kaj zanima lahko piše v Kako začeti z AVR II
Ta naš tečaj bom skušal razdeliti, kot sem že v uvodu napisal na en teden. Prvi dan želim predvsem predstaviti sam mikrokontroler oz. uporabo datasheta za njega.
Vedeti je potrebno, da je sama dokumentacija najboljša literatura ter pomoč pri programiranju. Razne knjige pa so v glavnem bolj ali manj posrečeni prevodi take dokumentacije. Zelo pomembno je tudi, da datashete pregledamo preden sploh začnemo programirat, ne pa kot je pri navodilih v navadi – takrat ko zaidemo v težave. V 'prvem dnevu ' bomo pred vsem prelistali datashet. Skozi tole sporočilo bom skušal opozoriti na pomembne zadeve. 'Obdelali' bomo zadeve, ki so skupne ali podobne pri z drugimi mikrokontrolerji. V prilogi je datasheet (če ga niste sneli s proizvajalčeve strani)
Na prvi strani najdete osnovne lastnosti ter karekteristike mikrokontrolerja. Te podatke je dobro pregledat, pred izbiro mikrokontrolerja za našo aplikacijo.
Vidimo, da tiny13 razume 120 instrukcij ne glede na to kako programsko orodje se uporablja. Sam nabor je opisan na v 21 poglavju oz. 159 strani. Podrobnosti bomo obravnavali, ko bomo prišli do programiranja (nekje drugi ali tretji dan) Instukcij je lahko več (ali manj) pri drugih mikrokontrolerjih.
- Ima tudi 32 splošno namenskih registrov. (velja za vse avrje serije tiny ali mega)
- Ima 1k programskega pomnilika
- Ima še 64 bajtov EEproma ter 64 bajtov Srama.
(različni mikrokontrolerji se razlikujejo po količini pomnilnika,rama in eeproma)
Proizvajalec garantira 10 000 vpisov v flash ter 100 000 vpisov v eeprom
Garantira tudi hrambo podatkov 100 let pri temperaturi 25°C
Program v mikrokontrolerju je možno zakleniti.
Mikorokontrolerji se razlikujejo po vgrajeni periferiji.
Naš ima en 8 bitni števec z preddelilnikom 2 PWM kanala 4 analogne 10 bitne vhode, analogni komparator, interni oscilator. Možnost zunanje prekinitve ter 9 raznih drugih prekinitev. (Poglavje 9 stran 44)
Ima možnost zmanjšane porabe ter 'spanja' (recimo baterijsko napajane aplikacije)
Programiramo ga lahko serijsko. (ISP)
Standardna izvedba je za napetost 2.7 - 5.5V, 0 - 20 MHz posebna pa dela že pri 1.8V
Obstaja v več izvedbah ohišij 8-PDIP/SOIC, 20-QFN/MLF (stran 2) Tam najdete tudi razpored oz. pinout….
Nadaljevanje sledi...
Opis: |
|
 Download |
Ime datoteke: |
tiny13.PDF |
Velikost datoteke: |
3.07 MB |
Downloadano: |
155 krat |
_________________ lp
Silvo
Nazadnje urejal/a Silvo Sob Sep 11, 2010 9:48 am; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Sep 11, 2010 9:40 am Naslov sporočila: |
|
|
V nadaljevanju opis sestave mikrkokontrolerja. Opisal bom glavne značilnosti, ki jih najdete tudi pri drugih primerkih iste družine.
Flash programski pomnilnik: (poglavje 5 stran 15)
Pomnilnik je mesto, kamor zapišemo naš program. Velikost pomnilnika je običajno sorazmerna zmogljivosti mikrokontroljer-ja. (Običajno merilo je že kar število pinov. Večji je bolj bo zmogljiv)
Programski pomnilnik danega primerka je velikosti 1k. Ker so instrukcije 16 ali 32 bitne, je pomnilnik organiziran v 512 x 16 bit. Pomnilnik se razteza od lokacije 0x0 do 0x1ff. Naslavlja ga programski 9 bitni programski števec. (več o tem v 'dnevih' programiranja) V primerkih, kjer je flash-a več je tudi programski števec ustrezno večji, da lahko naslovi celoten flash. Mikrokontroler razume le strojni jezik, torej le neko 16 ali 32 bitno številko. Ne glede na to v kakem jeziku je programirano, prevajalnik mora naš program pretvoriti v 'strojno kodo'. Od tega, koliko zna optimalizirati našo kodo zavisi tudi koliko pomnilnika bo zasedel naš program. Pri assemblerju gre praktično za direkten prevod. To pomeni, da bo količina porabljenega pomnilnika odvisna le od programerja.
Proizvajalec zagotavlja 10 000 vpisov v pomnilnik. (osebno se mi še ni zgodilo, da bi mi kdaj kak mikrokontroler odpovedal zaradi tega).
Pomembno:
V flash programskem pomnilnik podatke zapišemo s programatorjem. Po zapisu podatki ostanejo ohranjeni tudi po izklopu napetosti.
SRAM podatkovni pomnilnik (poglavje 5.2 stran 16)
Sram je 8 biten. Spodnjih 32 bajtov zasedajo splošno namenski registri. Sledi 64 delovnih IO registrov. Preostanek bajtov je SRAM. Velikost samega pomnilnika zavisi od zmogljivosti mikrokontrolerja. S tem, da imajo vsi primerki iste družine 32 splošno namenskih registrov. Sram je programski pomnilnik, v katerem se podatki ob izgubi napetosti NE ohranijo. Stanje po resetu je v SRAM-u nedefinirano. Stanje delovnih registrov pa je lahko različno. Za vsak posamezen register je podroben opis v samem datashetu. Zbir registrov je v poglavju 20 stran 156. Pomembne registre bomo obdelali v nadaljevanju.
EEPROM:
Dani primerek ima 64 bajtov eeproma. Eeprom je 8 biten. V eeprom lahko pišemo programsko ali s programatorjem. Podatki v njem ostanejo ohranjeni tudi po izklopu. Proizvajalec zagotavlja 100 000 vpisov.
Nadaljevanje sledi...
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Sep 11, 2010 1:52 pm Naslov sporočila: |
|
|
Registri: (poglavje 4 stran 10)
Družina AVR ima 32 splošno namenskih registrov. Zgornjih 16 znajo uporabljati vse instrukcije, pri spodnjih pa smo nekoliko omejeni. Prav tako imamo nekaj registrov kot so R0,R26-31 ki so več funkcijski. Recimo omogočajo indirektno naslavljanje, branje pisanje. V podrobnejši opis X,Y,Z registrov se sedaj ne bom spuščal, kajti v tem datashetu ni posebne razlage. Če bo čas dopuščal se bomo stvari dotaknili pri praktičnem programiranju.
Imamo 64 takoimenovanih sistemskih registrov. (poglavje 20, stran 156) Seveda jih naš tiny nima toliko. Lokacije registrov, ki jih ni (najdemo jih pa pri drugih mikrokontrolerjih) so prazne ter označene z 'reserved'.
Vsi registri so 8 bitni. Do njih se lahko dostopa direktno ali indirektno. Po večini so bralno/pisalni. Skratka odvisno od namena posameznega registra. Opisal bom nekaj osnovnih, katere najdemo pri vseh mikrokontrolerjih v družini.
Prvi je SREG, tako imenovani statusni register. (poglavje 4.3.1 stran 9) SREG je dejansko vez med procesorjem ter programom. V SREG registru se postavljajo oz. brišejo določeni biti glede na trenutno izvedene aritmetične instrukcije. (poglavje 20 stran 156) zraven opisa posamezne instrukcije je stolpec 'Flags' z seznamom bitov, na katere ima vpliv določena instrukcija. Glede na postavljene/obrisane bite potem programsko usmerjamo program. (več v praktičnih primerih)
Naj opišem še tri registre s katerimi določimo lastnosti vhodno izhodnih pinov. AVR v ta namen uporablja tri registre PORTx PINx ter DDRx (x je lahko A,B, C… zavisi koliko ima portov določen mikrokontroler)
(poglavje 10.2.1 stran 50 tabela 10.1) V tabeli vidimo, kako bo stanje I/O pinov glede na postavljene bite posameznega registra. Po resetu je v vseh treh registrih stanje 0, kar pomeni, da so vsi pini definirani kot visokoomski vhodi. (poglavje 10.4 stran 56) Z registrom DDRx določimo lastnost pina izhod/vhod. Postavljen bit pomeni izhod. Z registrom PORTx določimo kako bo stanje na pinu. V primeru postavitve bita na 1 bo v primeru, da je predhodno bil pin definiran kot izhod stanje 1. V koliko pa je pin vhod smo mu s postavitvijo bita vključili pullup. Register PINx služi za logično branje stanja na pinu, v koliko je ta definiran kot digitalni vhod . V registru je po resetu nedefinirano stanje.
Toliko za uvod, glede sistemskih registrov. Posamezne registre, ki jih bomo kasneje uporabili pri programiranju bomo obdelali sproti. Nekaj osnov skozi datashet sem opisal. Sporočilo bom skozi nadaljevanje še dopolnjeval. Prav tako se bomo na to sporočilo vračali, ko bomo prišli na 'sledeči dan'.
Sporočilo odpiram za diskusijo. (na temo datasheta ter teorije oz. nejasnosti glede napisanega) Zvečer po 21h se lahko dobimo na ircu za diskusijo v živo. Če bo le ta plodna, bom vsebino prekopiral sem.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Sep 11, 2010 2:42 pm Naslov sporočila: |
|
|
Ja, to o registrih, je zanimivo, pred vsem, ker ne vem, katere registre smem uporabiti v svojih podprogramih in katere ne.
V svojih podprogramih običajno vržem nekaj delovnih spremenljivk na stack, na koncu podprograma jih pa vrnem. To pri AVR-ih ne gre direktno iz RAMA na Stack (ki je sicer tudi Ram, a na ta način prihranim kak byte. Mimogrede pri starih 8051 sem lahko direktno dal spremenljivko iz rama na stack) pač pa moram iz Rama dati vrednost spremenljivke najprej v register in šele potem na stack. To v praksi izgleda tako:
Na začetku podprograma:
Koda: |
Reg14 = I : Push R14
Reg14 = J : Push R14
Reg14 = K : Push R14
|
Reg14 in R14 sta seveda aliasa za isti register
Sedaj lahko v podprogramu uporabi delovne spremenljivko 'po svoje'.
Na na koncu pred Return pa njih vsebine vrnem, tako da glavnih program sploh ne ve, da sem si jih 'izposodil'.
Koda: |
Pop r14 : K = Reg14
Pop r14 : J = Reg14
Pop r14 : I = Reg14
|
Čisto po naključju sem izbral v ta namen Reg14, in dela, lahko pa bi tako sfižil program. Bilo bi pa dobro vedeti, katere registre smem brez škode uporabiti in katere ne.
Hvala.
Na žalost ne morem zvečer sodelovati na mircu.
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Sep 11, 2010 3:15 pm Naslov sporočila: |
|
|
Vilko, v podprogramih lahko uporabiš bilokateri register tudi tistega, ki ga uporablja kaka druga rutina. Na začetku rutine ga potisneš v sklad recimo push R12 v podrutini lahko delaš potem z registrom kar hočeš. Preden rutino zapustiš pa register vrni. pop R12 ... ret.
Ampak pazi - rutino ne sme prekiniti kaka prekinitvena rutina, ki ta register uprablja ter pričakuje v njem neko vrednost. Potem je lahko štala takoj tu.
Naj napišem še, da v sklad se beležijo le vrednosti ne pa tudi registri. Torej mimogrede lahko nastane zmešnjava, če nekaj pozabiš "pobrati". Ter bo tisto pobrano nekje drugje. Torej iz sklada je potrebno pobirati tako kot si v njega dajal. (kot karte iz kupa) Če je na kup najprej položil karto Janko nato Janez in nato Peter, mora s kupa karto najprej vzeti Peter nato Janez ter nazadnje Janko, če želi imeti vsak svojo karto.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3359 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Sep 11, 2010 6:15 pm Naslov sporočila: |
|
|
Se pravi, če te prav razumem tako:
Koda: |
Push R14
Reg14 = I : Push R14
Reg14 = J : Push R14
Reg14 = K : Push R14 |
in potem nazaj tako:
Koda: |
Pop r14 : K = Reg14
Pop r14 : J = Reg14
Pop r14 : I = Reg14
Pop r14 |
Silvo je napisal/a: |
Torej mimogrede lahko nastane zmešnjava, če nekaj pozabiš "pobrati". Ter bo tisto pobrano nekje drugje. |
Ja, to sem se naučil na trd način. In kako težko je potem najti tako napako!! Program gre v franže in nimaš nobene pametne indikacije zakaj. Podobno kot, kadar je področje za stack premajhno.
Pozdrav vsem udeležencem!
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Sep 11, 2010 7:11 pm Naslov sporočila: |
|
|
Sintaksa sicer ni assemblerska. Dejansko shraneš 4 vrednosti v sklad ter jih nato pobereš. Pobran register dobi enake vrednosti kot tisti na začetku. V danem primeru niti ne more priti do napake, ker je vedno v rabi r14
V assemblerju bi izgledalo takole:
Recimo rutino ki sem si jo izmislil bo uporabla registra r16, ter r17. Recimo, da sta registra v rabi že nekje ter hranita neko vrednost katero prejšna rutina pričakuje. Ker se bo vrednost registrov v MojiRutini zanesljivo spremenila. Rutina bo prebrala stanje na vhodih porta a in b ter ju shranila v registra r16 ter r17 potem bo "iskala" paralelno enake vhode ter tisto poslala na izhod portac
Predhodno sem vrednost registrov shranil v sklad. Po končani rutini pa sem jih vrnil nazaj.
Koda: |
MojaRutina:
push r16
push r17
;v moji rutini registra uporabim za potrebe rutine
; recimo jih uporabim za branje vhodov na dveh portih
in r16,PINA ;
in r17,PINB
and r16,r17
out PORTC,r16
pop r17
pop r16
ret
|
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|