Vissza a főoldalra    Vissza a PIC főoldalra

<< Előző oldal   Vissza a tartalomjegyzékhez   Következő oldal >>

 


11.4.20. 16 bit bináris/5 jegyű BCD átalakítás


Assembly programozás tartalomjegyzék

"A" algoritmus
"B" algoritmus
"C" algoritmus


      A fejezetben bemutatott algoritmusok a következő ábra szerinti 16 bites bináris/ötjegyű BCD átalakítást hajtják végre.

Bináris/BCD átalakítás

11.4.20-1. Ábra

      Az egyes megoldások méret- és sebesség-jellemzői láthatók a következő táblázatban.

11.4.20-1. Táblázat
Algoritmus Programmemória
helyfoglalás
Futási idő [utasításciklus]
Minimum Maximum
A 35 900 900
B 54 30 250
C 87 53 300


      A algoritmus:

      Ez az algoritmus az AN526 programozási algoritmus-gyűjteményben került bemutatásra (Microchip). A megvalósított program rövid (35 sor), de a futási idő viszonylag hosszú (900 utasításciklus).
      A 16 bites bináris kiinduló érték a BINH és BINL regiszterekben van, de a programfutás során elveszik. Az eredmény, a 20 bites ötjegyű BCD szám, a BCD3, BCD2 és BCD1 regiszterekbe kerül. A program felhasznál még egy SZAM és egy REKESZ azonosítójú általános adatregisztert.

      A bináris kiinduló adat (50328d) bitsorrendje:

11.4.20-2. Táblázat
BCDH BCDL
7. 6. 5. 4. 3. 2. 1. 0. 7. 6. 5. 4. 3. 2. 1. 0.
215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0

      A BCD kódolt eredmény (50328BCD) bitsorrendje:

11.4.20-3. Táblázat
BCD3 BCD2 BCD1
7. 6. 5. 4. 3. 2. 1. 0. 7. 6. 5. 4. 3. 2. 1. 0. 7. 6. 5. 4. 3. 2. 1. 0.
x x x x 23 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20
x x x x 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0
x 104 103 102 101 100

      Az algoritmus folyamatábrája:

Az A algoritmus
11.4.20-2. Ábra

      A folyamatábrát megvalósító programrészlet:

... ...    
  bcf STATUS,0 ;a STATUS regiszter C jelzőbit nullázása
  movlw 0x10 ;W = 16d
  movwf SZAM ;SZAM = 16d
  clrf BCD1 ;BCD1 = 0
  clrf BCD2 ;BCD2 = 0
  clrf BCD3 ;BCD3 = 0
UJRA rlf BINL,1 ;BINL balra forgatása a C-n keresztül
  rlf BINH,1 ;BINH balra forgatása a C-n keresztül
  rlf BCD1,1 ;BCD1 balra forgatása a C-n keresztül
  rlf BCD2,1 ;BCD2 balra forgatása a C-n keresztül
  rlf BCD3,1 ;BCD3 balra forgatása a C-n keresztül
  decfsz SZAM,1 ;SZAM = SZAM - 1 és zérusteszt
  goto TOVABB ;ugrik, ha SZAM > 0
  goto VEGE ;ugrik, ha SZAM = 0
TOVABB movlw BCD1 ;W = a BCD1 memóriacíme
  movwf FSR ;a közvetett címzés regiszterének betöltése
  call HELYES ;a helyesbítő szubrutin hívása
  movlw BCD2 ;W = a BCD2 memóriacíme
  movwf FSR ;a közvetett címzés regiszterének betöltése
  call HELYES ;a helyesbítő szubrutin hívása
  movlw BCD3 ;W = a BCD3 memóriacíme
  movwf FSR ;a közvetett címzés regiszterének betöltése
  call HELYES ;a helyesbítő szubrutin hívása
  goto UJRA ;vissza a ciklus elejére
VEGE ...    
  ...    
HELYES movlw 0x03 ;W = 3h
  addwf INDF,0 ;W = az FSR által megcímzett regiszter + 3
  movwf REKESZ ;REKESZ = W
  btfsc REKESZ,3 ;a REKESZ 3. bitjének tesztelése
  movwf INDF ;az FSR által mutatott regiszter = W
  movlw 0x30 ;W = 30h
  addwf INDF,0 ;W = az FSR által megcímzett regiszter + 30h
  movwf REKESZ ;REKESZ = W
  btfsc REKESZ,7 ;a REKESZ 7. bitjének tesztelése
  movwf INDF ;az FSR által mutatott regiszter = W
  return   ;a szubrutin vége
  ...    

