|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vitez93 Član
Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.36 Kraj: Celje- Dobrna
|
Objavljeno: Sob Okt 16, 2010 7:09 pm Naslov sporočila: Problem pri uporabi tabele |
|
|
Imam problem pri uporabi tabele TABELA_pov. Ko v delu programa "BRANJE TIPK" Ugotovim pritisnjeno tipko gor, se potem kliče tabela TABELA_pov. Pred tem se v W vpiše recimo 2. Ko se izvede ukaz "addwf PCL,f" bi moral program skočiti za dva naprej, v simulatorju pa skoči nekam na začetek programa. Se da komu to prosim pogledati in svetovati kaj bi lahko bilo narobe?
Najlepša hvala vnaprej!
Koda: |
;*******************************BRANJE TIPK*************************************
movlw d'1'
movwf poz
call pozicija
movlw .50
call CakajMs
SSS btfss T_desno
goto premakni_desno
btfss T_levo
goto premakni_levo
btfss T_gor
goto povecaj
goto SSS
povecaj
rlf poz,0
call TABELA_pov
call osvezi
call pozicija
movlw .50
call CakajMs
MMM btfss T_gor
goto MMM
movlw .50
call CakajMs
goto SSS
premakni_desno
incf poz,1
call pozicija
movlw .50
call CakajMs
TTT btfss T_desno
goto TTT
movlw .50
call CakajMs
goto SSS
premakni_levo
decfsz poz,1
goto UUU
movlw .1
movwf poz
UUU
call pozicija
movlw .50
call CakajMs
RRR btfss PORTB,2
goto RRR
movlw .50
call CakajMs
goto SSS
;***************************Podprogram za premik kurzorja**********
pozicija
movf poz,0
call TABELA_poz
call DDRAM_n
bsf RS
return
;***************osveževanje vrednosti na LCD****************** ; Ukazni nacin
osvezi
movlw 0x09
call DDRAM_n
bsf RS
movf stot_dol,0
call TABELA
call LCD_pisi
movf des_dol,0
call TABELA
call LCD_pisi
movf en_dol,0
call TABELA
call LCD_pisi
movlw 0x43
call DDRAM_n
bsf RS
movf tisocice,0
call TABELA
call LCD_pisi
movf stotice,0
call TABELA
call LCD_pisi
movf desetice,0
call TABELA
call LCD_pisi
movf enice,0
call TABELA
call LCD_pisi
return
;*************************** PODPROGRAMI *********************************
;********************* IZPISE VREDNOST IZ W NA LCD ***********************
LCD_pisi
movwf Temp1 ; Shranimo W (podatek) v Temp1
movlw 0x0F ; 0x0F -> W
andwf PORTC,f ; Izbrisemo zgornje 4 bite PORTB
movf Temp1,w ; W povrnemo nazaj iz Temp1
andlw 0xF0 ; Izbrisemo spodnje 4 bite W (podatka)
iorwf PORTC,f ; Posljemo zgornje 4 bite podatka
bsf E
bcf E ; Obvestimo LCD o novem podatku
swapf Temp1,f ; Zamenjamo nibble v Temp1
movlw 0xF0 ; 0xF0 -> W
andwf Temp1,f ; Izbrisemo spodnje 4 bite Temp1
movlw 0x0F ; 0x0F -> W
andwf PORTC,f ; Izbrisemo zgornje 4 bite PORTB
movf Temp1,w ; Temp1 -> W
iorwf PORTC,f ; Posljemo spodnje 4 bite podatka
bsf E ; Potrdimo podatek
bcf E ; Obvestimo LCD o novem podatku
call Cakaj119u ; Pocakamo 119us
return ; Konec podprograma
;******************** NASTAVITEV TRENUTNEGA NASLOVA DDRAM-a **************
;******************** NASLOV VPISEMO V W PRED KLICEM PODPROGRAMA! ********
DDRAM_n
bcf RS ; izklopimo RS
iorlw DDRAM ; Z OR operacijo ustvarimo ukaz
call LCD_pisi ; Vpis ukaza v LCD
return
TABELA
addwf PCL,f
retlw b'00110000' ;0
retlw b'00110001'
retlw b'00110010' ;2
retlw b'00110011' ;3
retlw '4' ;4
retlw b'00110101' ;5
retlw b'00110110' ;6
retlw b'00110111' ;7
retlw b'00111000' ;8
retlw b'00111001' ;9
;**********************tabela za pozicjo****************************
TABELA_poz
addwf PCL,f
nop
retlw 0x09
retlw 0x0A
retlw 0x0B
retlw 0x43
retlw 0x44
retlw 0x45
retlw 0x46
movlw .7
movwf poz
movlw .50
call CakajMs
III btfss T_desno
goto III
retlw 0x46
;**********************tabela za povečat****************************
TABELA_pov
addwf PCL,f
nop
nop
nop
incf stot_dol,1
return
END
|
|
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14555 Aktiv.: 65.29 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sob Okt 16, 2010 8:22 pm Naslov sporočila: |
|
|
Verjetno se ti tabela lomi. Daj jo nekje na začetek - takoj za reset vektorjem ali v pomnilnik nekje na začetek strani. Morda prebereš še tole. Poglej še tale datasheet
_________________ lp
Silvo
Nazadnje urejal/a Silvo Sob Okt 16, 2010 8:26 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2105 Aktiv.: 10.09 Kraj: Krško
|
Objavljeno: Sob Okt 16, 2010 8:23 pm Naslov sporočila: |
|
|
Takole na prvi pogled je kriv STATUS,C .
Pred vsakim RRF in RLF mora biti stanje STATUS,C bita natanko poznano in znan mora biti tudi razlog za to stanje.
Kritično dogajanje je v
povecaj
rlf poz,0 ; ni definiran Status,C
call TABELA_pov
call osvezi
call pozicija
call osvezi
call pozicija
Definiraj si
W equ 0x00
F equ 0x01
da boš lahko uporabljal poz,W in poz,F .
Par stvari si zakompliciral. Če nočeš preseči 0...255 gor ali dol, uporabljaj naslednja zaporedja:
Levo
decfsz poz,W ; je ze 0 ?
decf poz,F ; ne se, lahko zmanjsa
Desno
incfsz poz,W ; je ze 255?
incf poz,F ; ne se, lahko poveca
Na drugi pogled je kriv PCLATH. Nisi pripel celotnega programa, ...
Poglej si program v View --> Program Memory .
Obstaja verjetnost, da se tabela nahaja na prelomu naslovov 0x07FF in 0x0800 .
To je zadosten razlog ta "skoke v prazno", ali v "addwf območje".
Glej, da se tabele bedno nahajajo na isti vrednosti PCLATH-a .
Zadevo rešiš z ukazom org 0x---- , kjer je ---- začetni naslov tabele.
Jaz tabele običajno postavim na org 0x0700 in pazim, da ne gredo preko 0x07FF (256 lokacij). Če jih je več, gredo pa na org 0x0600 .
_________________ Denis
Nazadnje urejal/a dkone Sob Okt 16, 2010 8:24 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
Jernej Š. Član
Pridružen-a: Pon 25 Jun 2007 23:33 Prispevkov: 83 Aktiv.: 0.41 Kraj: Primorska
|
Objavljeno: Sob Okt 16, 2010 8:24 pm Naslov sporočila: |
|
|
Živjo!
Simulator ima možnost izvajanja po korakih. Uporabi jo, glej spremenljivke. Spremljaš lahko tako svoje spremenljivke, kot vse registre procesorja, vključno s programskim števcem.
Mogoče je vsebina registra w ob klicu tabele tako velika, da skočiš čez zadnji return v programu in procesor izvaja "neobstoječi program", dokler se programski števec spet ne ustavi na začetku programa (ko preleti cel FLASH).
Nasvet: pri instrukcijah, kjer se določa ciljni register rezultata, uporabljaj konstante w in f namesto 0 in 1. Bo veliko bolj pregledno, manj možnosti za napake.
Lep pozdrav!
Jernej
EDIT: Sem že kasen ...
|
|
Nazaj na vrh |
|
|
vitez93 Član
Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.36 Kraj: Celje- Dobrna
|
Objavljeno: Ned Okt 17, 2010 5:31 pm Naslov sporočila: |
|
|
Takole je stanje. Na LCD imam 7 števk, ki se morajo spreminjati od 0 pa do 9. Spremenljivka poz (pozicija, 1-7) določa na kateri števki se nahaja kurzor. S tipkama levo in desno ta kurzor premikam s pomočjo tabele TABELA_poz. S tipkama gor in dol pa hočem večati oz. manjšati številko na kateri je kurzor.
Opis: |
|
Velikost datoteke: |
241.11 KB |
Pogledana: |
6 krat |
|
|
|
Nazaj na vrh |
|
|
vitez93 Član
Pridružen-a: Pet 19 Sep 2008 20:00 Prispevkov: 1018 Aktiv.: 5.36 Kraj: Celje- Dobrna
|
Objavljeno: Ned Okt 17, 2010 6:29 pm Naslov sporočila: |
|
|
Tabele sem prestavil na vrh in dela. Kako je pa v zbirniku najlažje narediti:
Bo tako?
Koda: |
movf x
addlw .246
btfsc C
(ukaz, ki se naj zgodi pri X = 10)
bcf C
|
P.S.:
Odgovarjam sam sebi. Preizkusil in dela.
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|