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 - 3.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: Čet Sep 16, 2010 4:55 pm    Naslov sporočila:  Mala šola AVR - 3.dan Odgovori s citatom

V preteklih dneh smo spoznavali mikrokontroler, obdelali smo rabo datasheta, skušal sem začetniku približati AVR studio. Rahlo smo se dotaknili tudi assemblerja. Skratka, če je začetnik spremljal ta 'dva dneva', praktično poskusil simulator je pripravljen na učenje tudi kakega višjenivojskega jezika. V nadaljevanju pa se bomo šli malo šolo assemblerja. Večina stvari se lahko poskusi na simulatorju. Če ima kdo programator, ter kako testno ploščo pa lahko poskusi v živo.
Časovne zakasnitve, pavze… To so nujne operacije v digitalni tehniki. Niti enega protokola ne bi šlo spisati brez njih. Ni komunikacije z LCD-jem, niti z senzorjem DS1820. Tole sem omenil namerno, ker sta omenjena elementa precej priljubljena pri učenju kakih višjih nivojskih jezikov. Ja, vsi ukazi vsebujejo tudi časovne zakasnitve. Ja pa bo nekdo napisal napišeš 'Wait' ali nekaj podobnega pa je pavza tu. Je, ampak to še zdaleč ni tako enostavno. Kot sem napisal v 'prvem dnevu' procesor razume le strojni jezik, ki je dejansko assembler. Prevajalnik nam prevede višjenivojsko kodo v strojni jezik. Procesor žal nima vgrajene neke periferije, ki bi služila direktno za meritev časa. V ta namen se sicer lahko uporabljajo, ter so temu tudi namenjeni razni vgrajeni števci. Lahko uporabimo kako iz med prekinitev, ki ji ti števci sprožijo ob prekoračitvi. Z ustreznimi korekcijami le tega lahko dobimo točen želen čas prekinitve. Način je pred vsem primeren za generiranje daljših pavz. (recimo tak način se lahko lepo uporabi za multipleksiranje led displeja. S prekinitvijo pa se lahko lepo meri čas. Izdelava digitalne ure z led displejem je recimo na tak način 'mala šala' )
Za generiranje kratkih pavz ranga uS ali mS se običajno uporabi kar izvajanje rutine v zanki. Tole bomo kot prvo obdelali v 'tretjem' dnevu.


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: Čet Sep 16, 2010 5:22 pm    Naslov sporočila:   Odgovori s citatom

Uporabili bomo kar kodo z prejšnega dneva. Namesto 'nop' med menjavo stanja pina z 1 na 0 bomo dopisali pavzo 100uS. Program v "pavzi" teče tako dolgo, da preteče 100uS. (kratek čas sem dal namerno, sicer bi preizkus na simulatorju trajal, trajal...)

Koda:
;-----------------------------------------
;Mala šola AVR 3.dan
;-----------------------------------------

.include "tn13def.inc"  ;napovemo INC datoteko za mikrokontroler katerega bomo pač uporabili
;.include  "moja.inc"


.def Vsota=r2                  ;def je assemblerjeva direktiva s katero lahko
                                    ;registrom določimo ime
.def tmp=r16
.def tmp2=r17



      
.macro    DolociSklad            ;primer makra brez parametrov
   ldi r16,low(ramend)
   out SPL,r16
.endmacro

#define PORTB0Izhod sbi DDRB,0    ;
#define B0_1 sbi PORTB,0
#define B0_0 cbi PORTB,0



;/////////////////////////////////////////////
;tukaj je naš glavni program
;vse kar smo definirali zgoraj lahko sicer shranemo
; v zunanjo datoteko ter jo kličemo enako kot tn13def.inc
.org 0x0

   rjmp GlProg      ;reset vektor


.org 0xA            ;označimo lokacijo kjer bomo začeli z glavnim programom


GlProg:
   DolociSklad
   PORTB0Izhod      ;določitev izhodnega pina
   ldi tmp,12
   ldi tmp2,24      ; v register r 16 in 17 smo shranili dve vrednosti
   mov Vsota,tmp   ; registrom 0-15 ne moremo direktno vpisati vrednost
                        ;zato smo to storili indirektno instukcija mov je
                        ;premaknila v njega vrednost iz registra tmp

   push tmp         ;shranemo vrednosti v sklad
   push tmp2
   push Vsota                  
Zanka:      
   add tmp,tmp2      ;registra smo sešteli
   mov vsota,tmp      ;rezultat shranem v register z imenom vsota
   B0_1                  ;izhodni pin stanje 1
   rcall Pavza100uS
   B0_0                     ;izhodni pin stanje 0
   pop Vsota
   pop tmp2
   pop tmp

   rjmp  Zanka
   





;-----------------------------------------------------------
;Pavza 100uS   Oscilator 9,6Mhz
;-----------------------------------------------------------
Pavza100uS:
   push r20
   push r21
   ldi r20,57
   ldi r21,2
P_zanka:
   dec r20
   brne P_zanka
   dec r21
   brne P_zanka
   pop r21
   pop r20
   
   ret



1cekel izvajana traje 1/frekvenca == 1/9.6Mhz ==ca 1.04 mi S

Instrukcije lahko trajajo različno 1-3 cikle. (glej opis instrukcij 1. dan)


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: Čet Sep 16, 2010 5:37 pm    Naslov sporočila:   Odgovori s citatom

Še preizkus na simulatorju.
V menuju "Debug" najprej nastavimo "Toggle Breakpoint". Eno vrstico pred ter eno za instrukcijo od koder je klicana pavza. Nato poženemo "Run cursor" Ko se bo kazalček postavil na prvo break točko obrišemo števec. (desni klik na polje "Stop Wach" v zavihku "Processor". Ko je štoparica resetiranja ponovno počenemo kursor. Kazalček bo obstal na drugi break točki. Potečen čas in število ciklov pa bo zabeleženo v v polju "Cycle Counter" in "Stop Watch"

_________________
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