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 

Problem pri uporabi tabele

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vitez93
Član
Član



Pridružen-a: Pet 19 Sep 2008 20:00
Prispevkov: 1018
Aktiv.: 5.39
Kraj: Celje- Dobrna

PrispevekObjavljeno: Sob Okt 16, 2010 7:09 pm    Naslov sporočila:  Problem pri uporabi tabele Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Okt 16, 2010 8:22 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkone
Član
Član



Pridružen-a: Sre 07 Mar 2007 18:53
Prispevkov: 2104
Aktiv.: 10.13
Kraj: Krško

PrispevekObjavljeno: Sob Okt 16, 2010 8:23 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jernej Š.
Član
Član



Pridružen-a: Pon 25 Jun 2007 23:33
Prispevkov: 83
Aktiv.: 0.41
Kraj: Primorska

PrispevekObjavljeno: Sob Okt 16, 2010 8:24 pm    Naslov sporočila:   Odgovori s citatom

Ž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 ... Laughing
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vitez93
Član
Član



Pridružen-a: Pet 19 Sep 2008 20:00
Prispevkov: 1018
Aktiv.: 5.39
Kraj: Celje- Dobrna

PrispevekObjavljeno: Ned Okt 17, 2010 5:31 pm    Naslov sporočila:   Odgovori s citatom

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.


mplab problem.JPG
 Opis:
 Velikost datoteke:  241.11 KB
 Pogledana:  6 krat

mplab problem.JPG


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vitez93
Član
Član



Pridružen-a: Pet 19 Sep 2008 20:00
Prispevkov: 1018
Aktiv.: 5.39
Kraj: Celje- Dobrna

PrispevekObjavljeno: Ned Okt 17, 2010 6:29 pm    Naslov sporočila:   Odgovori s citatom

Tabele sem prestavil na vrh in dela. Kako je pa v zbirniku najlažje narediti:
Koda:

IF  x = 10 then
...


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. Very Happy Dancing
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Č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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group