PIC elado
Miko Imre
imre.miko at siemens.com
Mon Apr 28 17:27:08 CEST 2003
Sziasztok,
Kezd itt atmenni anyazasba a dolog. Fiuk probaljuk meg kulturalt keretek kozott
megvitatni ezt a kerdest. En nem akarom vedeni a PIC-et, de egyenlore nem
ismerem elegge az AVR-t, hogy korrekt osszehaonlitast tegyek. Elso
ranezesre eleg hatekonynak tunik az AVR utasitaskeszlete, es nem is akarom
vitatni az erdemeit, de lassuk be a PIC egy egesz mas elkepzelesen
alapul, ahol nincsenek regiszterek, vagy minden memoriarekesz regiszter is egyben?
Ki ki nevezze ahogy akarja. Ez nem ritak a kontrollerek koreben,
pl a Siemens 80c167 is hasonlo elkepzelesen alapul. Itt minden memoriaval lehet
muveleteket vegezni, a szuk keresztmetszet persze lehet W regiszter, vagy
akkumulator, mert a muvelet masodik operandusa (amennyiben nem egy, hanem
ketto van), mindig a W.
Ellenben az AVR-nel mindig be kell tolteni az operandusokat a regiszterekbe,
muveletet vegezni, es eltarolni az eredmenyt.
tehat a sok movf es movwf utasitas az AVR-nel is megvan hiszen ott minden
muvelet elott be kell tolteni az operandusokat, mig PIC-nel egy operandusos
utasitas eseten soha, ketoperandusos eseten pedig csak az egyiket.
Mindenki dontse el maga melyik a szamara hatekonyabb.
32 regiszter ide vagy oda, biztosan szukseg van a operandusok olvasasara,
tarolasara. Es a 32 regiszter sem 32, ha mar elhasznalom az X,Y satobbit
indirek cimzesekhez egy reszet. Teny ami teny C forditot konnyebb irni az AVR-re,
pont a hatekony utasitaskeszlet miatt.
Egy olyan feladatnal, ahol sok valtozod van, ott mar mindent nem tarolhatsz
a regiszterekben. Lassunk egy-ket peldat:
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
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
Nezzuk ugy, hogy a += b;
PIC:
movf b,w
addwf a,f
AVR:
lds rega, a
lds regb, b
add rega, regb
sts a, rega
Tegyleg igazatok van, kisarkitott voltak a peldaim, mert altalaban
tobb muveletet vegezunk altalaban egymas utan, es csak utanna
taroljuk az eredmenyt. Erre legyen pelda az Istvan morickaja:
Istvan Retaller wrote:
> Egy Moricka-pelda:
> Negy portot olvasok be es az a+b*c-d fuggvenyt kell kiszamitanom.
> Ez hany utasitas, mennyi ido PIC-ben?, Tetelezzuk fel,
> hogy 8 bites a szorzas eredmenye, mert ha 16 bites, a PIC meg jobban
> lemarad. AVR-re igy nez ki:
> in rega,PORT_A
> in regb,PORT_B
> in regc,PORT_C
> in regd,PORT_D
> mul regb,regc
> add rega,R0
> add regd,rega
Ha mar hw szorzo, akkor en a 18-as szeriat emlitem:
PIC18xxx -en:
movf PORTB,w
mulwf PORTC
movf PORTD,w
subwf PRODL,w
addf PORTA,w
Meg mielott erzelmekkel tulfutve lehordjuk a sarga foldig a PIC-eket,
es istenitjuk az AVR-t, legalabb objektiven gondoljuk at. Az MCU-k is
fejlodnek, jelenleg az AVR egy ujabb csalad, es jo alternativa.
De ne jelentsuk mar ki, hogy ez a legjobb mindenre. Nem csak x51, PIC,
SX es AVR letezik.
Es vegul, hogy ne csak kisarkitott peldakat hozzunk, lassunk egy eleg
gyakori muveletet egy 16 bites binaris szam BCD-ve alakitasat:
Ez PIC-en igy nez ki (32 word a programmemoriaban, 6 fileregiszter,
es 406 orajel hosszu):
cblock
AARG8:0, AARG16:0, AARG24:0
AARGB0, AARGB1, AARGB2
BARG8:0, BARG16:0
BARGB0, BARGB1
LOOPCOUNT
endc
; Input : BARG16 ; 16 bit binary number
; Output: AARGB0:AARGB1:AARGB2 ; (AARG24) converted number (5 digit)
bin2bcd16
movlw 16
movwf LOOPCOUNT
clrf AARGB0
clrf AARGB1
clrf AARGB2
goto _startb16
_adjdec16
movlw 0x33
addwf AARGB0,f
addwf AARGB1,f
addwf AARGB2,f
movlw 0x03
btfss AARGB0,3
subwf AARGB0,f
btfss AARGB1,3
subwf AARGB1,f
btfss AARGB2,3
subwf AARGB2,f
movlw 0x30
btfss AARGB0,7
subwf AARGB0,f
btfss AARGB1,7
subwf AARGB1,f
btfss AARGB2,7
subwf AARGB2,f
_startb16
rlf BARGB1,f
rlf BARGB0,f
rlf AARGB2,f
rlf AARGB1,f
rlf AARGB0,f
decfsz LOOPCOUNT,f
goto _adjdec16
return
Varom az AVR-es implementaciojat, hogy egy ropke oszehasonlitast
tegyunk.
Udv.
Imre
More information about the Elektro
mailing list