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