Vissza a lap tetejére


      B algoritmus:

      Ez az algoritmus a 16 bites osztás kivonással történő megvalósításán alapul (Tudomány és Technika). A megvalósított program viszonylag rövid (54 sor), a futási idő (30..250 utasításciklus) a bináris szám nagyságától függ.
      A 16 bites bináris kiinduló érték a BINH és BINL regiszterekben van, de a programfutás során elveszik. Az eredmény, az ötjegyű BCD szám, a BCD5, BCD4, BCD3, BCD2 és BCD1 regiszterek alsó 4 bitjére kerül.

      A bináris kiinduló adat (50328d) bitsorrendje:

11.4.20-4. Táblázat
BCDH BCDL
7. 6. 5. 4. 3. 2. 1. 0. 7. 6. 5. 4. 3. 2. 1. 0.
215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20
1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0

      A BCD kódolt eredmény (50328BCD) bitsorrendje:

11.4.20-5. Táblázat
BCD5 BCD4 BCD3 BCD2 BCD1
7.-4. 3. 2. 1. 0. 7.-4. 3. 2. 1. 0. 7.-4. 3. 2. 1. 0. 7.-4. 3. 2. 1. 0. 7.-4. 3. 2. 1. 0.
x 23 22 21 20 x 23 22 21 20 x 23 22 21 20 x 23 22 21 20 x 23 22 21 20
x 0 1 0 1 x 0 0 0 0 x 0 0 1 1 x 0 0 1 0 x 1 0 0 0
104 103 102 101 100

      Az algoritmus folyamatábrája:

A B algoritmus
11.4.20-3. Ábra

      A folyamatábrát megvalósító programrészlet:

... ...    
  clrf BCD1 ;BCD1 = 0
  clrf BCD2 ;BCD2 = 0
  clrf BCD3 ;BCD3 = 0
  clrf BCD4 ;BCD4 = 0
  clrf BCD5 ;BCD5 = 0
T5 movlw 0x27 ;-10000 kölcsönig ismételve
  subwf BINH,0  
  btfss STATUS,0  
  goto T4  
  movwf BINH  
  movlw 0x10  
  subwf BINL,1  
  btfss STATUS,0  
  decf BINH,1  
  incf BCD5,1  
  goto T5  
T4 movlw 0x03 ;-1000 kölcsönig ismételve
  subwf BINH,0  
  btfss STATUS,0  
  goto T3A  
  movwf BINH  
  movlw 0xE8  
  subwf BINL,1  
  btfss STATUS,0  
  decf BINH,1  
  incf BCD4,1  
  goto T4  
T3A movlw 0x01 ;-100 kölcsönig ismételve
  subwf BINH,0  
  btfsc STATUS,0 ;BINH > 0 ?
  goto T3B ;ha BINH > 0
  movlw 0x64 ;ha BINH = 0
  subwf BINL,0  
  btfss STATUS,0  
  goto T2  
  movwf BINL  
  incf BCD3,1  
  goto T3A  
T3B movlw 0x64 ;ha BINH > 0
  subwf BINL,0  
  btfss STATUS,0  
  decf BINH,1  
  movwf BINL  
  incf BCD3,1  
  goto T3A  
T2 movlw 0x0A ;-10 kölcsönig ismételve
  subwf BINL,0  
  btfss STATUS,0  
  goto T1  
  movwf BINL  
  incf BCD2,1  
  goto T2  
T1 movf BINL,0 W = BINL
  movwf BCD1 BCD1 = BINL
  ...    

Vissza a lap tetejére


      C algoritmus:

      Ez az algoritmus a bináris helyiértékek egyenkénti feldolgozásán alapul (Tudomány és Technika). A megvalósított program közepesen hosszú (87 sor), a futási idő (53..300 utasításciklus) a bináris szám "1"-eseinek számától és helyétől függ.
      A 8 bites bináris kiinduló érték a BIN regiszterben van és a program lefutása után is megmarad. Az eredmény, a 8 bites kétjegyű BCD szám, a W munkaregiszterbe kerül. Az algoritmus a bináris számban előforduló helyiértékek

tízezreseit a BCD5,
ezreseit a BCD4,
százasait a BCD3,
tízeseit a BCD2,
egyeseit a BCD1
azonosítójú általános adatregiszterbe gyűjti, majd az összegyűlt, kilencnél nagyobb értékeket leosztja.
      Ez az algoritmus kibővíthető többjegyű BCD számokhoz is. (Például 32 bit bináris/10-jegyű BCD átalakításhoz, amivel a 0-tól 4.294.967.295-ig terjedő számtartomány kezelhető.)

      A bináris kiinduló adat (50328d) és a BCD kódolt eredmény bitsorrendje az előző algoritmusénak megfelelő.

      Az algoritmus folyamatábrája:

A C algoritmus
11.4.20-4. Ábra

