forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Prevod 24-bit BIN do BCD asm

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 22 srpen 2016, 20:02    Předmět: Prevod 24-bit BIN do BCD asm Citovat

Ahojte,
nemate niekto pls tip na nejaku funkcnu proceduru na prevod 24-bitoveho binarneho cisla do BCD format (8 cislic) pre PIC16? Nejak sa mi to nedari najst a sam to nezvladnem napisat.

Vdaka.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 708

PříspěvekZaslal: 22 srpen 2016, 20:46    Předmět: Citovat

Jestli Ti to stačí v C, tak by to mohlo být nějak takhle :

kód:
unsigned char BCD[4];
long int PrevadeneCislo;

void PrevodDoBCD(unsigned char *Vystup, long int Vstup)
{
  unsigned char Cislice;

  Cislice = Vstup / 10000000;
  Vstup -= (long int)Cislice*10000000;
  Vystup[0]=(Cislice<<4);
  Cislice = Vstup / 1000000;
  Vstup -= (long int)Cislice*1000000;
  Vystup[0]+=Cislice;

  Cislice = Vstup / 100000;
  Vstup -= (long int)Cislice*100000;
  Vystup[1]=(Cislice<<4);
  Cislice = Vstup / 10000;
  Vstup -= (long int)Cislice*10000;
  Vystup[1]+=Cislice;

  Cislice = Vstup / 1000;
  Vstup -= (long int)Cislice*1000;
  Vystup[2]=(Cislice<<4);
  Cislice = Vstup / 100;
  Vstup -= (long int)Cislice*100;
  Vystup[2]+=Cislice;

  Cislice = Vstup / 10;
  Vstup -= (long int)Cislice*10;
  Vystup[3]=(Cislice<<4);
  Vystup[3]+=Vstup;

}


Volání je pak :

kód:
  PrevodDoBCD(BCD, PrevadeneCislo);


Asi budeš muset přihodit nějaký to přetypování, ale jinak by to mělo chodit.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Anonymní






PříspěvekZaslal: 22 srpen 2016, 22:03    Předmět: Citovat

Zkus to projít, určitě to nějak dáš...
https://sites.google.com/a/asu.edu/sreekar/other-interests/embedded-systems/binary-to-bcd-in-embedded-uc-code
http://www.piclist.com/techref/microchip/math/radix/index.htm?key=Looking%20for%20work
http://ww1.microchip.com/downloads/en/AppNotes/00526e.pdf
Návrat nahoru
 

 
JohnBoss
Přispěvatel
Přispěvatel


Založen: 18.1.2016
Příspěvky: 20

PříspěvekZaslal: 24 srpen 2016, 4:10    Předmět: Citovat

Stačí hledat-

kód:
http://forum.mcontrollers.com/viewtopic.php?t=547&highlight=matematika
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Dybbuk
Přispěvatel
Přispěvatel


Založen: 18.3.2016
Příspěvky: 28

PříspěvekZaslal: 25 srpen 2016, 13:07    Předmět: Citovat

Zdravim,
Balů: Vdaka, istotne to pouzijem ako studijny material jedneho dna ked to konecne vzdam s assemblerom a prejdem na C.

Anonymní: Prvy link uzitocny, pekne vysvetlenie principu na prevod 8-bitoveho cisla, ale update na tri 8-bitove registre ktore treba previest do 10 ascii digitov by bol vazne komplikovany.
Druhy link: tie 24bit to bcd procedury bud nefunguju, alebo som ich zle pouzil.
Treti link: neriesi 24-bitove cisla.

JohnBoss:Uzitocny link v pripade ak chcem 24-bitovo nasobit alebo delit, prevod do ascii tam ale nie je.

Po dlhom hladani sa mi podarilo nakoniec najst proceduru ktora funguje, takze ju tu pastnem, mozno v buducnosti niekto z toho vytazi
kód:
         ; ****************** Convert 24 bit binary to ASCII ************
            ;
ToAscii            ; --- Do binary to packed BCD first
            ;
b2bcd   movlw   24      ; 24-bits
   movwf   rI      ; Make cycle counter
   clrf   rBcd      ; Clear result area
   clrf   rBcd+1      ;
   clrf   rBcd+2      ;
   clrf   rBcd+3      ;
            ;
b2bcd2   movlw   rBcd      ; Make pointer
   movwf   FSR      ;
   movlw   8/2      ; Eight BCD nibbles, four packed bytes
   movwf   rCnt      ;
            ;
