PDA

Prikaži potpunu verziju : Assembly PIC programiranje


GrimReaper
31.5.2012, 22:29
Ima li nekog ko je dobar sa ovim? Imam jedan zadatak sa kojim imam problem, pa ako ima iskusnih, da ga postavim ovde da ga neko "debuguje" i objasni mi u čemu je problem, s obzirom na to da ga nisam ja pisao (ali razumem većinu kodu) i da ne radi kako treba.

MG-RAY
1.6.2012, 7:45
Postavi, što da ne...

P.S. Koji PIC je u pitanju?

GrimReaper
3.6.2012, 6:10
16F872

Evo koda:

;================================================= ============================
; Filename: labVezba3.asm
;
list p=16f872 ;list directive to define processor
#include <p16f872.inc> ;processor specific definitions
errorlevel -302 ;suppress "not in bank 0" message
; #include <makro.asm>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _BODEN_ON & _WRT_ENABLE_ON & _LVP_OFF & _CPD_OFF
;----------------------------------------------------------------------------
;Constants


org 0x2100
de b'01111101',b'00110000',b'01101110',b'01111010', b'00110011', b'01011011', b'01011111', b'01110000', b'01111111',b'01111011'; vrednosti za cifre u EEPROM-u


;----------------------------------------------------------------------------
;Variables

CBLOCK 0x30
WREG_TEMP ;storage for WREG during interrupt
STATUS_TEMP ;storage for STATUS during interrupt
PCLATH_TEMP ;storage for PCLATH during interrupt
FSR_TEMP ;storage for FSR during interrupt
C1
C2
BROJ
BROJAC
TASTER
X
ENDC

;----------------------------------------------------------------------------
;This code executes when a reset occurs.

ORG 0x00
goto Main
ORG 0x0004 ;place code at interrupt vector
goto InterruptCode

ResetCode:
clrf PCLATH ;select program memory page 0
goto Main ;go to beginning of program


Main:
bsf STATUS,5
clrf TRISC
movlw 0xff
movwf TRISB

movlw 0x06
movwf ADCON1

movlw 0x03 ; preskaler - 1:8
movwf OPTION_REG

bcf STATUS,5

clrf PORTC
clrf C1
clrf C2
clrf X

movlw .4
movwf BROJAC

clrf TASTER
movlw .23
movwf BROJ


clrf TMR0
bcf INTCON,2
bsf INTCON,5

bsf INTCON,7

Loop: goto Loop



;----------------------------------------------------------------------------
;This code executes when an interrupt occurs.


InterruptCode:
movwf WREG_TEMP ;save WREG
swapf STATUS,W ;store STATUS in WREG
clrf STATUS ;select file register bank0
movwf STATUS_TEMP ;save STATUS value
movf PCLATH,W ;store PCLATH in WREG
movwf PCLATH_TEMP ;save PCLATH value
clrf PCLATH ;select program memory page0
movf FSR,W ;store FSR in WREG
movwf FSR_TEMP ;save FSR value

;test interrupt flags here

bcf STATUS,5
btfss INTCON,2
goto Kraj

bcf INTCON,7
bcf INTCON,2



;--CIFRE--

clrf C1
movfw BROJ
movwf X
movlw .10
Cifra1:
subwf X,1
btfss STATUS,0
goto Cifra2
incf C1,1
goto Cifra1

Cifra2:
movfw X
addlw .10
movwf C2


;--CITANJE IZ EEPROMA

movf C1,0
btfss BROJAC,0
movf C2,0

banksel EEADR
movwf EEADR
banksel EECON1
bsf EECON1, RD
banksel EEDATA
movf EEDATA, 0 ;W = EEDATA

;--PRIKAZ NA DISPLEJU
banksel PORTC
movwf PORTC
bsf PORTC,7
btfss BROJAC,0
bcf PORTC,7

;--TASTER

decfsz BROJAC,1
goto Kraj

btfsc TASTER,0 ;TASTER - flag koji oznacava da li je taster bio pritisnut
goto Obradi
btfss PORTB,1
clrf TASTER
btfsc PORTB,1
incf TASTER, 1
goto Kraj2


Obradi: btfss PORTB,1
goto Kraj2

incf BROJ,1
movf BROJ,0
sublw .99 ; W = 99 - BROJ
btfsc STATUS,0
clrw
btfss STATUS,0
sublw .99
movwf BROJ
;incf TASTER,1

Kraj2:
movlw .4
movwf BROJAC

;================================================= ============================
Kraj:

; movlw .250
; movwf TMR0


;------------------------------------
;End of interrupt routine restores context

EndInt:
bcf 3,5 ;select bank 0
movf FSR_TEMP,W ;get saved FSR value
movwf FSR ;restore FSR
movf PCLATH_TEMP,W ;get saved PCLATH value
movwf PCLATH ;restore PCLATH
swapf STATUS_TEMP,W ;get saved STATUS value
movwf STATUS ;restore STATUS
swapf WREG_TEMP,F ;prepare WREG to be restored
swapf WREG_TEMP,W ;restore WREG without affecting STATUS
retfie ;return from interrupt

end
;----------------------------------------------------------------------------

U suštini, ono što treba da radi jeste da ima frekvenciju osvežavanja 200hz, da ispiše (proizvoljan, decimalni, dvocifren) broj na displejevi i da na svakih 20ms proverava da li je pritisnut taster i ako jeste da poveća broj na displeju za 1.

MG-RAY
3.6.2012, 9:38
Koji oscilator si koristio, to nisi naveo? :)

Pretpostavljam da su displeji 7-segmentni?

Sta uopste ne radi?

GrimReaper
3.6.2012, 14:37
Frekvencija oscilatora je 3.2768 MHz, displejevi jesu sedmosegmentni, a ne radi ništa. :D U zavisnosti od malih izmena koje napravim u kodu, dešava se ili da ispiše na displeju na kratko broj, pa (pretpostavljam nakon 20ms) sam pređe na 00, da ispiše 1 na prvom displeju i ništa na drugom, a jednom sam uspeo čak (ne znam ni sam kako) da napravim da stoji zadati broj na displeju, ali pritiskom na taster (inače ovde postavljen kao RB1) umesto da se broj poveća za 1 resetuje se na 00. A da, i zaboravio sam da napomenem da broj treba da se čita iz EEPROMA.

enaB
3.6.2012, 19:17
Zašto ne pokreneš debugger pa vidiš šta se dešava sa kodom instrukciju po instrukciju :)