PIC elado

Miko Imre imre.miko at siemens.com
Wed Apr 30 14:50:23 CEST 2003


Szia Istvan!

Istvan Retaller wrote:

> 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.

Igy van itt a memoria = file regiszterek, tehat amit file regiszteren vegzel, azt
tulajdonkeppen a memoriaban teszed. (vagy porton)

> 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.

Vegyuk az erteket egyik portrol es tegyuk ki a masikra:

PIC:
        incf    PORTA,w
        movwf PORTB

AVR:
        in rega, PORT_A
        inc rega
        out PORT_A, 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!

Gondolom mar elfelejtetted, azert lehet de ez pont a w inicializalasa b-bol.

>    addwf   c,w          ;ugyanazt az inicializalatlan W-t adod hozza a c-hez

Itt az inicializalt w-hez adom a c-t.

>    movwf   a

es tarolom

> 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         ; <<

Ez a sor itt felesleges

>   addlw 22
>   movwf regb

> >> 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
> >
> 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

Nos, tetszik ez az algoritmus, mar ezert erdemes volt egy kicsit
vitatkoznunk, igy megismertem ezt is. Ezek szerint az Microchip App note
iroi sem voltak a helyzet magaslatan. Atirtam PIC18-ra, az alabbiakban l
athatod. Csak kicsit hosszabb mint AVR-en:
(Ja es meg valami: a 10MHz-es PIC18 10MIPS-et tud)


mul32_64
        movlw 32+1                ;miltiplicand is 32 bits wide
        movwf   LOOPCOUNT

        clrf AARGB3
        clrf AARGB2
        clrf AARGB1
        clrf AARGB0
        clrc
_mul32_1:
        rrf AARGB0,f
        rrf AARGB1,f
        rrf AARGB2,f
        rrf AARGB3,f
        rrf AARGB4,f
        rrf AARGB5,f
        rrf AARGB6,f
        rrf AARGB7,f
        bnc _mul32_2

        movf BARGB3,w
        addwf AARGB3,f
        movf BARGB2,w
        addwfc AARGB2,f
        movf BARGB1,w
        addwfc AARGB1,f
        movf BARGB0,w
        addwfc AARGB0,f

_mul32_2:
        decfsz LOOPCOUNT,f
        goto _mul32_1
        return


Konkluzio:
Aki most kezd uj projektet, es van ideje uj kontroller megtanulasara
valassza az AVR csaladot, nem fog csalodni. Ha nincs ido az uj csalad
elsajatitasara, vagy csak ugyis par darab kell(ar!), nem kritikus a progi
sebessege, vagy van a fiokban valami mas, akkor hasznaljuk azt amit
mar ismerunk, es be van jaratva. (Persze, csak akkor, ha nem akarunk
sokat szivni!)

Udv.
Imre



More information about the Elektro mailing list