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


Pridružen-a: Tor 23 Jan 2007 23:56 Prispevkov: 465 Aktiv.: 2.08 Kraj: Ljubljana
|
Objavljeno: Tor Apr 01, 2008 7:42 pm Naslov sporočila: |
|
|
Ok, predam se...ocitno mi tole se vedno ni jasno!
Tabele sem sedaj dal od naslova 0x005 naprej, in ne presezejo vrednosti 256, tako da ne rabim PCLATH!
Problem je sedaj v tem da mi pri taksni kodi:
vrne pravo vrednost tabele (npr; prva tabela se tako nahaja na naslovu 0x006), vendar mi potem instrukcija addwf PCL,f zraven pristeje vrednost 5, se pravi naslov zacetka tabel, in to potem ni vec prava vrednost!
Zato sem se spet lotil po svoje (oz. nekako tako kot je predlagal IGO) in v Program Memory poiskal naslove tabel jim odstel vrednost 0x005, tako da ko jim potem pristeje to vrednost dobim pravo lokacijo tabele.
Koda: |
movlw 0xd
movwf Tabela1
call LCD_disp |
Tako je potem npr: ce je Tabela1 na lokaciji 0x13 sem vpisal lokacijo 0xd + tistih 0x005 je potem 0x13!
Nevem, [slovenščina je zame španska vas] se sam ne razumem ampak se mi zdi da bol ko naredim stvar nemogoce zakomplicirano vsaj dela
Mogoce se pa ne da drugace oz. se da z taksnim ali drugacnim preracunavanjem naslovov!
lp _________________ Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Tor Apr 01, 2008 8:21 pm Naslov sporočila: |
|
|
Namesto da si tako zakompliciral s preracunavanjem, pusti arcunalniku, da to delo opravi namesto tebe (v tem je boljsi - hitrejsi). Primer iz enega mojega programcka:
Koda: |
strings addwf pcl,f
abc dt "abcdefghijklmnopqrstuvwxyz"
dt "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
dt "0123456789-=_+[]{};':./>?`"
dt "~!@#$%^&*() ",0
test dt "test",CR,LF,0
|
Da preberes znak iz niza test kot naslov podas (test - strings) in prepustis matematiko preprocesorju. Pri tem upostevaj se eno lokacijo zamika (to imas najbrz reseno ze v kodi).
(za cuden zamik na forumu so krivi tabulatorji v originalni kodi, kjer je vse videti normalno) _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Tor Apr 01, 2008 11:29 pm Naslov sporočila: |
|
|
kavelj22 je napisal/a: |
Zato sem se spet lotil po svoje (oz. nekako tako kot je predlagal IGO) in v Program Memory poiskal naslove tabel jim odstel vrednost 0x005, tako da ko jim potem pristeje to vrednost dobim pravo lokacijo tabele. |
Verjetno si nameraval poudariti tisto, kar sem jaz poudaril, kajne ?
Koda: |
movf Odmik,w ; V W naložiš vrednost spremenljivke Odmik
call Tabela ; Kličeš podprogram Tabela (v PCL se zapiše naslov 0x005)
org 0x005 ; ukaz prevajalniku (posledično programatorju), da se naslednji ukaz nahaja na naslovu 0x005
; Prvi ukaz v podprogramu Tabela se torej nahaja na naslovu 0x005.
Tabela addlw PCL,f ; Vrednost Odmika (ki je v W-ju) prišteješ trenutni vrednosti PCL-ja (NoviPCL=StariPCL+Odmik) . addlw PCL,f se torej nahaja na 0x005
dt "Besedilo za LCD" ; Če je Odmik=6, se bo izpisala črka"i"
; 123456789abcdef ; Možne vrednosti spremenljivke Odmik
; V praksi je največja možna vrednost spremenljivke Odmik enaka 254 , saj potem presežeš 256-mesten (8-biten) prostor, ki ga dosežeš s pomočjo Odmik+PCL (no, za večje tabele se uporablja 16-biten par OdmikZG in OdmikSP)
|
Pa še v bolj pregledni "naslovni" obliki:
org 0x005
Tabela
addlw PCL,f ; Tale ukaz se nahaja na lokaciji 0x005
retlw "B" ; Tale ukaz (return with litteral (konstanta) in W) se nahaja na naslovu 0x006
retlw "e" ; Tale ukaz (vrni se s konstanto v W-ju) se nahaja na naslovu 0x007
retlw "s" ; Tale ukaz se nahaja na naslovu 0x008
retlw "e" ; -||- 0x009 . Dosežeš ga tako da je Odmik=4 ==> PCL+Odmik=5+4=9
retlw "d" ; Če PCL-ju prišteješ Odmik=5, prideš na naslov 5+5=10 , zato se vrneš s konstanto v W-ju , ki bo po ASCII pretvorbi postala d
retlw "i" ; Verjetno si že odkril, v čem je ves trik
retlw "l" ; Vse računanje se zgodi samodejno, ti moraš samo nastaviti spremenljivko Odmik, pa se izpiše želeni znak v zaporedju
retlw "o" ; bolj podrobno ne znam pojasniti.
LP,
Igor _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Sre Apr 02, 2008 5:46 pm Naslov sporočila: Re: Tabele |
|
|
Sem ugotovil, kaj "čaraš" z izračunavanjem. Pozorno si oglej komentarje v LCD_disp.
Popravljena koda + par komentarjev + par malenkosti :
Koda: |
Tabela_setup
addwf PCL,f
Tabela
retlw 'N'
retlw 'a'
retlw 'p'
retlw 'e'
retlw 't'
retlw 'o'
retlw 's'
retlw 't'
retlw ' '
retlw 'j'
retlw 'e'
retlw '!'
retlw 80
Tabela1
retlw 'N'
retlw 'a'
retlw 'p'
retlw 'e'
retlw 't'
retlw 'o'
retlw 's'
retlw 't'
retlw 'i'
retlw ' '
retlw 'n'
retlw 'i'
retlw '!'
retlw 80
;******************************************
;zanka za izpis tabele
;*******************************************
LCD_disp ; Sem smo prišli z naslovom Tabela ali Tabela1 v W
movwf Naslov ; Shranim W v Naslov
movlw Tabela ; Konstanto Tabela shranim v W
subwf Naslov ,f; Od Naslov-a (Tabela ali Tabela1) moramo odšteti W (naslov Tabela)
; Če je bilo v Naslov-u Tabela, bo po novem v Naslov-u 0 (Tabela-Tabela=0 )
; Če je bilo v Naslov-u Tabela1, bo po novem v Naslov-u 13 (Tabela1-Tabela=13 )
Sedaj lahko dosežemo pravo črko na Naslov-u , ki ga prištejemo PCL-ju . To je to.
bsf RS
Delaj1
movf Naslov,w
call Tabela_setup
movwf Test
btfsc Test,7
return
call LCD_izpis
incf Naslov,f
goto Delaj1
bcf RS
return
;************************************
;pošljemo znak na LCD
;*************************************
LCD_izpis
movwf Temp1
movlw b'00001111'
andwf PORTB,f
movf Temp1,w
andlw b'11110000'
iorwf PORTB,f
call Sporoci
swapf Temp1,f
movlw b'11110000'
andwf Temp1,f
movlw b'00001111'
andwf PORTB,f
movf Temp1,w
iorwf PORTB,f
call Sporoci
return
Glavni
bsf STATUS,RP0
clrf TRISA
movlw b'00000010'
movwf TRISB
movlw b'10000001'
movwf OPTION_REG
bcf STATUS,RP0
movlw b'00000000'
movwf PORTA
movlw b'00000000'
movwf PORTB
call Pavza1s ; SEM daj 1 sekundo pavze za pravilno inicializacijo LCDja, da se vzpostavi napajanje
call LCD_Init
bsf PORTB,3
movlw Tabela ;izpisemo tabelo
call LCD_disp
Zanka
call Pavza1s ; SEM daj 1 sekundo pavze, da ne bo prehitro preverjalo stanja
btfsc PORTB,1 ;preverjamo prisotnost nap. na pinu 1 portb
goto pJeNap ; Izpiše, da JE napetost
goto pNiNap ; Da veš, kam gre, čeprav se pNiNap nahaja v naslednji vrstici
pNiNap
movlw b'00000001' ;pobrisemo zaslon
call LCD_izpis
movlw .20
call Pavza
movlw Tabela ;izpisemo tabelo : Napetosti ni!
call LCD_disp
goto Zanka
pJeNap
movlw b'00000001' ;pobrisemo zaslon, kurzor skoči na 0. Če ne bi brisal, bi moral tule klicati call KurzorNa .
call LCD_izpis
movlw .20
call Pavza
movlw Tabela1 ;izpisemo Tabelo1 : Napetost je!
call LCD_disp
goto Zanka
konec ; tega ni treba
goto konec |
LP,
Igor _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
kavelj22 Član


Pridružen-a: Tor 23 Jan 2007 23:56 Prispevkov: 465 Aktiv.: 2.08 Kraj: Ljubljana
|
Objavljeno: Sre Apr 02, 2008 6:47 pm Naslov sporočila: |
|
|
Ja, IGO rekel bi takoj da sem te kopiral ce bi bil preprican da nisem rekel bedarije . Pa nisem bil
Naredil sem ravno obratno kot ti. Ti si vpisoval odmik in klical tabelo. Jaz pa sem v tabelo podal naslov + 0x005!
Ampak nekaj moras podati ker ce napisemo samo to;
Koda: |
movlw Tabela
call LCD_disp
|
dobimo v W naslov tabele od 0x000 in ne od 0x005 in ce je potem addwf PCL,f, to ni vec pravi naslov!
Hvala se za ostalih par malenkosti, delajo pa tabele sedaj tako kot morajo!
lp _________________ Živleje ni potica, življeje je črn kruh. Bul ga šparaš bul je suh. Zato pa kr na mizo žjim. |
|
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: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|