Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 2:02 pm Naslov sporočila: |
|
|
No lepo.
Sedaj napisi nov makro. (kar onega prekopiraš pa malo spremeniš)
Koda: |
macro Znak
ldi stevec,8
sbi CS ;vkop vodila
ldi tmp,0b11111010
rcall Poslji
ldi tmp,(0xf0&@0)
rcall Poslji
ldi tmp,(0xf&@0)*16
rcall Poslji
cbi CS
.endm
|
Pa v nadaljevanju napiši :
Koda: |
Znak 'P'
Znak 'r'
Znak 'o'
Znak 't'
Znak 'o'
Znak 'n'
Znak 'c'
Znak 'e'
Znak 'k' |
|
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
Objavljeno: Ned Apr 15, 2012 2:26 pm Naslov sporočila: |
|
|
joj,ne...bom še veselje do zbirnika dobil
medtem sem ugotovil da je bascom očitno prepočasen za tole...preden LCD dobi impulz iz njega, že obupa in gre adijo...
torej mi ostane vgradnja podprograma iz zbirnika.
Tale nov makro je pa sploh špica, ja. Veliko lažje je pisati po LCD-ju.
EDIT: evo še slikco, da bo potrjeno... _________________ http://www.protoncek.com |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 2:35 pm Naslov sporočila: |
|
|
Ne bi rekel, da je vzrok hitrost. Po moje ga nekje lomiš. CLK spuščaš z visokega na nizko ter ga ob inicializaciji postaviš na visoko?
Na podoben način si lahko spišeš makroje za vse ostalo. (brisanje, poziconiranje....) Za zadeve, ki se ponavljajo pa je bolje spisati proceduro. Makro ob enem tudi požira programski pomnilnik saj se ob vsaki navedbi koda ponovi. Sicer ga je za tole kar sva sedaj napisala na megi32 ni vzel niti 1% tako da ni krize.
ps
Simatičen displej |
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
Objavljeno: Ned Apr 15, 2012 2:39 pm Naslov sporočila: |
|
|
Aha, torej če prav razumem je makro zgolj neke sorte ukaz prevajalniku, v bistvu bližnjica zame, da ne pišem stokrat isto, v HEX datoteki pa se ponovi vedno, ko ga kličem...torej bi bilo mogoče za ponavljajoče ukaze bolje napisati podprogram? _________________ http://www.protoncek.com |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 2:46 pm Naslov sporočila: |
|
|
Predprevajalnik zamenja vso kodo v makru s tistim kar je napisano v makro. Parametre, ki so navedeni z @ pa zamenja z vrednostmi. Če so kaki izračuni, še tudi to stori. V drugem primeru se nad prejetemu parametru vrši logični AND torej 0b11110000 nad prejet parameter. Tako dobimo le zgornje 4 bite ki jih potrebujemo. V drugem delu "poreže" zgornje bite ter rezultat pomnoži z 16 tako se spodnji biti "premaknejo" na zgornje. (kar pač potrebujemo v danem primeru) - izračunani rezultati so že v kodi. Tega procesor torej ne računa.
Koda bi načeloma mogla delat brez kakih sprememb tudi na tiny-ih - No pine bo potrebno ustrezno določit. |
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
Objavljeno: Ned Apr 15, 2012 2:50 pm Naslov sporočila: |
|
|
aha...jasno.
No, ravnokar sem uspešno ustvaril pavzo vrednosti 2 ms. Namreč - po ukazu CLS je treba počakati 1,6 mS, toliko časa namreč traja brisanje. Uporabil sem kar r20 in r21.
Sicer pa tole, kar se vidi na sliki zgoraj trenutno zasede 4.3% mege16 (698 bytes) _________________ http://www.protoncek.com |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 3:53 pm Naslov sporočila: |
|
|
No sem še spisal procedurco. V kombinaciji z makrom bi moralo iti še enostavneje pisati na displej besede.
zgoraj definiraj še en register .def tmp2=r18
Pa dodaj tole kodo:
Koda: |
;-----------------------------------------------
;procedura pošlje na LCD znak ki ga dobi v tmp2
;----------------------------------------------
PosljiZnak:
ldi stevec,8
sbi CS ;vkop vodila
ldi tmp,0b11111010 ;sinhro niz + rw,rs bit
rcall Poslji
push tmp2
andi tmp2,0b11110000 ;gornji biti
mov tmp,tmp2
rcall Poslji
pop tmp
swap tmp2
andi tmp2,0b11110000 ;spodji biti
mov tmp,tmp2
rcall Poslji
cbi CS
ret
.macro Tekst
ldi ZL,low(Napis*2)
ldi ZH,high(Napis*2)
NovZnak:
lpm tmp2,Z+
tst tmp2
breq KonecTeksta
rcall PosljiZnak
rjmp NovZnak
Napis:
.db @0,0
KonecTeksta:
.endm |
makro pa uporabiš ime makra + besedilo v narekovajih. Upam da bo delalo nimam možnosti probati.
Koda: | Tekst "Test 01234567890" |
No makroje ter vse ostalo navlako lahko daš v svojo datoteko ter jo uporabljaš tudi v drugih programih. (navedeš jo na začetku kot inc file)Tako ti glavni program ostane pregleden. |
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
Objavljeno: Ned Apr 15, 2012 5:56 pm Naslov sporočila: |
|
|
hm...pri prevajanju mi izpiše opozorilo pri vrstici .db @0,0:
warning: .cseg .db misalignment - padding zero byte
procedura pa pri vnosu "012345" izpiše samo 6 krat prvi znak (torej 000000). Kot da manjka nek shift ali podobno... _________________ http://www.protoncek.com |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 6:22 pm Naslov sporočila: |
|
|
Vidim napako ... Popravi tisti "pop tmp" v "pop tmp2" (v sklad sem dal tmp2 kjer dejansko tisto kar je bilo pobrano s tabele. visoki biti so poslani pravi, nizki pa ne. ) Tisto opozorilo te naj ne moti. Na koncu tabele je dodano 0. Ko je iz tabela pobrano 0 porgram ve, da je teksta konec. |
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 7:02 pm Naslov sporočila: |
|
|
No sedaj si napišeš en makro za določitev pozicije pisanja pa imaš vse. |
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
Objavljeno: Ned Apr 15, 2012 7:25 pm Naslov sporočila: |
|
|
Ja, to bom pa že znal. Saj zdaj je vse v istem stilu.
Vidim da tale asembler kljub vsemu je in ni lahek...če bi hotel kaj več, bi definitivno moral prebrati kakšen vodič za začetnike ali kaj takega.
Nekaj me še zanima okoli samega zbirnika:
- ukaz .org0x0 naj bi postavil adreso, kje se program začne. Ali je ukaz .org 0x030 potem v temle primeru brez potrebe?
- vsi makri so napisani pred začetkom programa, namreč če ga postavim ZA ukazom ,ki ga kliče dobim ERROR...pravilno?
- Podprograme (call-ret) pa lahko postavim tudi na konec - nenazadnje je tako bolj pregledno.
- Na začetku je treba definirati kje bo sklad, porte inpodobno "navlako".
Upam da nisem preveč siten...in še enkrat hvala za vse! _________________ http://www.protoncek.com |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 7:45 pm Naslov sporočila: |
|
|
protoncek je napisal/a: | Ja, to bom pa že znal. Saj zdaj je vse v istem stilu.
Vidim da tale asembler kljub vsemu je in ni lahek...če bi hotel kaj več, bi definitivno moral prebrati kakšen vodič za začetnike ali kaj takega.
Nekaj me še zanima okoli samega zbirnika:
- ukaz .org0x0 naj bi postavil adreso, kje se program začne. Ali je ukaz .org 0x030 potem v temle primeru brez potrebe?
- vsi makri so napisani pred začetkom programa, namreč če ga postavim ZA ukazom ,ki ga kliče dobim ERROR...pravilno?
- Podprograme (call-ret) pa lahko postavim tudi na konec - nenazadnje je tako bolj pregledno.
- Na začetku je treba definirati kje bo sklad, porte inpodobno "navlako".
Upam da nisem preveč siten...in še enkrat hvala za vse! |
Po vrsti:
Avr ima od začetka pomnilika prekinitvene vektroje. Od mikrokontrolerja zavisi koliko jih ima. (poglej v datashet Interups) Na lokaciji 0x0 je reset. Glede na to, da nismo uporabili nobene prekinitve bi načeloma lahko začeli pisati kar od 0x0.
Makroje uporablja predprevajalnik. Ko gre čez program zamenja vse makroje z dejansko kodo. Enako je z directivami. (napovedi na začetku programa ki se začnejo #) Predprevajalnik zamenja vse direktive z tistim kar napovedujejo. Pozor! Ločuje velike in male črke. Napovedana direktiva mora biti v programu popolnoma enako napisana.
Sklad se standardno definira - določen je konec rama. Tja se odlaga programski števec pri klicih call pa vrednosti potisnene v sklad s POP itd...
Kje v programskem pomniliku se zaključene procedure nahajajo pri AVR praktično ni pomembno. Malo več težav pri tem je pri PIC-u. |
|
Nazaj na vrh |
|
|
protoncek Profesionalec
Pridružen/-a: Sob Maj 2007 9:25 Prispevkov: 303 Kraj: Mengeš
|
Objavljeno: Ned Apr 15, 2012 7:56 pm Naslov sporočila: |
|
|
Ufff.. veliko za zacetek. Hvala. Brez tvoje pomoči mi LCD definitivno ne bi delal. _________________ http://www.protoncek.com |
|
Nazaj na vrh |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Ned Apr 15, 2012 8:06 pm Naslov sporočila: |
|
|
Ni problema. Zato obstajajo forumi. Važno, da je displej zagnan. Če kaj ni jasno glede tega kar sva spisala kar vprašaj. |
|
Nazaj na vrh |
|
|
|