www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Mala šola AVR - 1.dan

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Sep 10, 2010 11:41 pm    Naslov sporočila:  Mala šola AVR - 1.dan Odgovori s citatom

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...



tiny13.PDF
 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Sep 11, 2010 9:40 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Sep 11, 2010 1:52 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sob Sep 11, 2010 2:42 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Sep 11, 2010 3:15 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3359
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sob Sep 11, 2010 6:15 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Sep 11, 2010 7:11 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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