|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Sre Nov 26, 2008 5:51 pm Naslov sporočila: pic12f675 |
|
|
Želim s enaučiti par osnov iz programiranja picev v asm. Pa sem naletel na težavo. In sicer se mi noče sprožiti prekinitev timerja0(saj se gp2 ne postavi na 1).Kje ga lomim?
Prilagam kodo:
Koda: |
include P12F675.INC
__CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
WTMP equ 0x20
STATUS_TMP equ 0x21
STEVEC equ 0x22
org 0x00
goto GLAVNI
org 0x04
goto PREKINITEV
;------------------------------------------------
PREKINITEV
movwf WTMP ;shranim W
swapf STATUS,W ;uporabimo SWAPF ker ne vpliva na statusne bite
movwf STATUS_TMP ;shranem status registe
btfsc INTCON,T0IF ;je priçlo do TMR0 prekinitve
goto TMR_PREK
;tukaj lahko nadaljujemo s kodo ter ugotavljamo kako drugo vrsto prekinitve
END_PREK
swapf STATUS_TMP,W ;
movwf STATUS ;vrnem status
swapf WTMP,F
swapf WTMP,W ;vrnem W
retfie ;iz prekinitve
TMR_PREK
bsf GPIO,GP2
bcf INTCON,T0IF ;briçem bit T0 prekinitve
goto END_PREK
;-------------------------------------------------------------------------
GLAVNI
call init
bcf GPIO,GP0
bsf GPIO,GP1
zanka
nop
goto zanka
;-------------------------------------------------------------------------
init
clrwdt ;Clear WDT and
; postscaler
bsf STATUS,RP0 ;Bank 1
movlw b'10000111' ;Select TMR0,
; prescale, and
; clock source
movwf OPTION_REG ;
bcf STATUS,RP0 ;Bank 0
movlw 0x00
movwf GPIO
bsf STATUS,RP0; bank1
movwf TRISIO
bcf STATUS,RP0;bank0
movlw b'10100000' ; omogoźili bomo prekinitve ter vkljuźili
movwf INTCON ;TMPO prekinitev ki se izvede pri prekinitvi çtevca tmr0
return
END |
|
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Sre Nov 26, 2008 11:22 pm Naslov sporočila: |
|
|
Komparatorje ugasni _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Tor Dec 02, 2008 7:08 pm Naslov sporočila: |
|
|
še nakaj: kako pa bi čimbolj enostavno izvedel "if else stavek" v asm. recimo da hočem postaviti nek 1/0 pin ko bo vrednost neke spremenljivke med 100 in 150?in obratno |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Tor Dec 02, 2008 7:20 pm Naslov sporočila: |
|
|
C prevajalnik naredi tole ("i" je na naslovu 0x21):
Koda: |
32: if(i<=100 || i>150)
039 0821 MOVF 0x21, W
03A 3C64 SUBLW 0x64
03B 1803 BTFSC 0x3, 0
03C 2841 GOTO 0x41
03D 0821 MOVF 0x21, W
03E 3C96 SUBLW 0x96
03F 1803 BTFSC 0x3, 0
040 2843 GOTO 0x43
33: i=1;
041 3001 MOVLW 0x1
042 00A1 MOVWF 0x21
043 ... |
Kaj krajše verjetno ne bo šlo, vsaj dve primerjavi je treba na vsak način naredit... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Tor Dec 02, 2008 7:27 pm Naslov sporočila: |
|
|
kater c prevajalnik pa je to? je zastonj? kaj omejitve kode? če bo šlo v c-ju le zakaj bi se matral z asm
Hvala za pomoč!
EDIT: Sem že našel h tech c |
|
Nazaj na vrh |
|
|
Sokrat Član
Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 25.06
|
Objavljeno: Sre Dec 03, 2008 12:26 am Naslov sporočila: |
|
|
Poskusi "mikroC" za PICe. Omejitev kode sicer je, ampak ima izbrani MUC pol manj prostora, kolikor znasa omejitev. Prevajalnik podpira vse PICe, na katere sem do zdaj naletel, pri vecjih seveda naletis na omenjeno omejitev (2K programskih besed), a je za vecino programov kar dovolj, pa tudi cena za polno razlicico je vse prej kot pretirana, kar se rado zgodi amerikancem. Mislim, da so drugi prevajalniki precej bolj omejeni, glede bugov pa ne morem nic reci, ker se nisem na nobenega naletel. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
|
BorisP Član
Pridružen-a: Čet 03 Feb 2005 20:52 Prispevkov: 85 Aktiv.: 0.38 Kraj: Celje
|
Objavljeno: Sre Dec 03, 2008 2:21 pm Naslov sporočila: |
|
|
Jaz za PIC12F675 uporabljam CC5X, pa do sedaj še nisem potreboval polne verzije. Naredil pa sem enostavno GSM alarmno napravo na tem PICU. |
|
Nazaj na vrh |
|
|
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Čet Jan 08, 2009 1:33 am Naslov sporočila: |
|
|
izbris |
|
Nazaj na vrh |
|
|
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Tor Feb 24, 2009 5:41 pm Naslov sporočila: |
|
|
Kako izvesti deljenje z 1.5 ? Namreč iz 8 bitne ad pretvorbe potrebujem število od 0 do 170 (seveda me zanima rešitev za zbirnik) |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Tor Feb 24, 2009 7:14 pm Naslov sporočila: |
|
|
Možiš z 2, deliš s 3. Pri množenju (shift levo za 1 bit) pazi na carry. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Tor Feb 24, 2009 7:26 pm Naslov sporočila: |
|
|
Vidim da nisem najbolje zastavil vprašanja. Že prej sem premleval razne kombinacije množenja in deljenja da bi se nekako otresel deljenja z 3,5,... Torej da bi blo vse samo pomikanje ter prištevanje. Torej zanima me kako deliti s 3?
Hvala za pomoč! |
|
Nazaj na vrh |
|
|
Sokrat Član
Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 25.06
|
Objavljeno: Tor Feb 24, 2009 8:07 pm Naslov sporočila: |
|
|
Kako delis s 3 ? Mnozis z 1/3.
Kako ponazoris 1/3 ? Tezko (z omejenim stevilom mest), a to je pac tvoj problem, ker si izbral tako vrednost. Priblizek 1/3 bi bil .01010101010101010101[itd.]b, vec mest, kot si privoscis za racun, manjsa bo napaka.
Primere tovrstnih izracunov in teorijo zadaj najdes v mnogih AppNotih.
In ja, vse skupaj je samo pomikanje in pristevanje. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
|
trully1 Član
Pridružen-a: Pet 14 Nov 2003 20:20 Prispevkov: 216 Aktiv.: 0.97 Kraj: Železniki
|
Objavljeno: Tor Feb 24, 2009 8:35 pm Naslov sporočila: |
|
|
Evo tukaj je v C ju napisana rutina za deljenje s 3. Prevedi v asembler.
x ... štv, ki jo želimo deliti
rez ... rezultat
Koda: |
int div3(int x){
while( x>=6 )
{
int r = x>>2;
rez = rez +r;
x = x - r - r - r;
}
if( x>=3 ) rez++;
return rez;
} |
Dela pa samo za pozitivna števila.
LP Matjaž |
|
Nazaj na vrh |
|
|
krupivnk Član
Pridružen-a: Tor 27 Feb 2007 20:45 Prispevkov: 335 Aktiv.: 1.61 Kraj: Lj
|
Objavljeno: Tor Feb 24, 2009 9:14 pm Naslov sporočila: |
|
|
hvala si mi dal idejo. Čeprav ne razumem zakaj uporabljaš tole funkcijo v C-ju |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Tor Feb 24, 2009 9:48 pm Naslov sporočila: |
|
|
Osnovne matematične funkcije v asm:
Koda: |
; math funkcije
;
; W register se povozi
; cblock 0x20 ; dostop iz vseh bank
; math_X:2 ; LO-HI
; math_Y:2 ; LO-HI
; math_RES:2 ; LO-HI
; math_IDX:2 ; LO-HI
; math_YY
; endc
;
; 8-bit mul
; math_RES=math_X*math_Y
mul8
clrf math_RES
movf math_X,w
btfsc math_Y,0
addwf math_RES,f
bcf STATUS,C
rrf math_Y,f
bcf STATUS,C
rlf math_X,f
movf math_Y,f
btfss STATUS,Z
goto $-9
return
; 16-bit add
; math_X=math_X+math_Y
add16
movf math_Y,w
addwf math_X,f
btfsc STATUS,C
incf math_X+1,f
movf math_Y+1,w
addwf math_X+1,f
return
; 16-bit add
; math_RES=math_RES+math_X
add16r
movf math_X,w
addwf math_RES,f
btfsc STATUS,C
incf math_RES+1,f
movf math_X+1,w
addwf math_RES+1,f
return
; 16-bit mul
; math_RES=math_X*math_Y
mul16
clrf math_RES
clrf math_RES+1
btfsc math_Y,0
call add16r
bcf STATUS,C
rrf math_Y+1,f
rrf math_Y,f
bcf STATUS,C
rlf math_X,f
rlf math_X+1,f
movf math_Y,f
btfss STATUS,Z
goto $-.10 ;mul16_1
movf math_Y+1,f
btfss STATUS,Z
goto $-.13 ;mul16_1
return
; 8-bit div
; math_RES=math_X/math_Y
; ostanek v math_X
div8
movf math_Y,f
btfsc STATUS,Z
return
clrf math_RES
movlw 1
movwf math_IDX
bcf STATUS,C
rlf math_IDX,f
bcf STATUS,C
rlf math_Y,f
btfss math_Y,7
goto $-5
movf math_Y,w
subwf math_X,f
btfsc STATUS,C
goto $+3
addwf math_X,f
goto $+3
movf math_IDX,w
addwf math_RES,f
bcf STATUS,C
rrf math_Y,f
bcf STATUS,C
rrf math_IDX,f
btfss STATUS,C
goto $-.13
return
; 16-bit sub
; math_X=math_X-math_Y
sub16
movf math_Y+1,w
movwf math_YY
movf math_Y,w
subwf math_X,f
btfss STATUS,C
incf math_YY,f
movf math_YY,w
subwf math_X+1,f
return
; 16-bit div
; math_RES=math_X/math_Y
; ostanek v math_X
div16
movf math_Y,f
btfss STATUS,Z
goto $+4
movf math_Y+1,f
btfsc STATUS,Z
return
movlw 1
movwf math_IDX
clrf math_IDX+1
clrf math_RES
clrf math_RES+1
bcf STATUS,C
rlf math_IDX,f
rlf math_IDX+1,f
bcf STATUS,C
rlf math_Y,f
rlf math_Y+1,f
btfss math_Y+1,7
goto $-7
call sub16
btfsc STATUS,C
goto $+3
call add16
goto $+7
movf math_IDX,w
addwf math_RES,f
btfsc STATUS,C
incf math_RES+1,f
movf math_IDX+1,w
addwf math_RES+1,f
bcf STATUS,C
rrf math_Y+1,f
rrf math_Y,f
bcf STATUS,C
rrf math_IDX+1,f
rrf math_IDX,f
btfss STATUS,C
goto $-.18
return
|
_________________ 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: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|