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


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Avg 15, 2006 11:26 pm Naslov sporočila: PIC (ASM) delčki uporabne kode na enem mestu |
|
|
Ravno si pripravljam "teren" za neko zadevo. Uporabil bom PIC16F877, ker jih imam še par na zalogi. Na tem mestu bom pripenjal delčke "univerzalne" kode. Mogoče zna komu priti kdaj prav. Seveda vabim vse assembler-jaše, da se mi priduržijo.
Pri zadevi bom uporabil LCD - torej najprej nekaj osnovnih rutin za LCD. Inicializacija, generiranje šumnikov. (komunikacija bo 4 bitna oscilator 4Mhz)
(Vse kar bom pripenjal bom predhodno testiral v praksi)
Najprej inciializacija ter generiranje šumnikov v CGRAM:
Koda: |
;-------------------------------------------
;lcd
#define RS PORTD,2
#define EN PORTD,3
#define LCD_PORT PORTD
;---------------------------------------------------
;procedura pripravi porte ter inicializira LCD
;---------------------------------------------------
LCD_INC
clrf LCD_PORT
bsf STATUS,RP0
clrf LCD_PORT ;vsi pini so izhodi
bcf STATUS,RP0
call P_40mS ;pavza 40mS
bcf RS
movlw b'00100000'
movwf LCD_PORT
bsf EN ;4 bit mode
bcf EN
bsf EN ;2 vrstici
bcf EN
movlw b'10000000'
movwf LCD_PORT
bsf EN ;5x8 font
bcf EN
call P_40uS
clrf LCD_PORT
bsf EN
bcf EN
movlw b'11110000'
movwf LCD_PORT
bsf EN ;displej on, cursor on, blink on
bcf EN
call P_40uS
clrf LCD_PORT
bsf EN
bcf EN
movlw b'00010000'
movwf LCD_PORT
bsf EN ;brisanje displeja
bcf EN
call P_1600uS
clrf LCD_PORT
bsf EN
bcf EN
movlw b'01100000'
movwf LCD_PORT
bsf EN
bcf EN
call P_40mS
call P_40mS
movlw high POSEBNI_ZNAKI ;rutina je na strani3
movwf PCLATH ;zato nastavim PCLATH
call POSEBNI_ZNAKI ;rutina v CGRAM nalozi posebne znake (sumnike)
return
;--------------------------------------
;pavza 40mS
;--------------------------------------
P_40mS
movlw .52
movwf T1
movlw .241
movwf T2
dloop1
decfsz T2,f
goto dloop1
decfsz T1,f
goto dloop1
return
;-------------------------------------
;pavza 40uS
;-------------------------------------
P_40uS
movlw .11
movwf T1
dloop2
decfsz T1,f
goto dloop2
nop
return
;-------------------------------------
;pavza 1.6mS
;-------------------------------------
P_1600uS
movlw .3
movwf T1
movlw .17
movwf T2
dloop3
decfsz T2,f
goto dloop3
decfsz T1,f
goto dloop3
return
|
Za napise bom koristil zadnji del programskega pomnilnika, zato je koda pisana malo drugače. (Potrebno je pazit na PCLATH. Če se bodo uporabljale prekinitve, ga je treba pred prekinitvijo obvezno shranit!)
Koda: |
org 0x1F00
;-----------------------------------------------
;
;
; Kljukasti znaki (sumniki)
;
;-----------------------------------------------
SUMNIKI
addwf PCL,f
retlw b'00001100'
retlw b'00001110'
retlw b'00010001'
retlw b'00010000'
retlw b'00010000'
retlw b'00010001'
retlw b'00001110'
retlw b'10000000'
retlw b'00001100'
retlw b'00001110'
retlw b'00010000'
retlw b'00001110'
retlw b'00000001'
retlw b'00010001'
retlw b'00001110'
retlw b'10000000'
retlw b'00001100'
retlw b'00011111'
retlw b'00000010'
retlw b'00000100'
retlw b'00001000'
retlw b'00010000'
retlw b'00011111'
retlw b'10000000'
retlw b'10000000'
retlw b'00001100'
retlw b'00001110'
retlw b'00010000'
retlw b'00010000'
retlw b'00010001'
retlw b'00001110'
retlw b'10000000'
retlw b'10000000'
retlw b'00001100'
retlw b'00001110'
retlw b'00010000'
retlw b'00001110'
retlw b'00000001'
retlw b'00001110'
retlw b'10000000'
retlw b'10000000'
retlw b'00001100'
retlw b'00011111'
retlw b'00000010'
retlw b'00000100'
retlw b'00001000'
retlw b'00011111'
retlw b'10000000'
retlw .0 ;prazen vnos smatra procedura kot konec tabele
;----------------------------------------------------
;procedura generira posebne znake definirane v tabeli
;SUMNIKI
;----------------------------------------------------
POSEBNI_ZNAKI
clrf STEJ
movlw b'01001000' ;CGRAM lokacija1
clrf PCLATH ;sledi skok na page0
call UKAZ
ZANKA_PZ
movlw HIGH SUMNIKI ;tabela s tekstom se nahaja na strani3
movwf PCLATH ;zato ustrezno nastavim PCLTH
movf STEJ,w
call SUMNIKI
clrf PCLATH ;sem nazaj na strani0
addlw .0
btfsc STATUS,Z ;je konec besedila
return ;da
call NA_LCD
incf STEJ,f ;premik na sledec karakter
movlw high POSEBNI_ZNAKI
movwf PCLATH
goto ZANKA_PZ |
...več sledi _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.95 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Avg 16, 2006 3:54 pm Naslov sporočila: |
|
|
LCD nadaljevanje...
Procedurce pošljejo na lcd instrukcijo oz. posmezen karakter oz. celo tabelo
Koda: |
;----------------------------------------------------
;procedura poslje tekst iz tabele na LCD
;kot W prejme 1. lokacijo tabele
;----------------------------------------------------
TEKST
movwf STEJ
Z_TEKST
movlw HIGH TABELA ;tabela s tekstom se nahaja na strani3
movwf PCLATH ;zato ustrezno nastavim PCLTH
movf STEJ,w
call TABELA
clrf PCLATH ;sem nazaj na strani0
addlw .0
btfsc STATUS,Z ;je konec besedila
return ;da
call NA_LCD
incf STEJ,f ;premik na sledec karakter
goto Z_TEKST
;---------------------------------------------------
;procedura pošlje karakter doblejn v W na LCD
;---------------------------------------------------
NA_LCD
bsf RS
UKAZ
movwf LCD_TMP ;shranem prejet karater
movlw b'1111'
andwf LCD_PORT,f ;obrisem data linije za LCD
movf LCD_TMP,w
andlw b'11110000'
iorwf LCD_PORT,f
call VPIS_D
movlw b'1111'
andwf LCD_PORT,f ;obrisem data linije za LCD
swapf LCD_TMP,W
andlw b'11110000'
iorwf LCD_PORT,f
call VPIS_D
bcf RS
call P_40uS
return
;------------------------------------------------
;vpis podatka
;------------------------------------------------
VPIS_D
bsf EN
bcf EN
return
|
Tabelce na zadnji strani programskega pomnilnika:
Koda: |
org 0x1800 ;page3
TABELA
addwf PCL,f
dt"0123456789",0
NAPIS1
dt "elektronik.si",0
NAPIS2
dt 2,"umniki:",1,2,3,4,5,6,0
org 0x1F00
|
Ter primer rabe:
Koda: |
#define VRSTA2 movlw b'10000000'+40
#define VRSTA1 movlw b'10000000'
org 0X0
goto GLAVNI
org 0x5
CIFRE
addwf PCL,f
dt"0123456789",0
GLAVNI
call CLRRAM
bsf STATUS,RP0
movlw b'00000011'
movwf OPTION_REG
bcf STATUS,RP0
clrf PORTB
call LCD_INC ;inicializacija LCD in nalaganje posebnih znakov v CGRAM
;1=C 2=S 3=Z 4=c 5=s 6=z (crke s klukicami)
VRSTA1
call UKAZ ;proceura poslje na LCD instrukcijo dobljeno v W
movlw low NAPIS1-1 ;v prvo vrstico napisem vsebino tabele NAPIS1
call TEKST
VRSTA2
call UKAZ
movlw low NAPIS2-1 ;v drugo vrstico napisem vsebino tabele 2
call TEKST
nop
goto $-1
CLRRAM
movlw 0x20
movwf FSR
BRISI
clrf INDF
incf FSR,F
movlw 0x80
subwf INDF,w
btfss STATUS,C
goto BRISI
return
|
...nadaljevanje sledi... _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.42
|
Objavljeno: Ned Maj 06, 2007 5:34 pm Naslov sporočila: |
|
|
par vrednosti za "P_40mS"
Koda: |
ms T1 T2
0,5 1 164
1 2 74
1,6 3 17
5 7 124
10 13 251
20 26 247
40 52 241
50 65 237
75 98 101
100 130 220
150 195 204
197 0 0
|
max zakasnitev je 197.127 ms, za kaj vec je treba dodat se tretjo zanko _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.42
|
Objavljeno: Pon Maj 07, 2007 7:02 pm Naslov sporočila: |
|
|
malo matematike
Koda: |
cblock 0x20 ; tule nastavi pravi naslov glede na PIC
tempX:2
tempY:2
result:2
idx:2
tempYY
endc
; 8-bit mul
; result=tempX*tempY
mul8
clrf result
movf tempX,w
btfsc tempY,0
addwf result,f
bcf STATUS,C
rrf tempY,f
bcf STATUS,C
rlf tempX,f
movf tempY,f
btfss STATUS,Z
goto $-9
return
; 16-bit add
; tempX=tempX+tempY
add16
movf tempY,w
addwf tempX,f
btfsc STATUS,C
incf tempX+1,f
movf tempY+1,w
addwf tempX+1,f
return
; 16-bit add
; result=result+tempX
add16r
movf tempX,w
addwf result,f
btfsc STATUS,C
incf result,f
movf tempX+1,w
addwf result+1,f
return
; 16-bit mul
; result=tempX*tempY
mul16
clrf result
clrf result+1
btfsc tempY,0
call add16r
bcf STATUS,C
rrf tempY+1,f
rrf tempY,f
bcf STATUS,C
rlf tempX,f
rlf tempX+1,f
movf tempY,f
btfss STATUS,Z
goto $-.10 ;mul16_1
movf tempY+1,f
btfss STATUS,Z
goto $-.13 ;mul16_1
return
; 8-bit div
; result=tempX/tempY
; ostanek v tempX
div8
movf tempY,f
btfsc STATUS,Z
return
clrf result
movlw 1
movwf idx
bcf STATUS,C
rlf idx,f
bcf STATUS,C
rlf tempY,f
btfss tempY,7
goto $-5
movf tempY,w
subwf tempX,f
btfsc STATUS,C
goto $+3
addwf tempX,f
goto $+3
movf idx,w
addwf result,f
bcf STATUS,C
rrf tempY,f
bcf STATUS,C
rrf idx,f
btfss STATUS,C
goto $-.13
return
; 16-bit sub
; tempX=tempX-tempY
sub16
movf tempY+1,w
movwf tempYY
movf tempY,w
subwf tempX,f
btfss STATUS,C
incf tempYY,f
movf tempYY,w
subwf tempX+1,f
return
; 16-bit div
; result=tempX/tempY
; ostanek v tempX
div16
movf tempY,f
btfss STATUS,Z
goto $+4
movf tempY+1,f
btfsc STATUS,Z
return
movlw 1
movwf idx
clrf idx+1
clrf result
clrf result+1
bcf STATUS,C
rlf idx,f
rlf idx+1,f
bcf STATUS,C
rlf tempY,f
rlf tempY+1,f
btfss tempY+1,7
goto $-7
call sub16
btfsc STATUS,C
goto $+3
call add16
goto $+7
movf idx,w
addwf result,f
btfsc STATUS,C
incf result+1,f
movf idx+1,w
addwf result+1,f
bcf STATUS,C
rrf tempY+1,f
rrf tempY,f
bcf STATUS,C
rrf idx+1,f
rrf idx,f
btfss STATUS,C
goto $-.18
return
|
16-bitne vrednosti so v obliki LO-HI, torej 0x1234 pomeni 0x34 v tempX in 0x12 v tempX+1
edit: popravil bug v mul16 _________________ Tule nisem več aktiven. |
|
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
|