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