b2bcd3   movlw   0x33      ; Add 3 to each nibble
   addwf   INDF,F      ;
   btfsc   INDF,3      ; Test if low result > 7
   andlw   0xf0      ; Low result >7 so don't take the 3 out
   btfsc   INDF,7      ; Test if high result > 7
   andlw   0x0f      ; High result > 7 so don't take the 3 out
   subwf   INDF,F      ; Any results <= 7, subtract back
   incf   FSR,F      ; Point to next
   decfsz   rCnt,F      ; Dec byte count
   goto   b2bcd3      ; Do next byte...
            ;
   rlf   rBin+2,f   ; Get another bit
   rlf   rBin+1,f   ;
   rlf   rBin+0,f   ;
   rlf   rBcd+3,f   ; Put it into bcd
   rlf   rBcd+2,f   ;
   rlf   rBcd+1,f   ;
   rlf   rBcd+0,f   ;
   decfsz   rI,f      ; All done?
   goto   b2bcd2      ; No, loop
            ;
            ;
            ;
            ; --- Convert the 8 binary coded digits (4 bytes) starting at
            ; <bcd> into an ascii string also starting at <bcd>. Original
            ; bcd digits are lost.
            ;
bcd2a   movlw   rAscii+7   ;
   movwf   rPto      ; Destination pointer
   movlw   rBcd+3      ;
   movwf   rPti      ; Source pointer
   movlw   4      ; 4 bytes to process
   movwf   rCnt      ;
            ;
bcd2a1   movf   rPti,W      ; Get current input pointer
   movwf   FSR      ;
   decf   rPti,F      ; Prepare for next
   movf   INDF,W      ; Get 2 bcds
   movwf   rTemp      ; Save for later
   movf   rPto,W      ; Get current output pointer
   movwf   FSR      ;
   decf   rPto,F      ; Prepare for next
   decf   rPto,F      ;
   movf   rTemp,W      ; Get digits back
   andlw   0x0f      ; Process lsd
   movwf   INDF      ;
   movlw   '0'      ;
   addwf   INDF,F      ; To output
   decf   FSR,F      ;
   swapf   rTemp,W      ; Process msd
   andlw   0x0f      ;
   movwf   INDF      ;
   movlw   '0'      ;
   addwf   INDF,F      ; To output
   decfsz   rCnt,F      ; All digits?
   goto   bcd2a1      ;
   retlw 0


a zdroj (prispevok 2):
kód:
https://forum.sparkfun.com/viewtopic.php?t=5725


Dakujem.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
JohnBoss
Přispěvatel
Přispěvatel


Založen: 18.1.2016
Příspěvky: 20

PříspěvekZaslal: 26 srpen 2016, 13:33    Předmět: Citovat

Omlouvám se, špatně sem si přečetl dotaz, ale aspoň je vidět, že když je člověk po noční a nespal celej den, že má jít radši spát.¨

Já používám toto, je to předělané na 18F, ale stačí upravit FSR a INDF podle řady PIC

kód:
;**************************************************************************
; Prevod 24 \ na DEC
; vstup C3,2,1
; pouziva FSR2, C1,C2,C3,TMP1,D1,D2
; vystup dec0 - 7
;**************************************************************************
BIN2dec      
   lfsr   2,dec0
   clrf   POSTINC2
   clrf   POSTINC2
   clrf   POSTINC2
   clrf   POSTINC2
   clrf   POSTINC2
   clrf   POSTINC2
   clrf   POSTINC2
   clrf   POSTINC2
   movlw    .24        ; Initiate bit loop
   banksel   D1
   movwf    D1
BITLOOP
   banksel   C1
   rlcf    C1, F      ; Every iteration of this loop will copy the next
     rlcf    C2, F      ; bit of the bin value, starting with the MSB,
    rlcf    C3, F      ; to the carry flag
   lfsr   2,dec0
   movlw    .8
   movwf    D2         ; The following is executed 8 times per bit
   movff   STATUS,TMP1
decLOOP
   banksel   0
   movff   TMP1,STATUS
   rlcf    INDF2, F   ; Multiply decn by two with carry, decn * 2 + C
    movlw    .246      ; See note above - test for decn > 9
    addwf    INDF2, W   ; W = decn -10, if W = positive or zero, C = 1
      btfsc    STATUS, C   ; decn has overflowed (>>9) if carry is set
      movwf    INDF2   ; If carry is set decn = decn - 10
   movff   STATUS,TMP1
      incf    FSR2L, F   ; Carry is CARRIED over to next multiply
   banksel   D2
      decfsz    D2, F
      goto    decLOOP   ; Multiply next decn
      decfsz    D1, F
      goto    BITLOOP   ; Do next bit
      retlw   0      ; Could be RETURN on most pics
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)