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


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Sep 16, 2010 5:22 pm Naslov sporočila: |
|
|
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 S
Instrukcije lahko trajajo različno 1-3 cikle. (glej opis instrukcij 1. dan)
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: Čet Sep 16, 2010 5:37 pm Naslov sporočila: |
|
|
Š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 |
|
 |
|
|
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
|