PIC elado
Istvan Retaller
istvan.retaller at evoran.hu
Tue Apr 29 12:27:06 CEST 2003
Szia, Imre!
2003.04.29. 10:41:42, Miko Imre <imre.miko at siemens.com> wrote:
>Meg lehet irni, sot igy is kell tenned. De a szamokat amit a lebegopontos
>aritmetikaban ossze akarsz szorozni, nyilvan nem a regiszterekben
>keletkezik, tehat muvelet elott be kell tolteni a muvelet vegen el kell
>menteni a memoriaban. Es ez nem csak AVR-nel van igy.
>
>> >a PIC-nel egy operandusos muvelet (egy valtozo novelese)
>> >
>> > incf valtozo,f
>> >
>> >AVR-nel ha jol sejtem ugyanez:
>> >
>> > lds rega, cim
>> > inc rega
>> > sts cim, rega
>>
>> Hm. Es ha az AVR-ben hozzatartozik a valtozo inicializalasa, majd mentese,
>> akkor a PIC-ben miert nincsen inicializalva es mentve...?
>
>Mint irtad, hogy te szimulatort is irtal PIC-re, akkor tudnod kell, hogy PIC-nel
>az incf utasitasban a valtozo operandus kozvetlen egy fileregiszter operandus
>azaz a memoriaoperandus. Ahhoz, hogy megnoveljuk nem kell az adatot a
>regiszterbe mozgatni, majd megnoveles utan ujra tarolni a memoriaban.
>Megtehetem persze ezt:
>
> movf valtozo,w
> addlw 1
> movwf valtozo
>
>De minek, ha eleg a fenti
>
> incf valtozo,f
>
>AVR-nel visszont egy memoriaban levo ertek megnovelese mindig megkoveteli
>a regiszterbe toltest, majd mentest. Ezek utan miben santit szerinted a
>peldam?
Nos, itt vagyok bajban, mikor tobb eve nem hasznalt nyelvben kell peldakat
irnom olyanonak, akik nap mint nap ezt hasznaljak ;))
Szoval alapvetoen a fogalmakat kell tisztazni. Az incf valtozo,f utasitasban
a Pic adatlapok szerint az "f" a "file register" kifejezesbol adodik,
azaz ugyanugy regiszterrol van szo, mint az avr eseten.
A csusztatas ott van, hogy pic esten _nem foglalkozol_ azzal, hogy honnan
es mikor kerult bele ebbe a regiszterbe a tartalma, nem toltod be memoriabol,
mint az avr eseteben, mert ilyen memoria nincs is a pic-ben.
Tehat _mindket_ esetben egyszeru register increment a lenyeg, csak a pic
eseteben adottnak veszed, hogy a megfelelo tartalom mar a regiszerben van,
nem vizsgalod, honnan, mikor, ki inicializalta azt az erteket, avr eseteben
meg hozzateszel egy inicializalast, meg egy mentest. Ez az inkorrekt.
>> >ket operandusos muvelet (ket valtozo osszeadasa, es tarolas egy harmadikban a= b + c)
>> >
>> >PIC:
>> > movf b,w
>> > addwf c,w
>> > movwf a
>> >
>> >AVR:
>> > lds rega, a
>> > lds regb, b
>> > add rega, regb
>> > sts c, rega
>> >
Itt megint ugyaz az alapallas es a tobbit mar nem is folytatom, mert vegig ez a
vonulat. Nezzuk:
movf b,w ;a W-bol toltesz a b-be. De a w-t sem inicializaltad!
addwf c,w ;ugyanazt az inicializalatlan W-t adod hozza a c-hez
movwf a
Vegezd el konstansokkal es tedd le az eredmenyt valahova, igy nem lehet
csusztatni:
Tegyuk el a 11+22 eredmenyet kesobbi felhasznalasra.
Pic-ben az egyetlen lehetoseged:
movlw 11
movwf rega
addlw 22
movwf regb
Avr-ben:
ldi rega,11
add rega,22
mov regb,rega
vagy
ldi rega,11
add rega,22
push rega
vagy
ldi rega,11
add rega,22
sts memcim,rega
Harom lehetoseged van, az egyik azonos a pic-cel, csak rovidebb, a masik
kettot meg sem lehet csinalni pic-cel.
Egyetlen komplettebb utasitas van a pic-ben, amit nem tudok avr-ben
rovidebb ido alatt utanozni: ha a virtualis indirekt regiszterrel
vegez muveletet. Ez valoban gyorsabb, de meg ez is santit, mert
- az FSR-t elobb oda is kell ra allitani, csak elhallgattuk
- erre az egy nem tudott muveletre valaszul tudok legalabb 10
olyan utasitast, amit meg csak az avr tud.
>> En legfeljebb egy 32*32 bites, mul utasitasok mellozesevel kialakitott
>> szorzorutint tudok felajanlani, hogy ird meg PIC-ben es hasonlitsuk
>> ossze. Szerintem lesz annyi kedved, mint nekem a bin-bcd irasahoz.
>
>A megirasahoz nincs kedvem nekem sem, de vettem a faradsagot es kikerestem
>az app note-ok kozul:
>
> 32x32 Bit Unsigned Fixed Point Multiply 32x32 -> 64
> Max timing: 856 clks
> Min timing: 209 clks
> Prog mem: 168
> Data mem: 17
>
>Aki keri, maganban elkuldom neki.
>
>> Egyebkent sajnalatos, hogy az osszehasonlitasbol a sebessegek, a
>> programmmemoria, RAM, korlatlan stackmelyseg es legfokeppen
>> az _ar_ mind-mind kimaradtak. ;))
Hat avr-ben ez is drasztikusan rovidebb.
Udv, RI
;******************************************************************************
;* *
;* mcount may fit into R0...R15 range, but the others *
;* must be in R16...R31 range. *
;* *
;******************************************************************************
;to be defined in caller:
;#define mcount R9
;#define R0L R17 ;multiplayer + result
;#define R1L R18
;#define R0M R19
;#define R1M R20
;#define R2M R21
;#define R3M R22
;#define R0H R23
;#define R1H R24
;#define ML R25 ;multiplicand
;#define MM0 R26
;#define MM1 R27
;#define MH R28
mul32_64
ldi R1H,32+1 ;miltiplicand is 32 bits wide
mov mcount,R1H
clr R2M
clr R3M
clr R0H
clr R1H
clc
_mul32_1:
ror R1H
ror R0H
ror R3M
ror R2M
ror R1M
ror R0M
ror R1L
ror R0L
brcc _mul32_2
add R2M,ML
adc R3M,MM0
adc R0H,MM1
adc R1H,MH
_mul32_2:
dec mcount
brne _mul32_1
ret
More information about the Elektro
mailing list