Vissza a lap tetejére

      A folyamatábrát megvalósító programrészlet:

... ...    
  clrf BCD1 ;eredmény-regiszterek nullázása
  clrf BCD2  
  clrf BCD3  
  clrf BCD4  
  clrf BCD5  
  btfsc BINH,7 ;helyiértékek szétosztása
  call H7  
  btfsc BINH,6  
  call H6  
  btfsc BINH,5  
  call H5  
  btfsc BINH,4  
  call H4  
  btfsc BINH,3  
  call H3  
  btfsc BINH,2  
  call H2  
  btfsc BINH,1  
  call H1  
  btfsc BINH,0  
  call H0  
  btfsc BINL,7  
  call L7  
  btfsc BINL,6  
  call L6  
  btfsc BINL,5  
  call L5  
  btfsc BINL,4  
  call L4  
  movlw 0x0F  
  andwf BINL,0 ;W = BINL alsó négy bitje
  addwf BCD1,1  
T1 movlw 0x0A ;BCD1 értéktúllépés vizsgálata
  subwf BCD1,0  
  btfss STATUS,0  
  goto T2 ;ugrik, ha már nincs értéktúllépés
  movwf BCD1  
  incf BCD2,1  
  goto T1  
T2 movlw 0x0A ;BCD2 értéktúllépés vizsgálata
  subwf BCD2,0  
  btfss STATUS,0  
  goto T3 ;ugrik, ha már nincs értéktúllépés
  movwf BCD2  
  incf BCD3,1  
  goto T2  
T3 movlw 0x0A ;BCD3 értéktúllépés vizsgálata
  subwf BCD3,0  
  btfss STATUS,0  
  goto T4 ;ugrik, ha már nincs értéktúllépés
  movwf BCD3  
  incf BCD4,1  
  goto T3  
T4 movlw 0x0A ;BCD4 értéktúllépés vizsgálata
  subwf BCD4,0  
  btfss STATUS,0  
  goto VEGE ;ugrik, ha már nincs értéktúllépés
  movwf BCD4  
  incf BCD5,1  
  goto T4  
VEGE ...    
  ...    
H7 movlw 0x03 ;32768 szétosztása
  addwf BCD5,1  
  movlw 0x02  
  addwf BCD4,1  
  movlw 0x07  
  addwf BCD3,1  
  movlw 0x06  
  addwf BCD2,1  
  movlw 0x08  
  addwf BCD1,1  
  return    
H6 incf BCD5,1 ;16384 szétosztása
  movlw 0x06  
  addwf BCD4,1  
  movlw 0x03  
  addwf BCD3,1  
  movlw 0x08  
  addwf BCD2,1  
  movlw 0x04  
  addwf BCD1,1  
  return    
H5 movlw 0x08 ;8192 szétosztása
  addwf BCD4,1  
  incf BCD3,1  
  movlw 0x09  
  addwf BCD2,1  
  movlw 0x02  
  addwf BCD1,1  
  return    
H4 movlw 0x04 ;4096 szétosztása
  addwf BCD4,1  
  movlw 0x09  
  addwf BCD2,1  
  movlw 0x06  
  addwf BCD1,1  
  return    
H3 movlw 0x02 ;2048 szétosztása
  addwf BCD4,1  
  movlw 0x04  
  addwf BCD2,1  
  movlw 0x08  
  addwf BCD1,1  
  return    
H2 incf BCD4,1 ;1024 szétosztása
  movlw 0x02  
  addwf BCD2,1  
  movlw 0x04  
  addwf BCD1,1  
  return    
H1 movlw 0x05 ;512 szétosztása
  addwf BCD3,1  
  incf BCD2,1  
  movlw 0x02  
  addwf BCD1,1  
  return    
H0 movlw 0x02 ;256 szétosztása
  addwf BCD3,1  
  movlw 0x05  
  addwf BCD2,1  
  movlw 0x06  
  addwf BCD1,1  
  return    
L7 incf BCD3,1 ;128 szétosztása
  movlw 0x02  
  addwf BCD2,1  
  movlw 0x08  
  addwf BCD1,1  
  return    
L6 movlw 0x06 ;64 szétosztása
  addwf BCD2,1  
  movlw 0x04  
  addwf BCD1,1  
  return    
L5 movlw 0x03 ;32 szétosztása
  addwf BCD2,1  
  movlw 0x02  
  addwf BCD1,1  
  return    
L4 incf BCD2,1 ;16 szétosztása
  movlw 0x06  
  addwf BCD1,1  
  return    
  ...    

  Tudomány és Technika (test@t-es-t.hu)


 

<< Előző oldal   Vissza a tartalomjegyzékhez   Vissza a lap tetejére   Következő oldal >>

Vissza a főoldalra    Vissza a PIC főoldalra