BIN 2 BCD for AVR

Nov 02, 2004 36 Replies

Hello Oleg.


02 Nov 04 16:16, you wrote to all:

OT> HÅÏÂÈÏÄÉÍÏ ÓËÏÎ×ÅÒÔÉÔØ 32-ÕÈÒÁÚÒÑÄÎÏÅ Ä×ÏÉÞÎÏ ÞÉÓÌÏ × 10-ÒÁÚÒÑÄÎÏÅ OT> ÄÅÓÑÔÉÞÎÏÅ.



OT> èÏÞÕ ÉÍÅÎÎÏ ÁÌÇÏÒÉÔÍ, Ô.Ë. ÒÁÚÒÑÄÎÏÓÔØ, ÍÏÖÅÔ ÂÙÔØ, ÐÒÉÄÅÔÓÑ ÐÏ×ÙÛÁÔØ



á ËÌÁÓÓÉÞÅÓËÉ, ÄÅÌÅÎÉÅÍ ÎÁ ÄÅÓÑÔØ Ó ÏÓÔÁÔËÏÍ ÎÅ ÐÏÄÈÏÄÉÔ?

Alexey


Hi Oleg, hope you are having a nice day!

02 HÏÑ 04, Oleg Terentjev wrote to All:

OT> 0È0F ×ÓÅ ÈÏÒÏÛÏ, 0xFF ÎÉÆÉÇÁ. ëÏÒÒÅËÔÉÒÏ×ÁÔØ ÐÒÉ ÒÁ×ÅÎÓÔ×Å, ÉÌÉ ÐÒÉ OT> ÐÒÅ×ÙÛÅÎÉÉ? á ÔÅÔÒÁÄÙ ËÁË ÌÕÞÛÅ ÐÒÏ×ÅÒÑÔØ? íÁÓËÉÒÕÅÍ, ÐÒÏ×ÅÒÑÅÍ? éÌÉ OT> ÞÔÏ-ÔÏ ÌÅÇÞÅ ÅÓÔØ?

OT> èÏÞÕ ÉÍÅÎÎÏ ÁÌÇÏÒÉÔÍ, Ô.Ë. ÒÁÚÒÑÄÎÏÓÔØ, ÍÏÖÅÔ ÂÙÔØ, ÐÒÉÄÅÔÓÑ ÐÏ×ÙÛÁÔØ OT> :-( Bye-bye!

  1. úÁÇÒÕÖÁÅÍ ÓÞÅÔÞÉË ÚÎÁÞÅÎÉÅÍ, ÒÁ×ÎÙÍ ÞÉÓÌÕ ÂÉÔ × ÉÓÈÏÄÎÏÍ Ä×ÏÉÞÎÏÍ ÞÉÓÌÅ.
  2. ïÞÉÝÁÅÍ ÒÅÚÕÌØÔÁÔ
  3. óÄ×ÉÇÁÅÍ ÉÓÈÏÄÎÏÅ ÞÉÓÌÏ É ÒÅÚÕÌØÔÁÔ ÎÁ ÂÉÔ ×ÌÅ×Ï, ×ÙÔÁÌËÉ×ÁÑ ÓÔÁÒÛÉÊ ÂÉÔ ÞÉÓÌÁ × ÍÌÁÄÛÉÊ ÂÉÔ ÒÅÚÕÌØÔÁÔÁ.
  4. õÍÅÎØÛÁÅÍ ÓÞÅÔÞÉË ÂÉÔ ÎÁ ÅÄÉÎÉÃÕ.
  5. åÓÌÉ ÓÞÅÔÞÉË == 0, ÔÏ ËÏÎÅÃ.
  6. åÓÌÉ ÍÌÁÄÛÁÑ ÔÅÔÒÁÄÁ ÒÅÚÕÌØÔÁÔÁ ÍÅÎØÛÅ 5, ÔÏ ÐÒÉÂÁ×ÌÑÅÍ Ë ÎÅÊ 3.
  7. ðÏ×ÔÏÒÑÅÍ Ð.6 ÄÌÑ ×ÓÅÈ ÏÓÔÁÌØÎÙÈ ÔÅÔÒÁÄ ÒÅÚÕÌØÔÁÔÁ.
  8. ÐÅÒÅÈÏÄÉÍ Ë Ð.3
÷ ÒÅÚÕÌØÔÁÔÅ ÐÏÌÕÞÁÅÍ ÕÐÁËÏ×ÁÎÎÏÅ Ä×ÏÉÞÎÏ-ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ.

WBR, AVB

OT>> HÅÏÂÈÏÄÉÍÏ ÓËÏÎ×ÅÒÔÉÔØ 32-ÕÈÒÁÚÒÑÄÎÏÅ Ä×ÏÉÞÎÏ ÞÉÓÌÏ × 10-ÒÁÚÒÑÄÎÏÅ OT>> ÄÅÓÑÔÉÞÎÏÅ. OT>> èÏÞÕ ÉÍÅÎÎÏ ÁÌÇÏÒÉÔÍ, Ô.Ë. ÒÁÚÒÑÄÎÏÓÔØ, ÍÏÖÅÔ ÂÙÔØ, ÐÒÉÄÅÔÓÑ ÐÏ×ÙÛÁÔØ AB> á ËÌÁÓÓÉÞÅÓËÉ, ÄÅÌÅÎÉÅÍ ÎÁ ÄÅÓÑÔØ Ó ÏÓÔÁÔËÏÍ ÎÅ ÐÏÄÈÏÄÉÔ?

ëÌÁÓÓÉÞÅÓËÉ ÎÕÖÎÏ 10 ÏÐÅÒÁÃÉÊ ÄÅÌÅÎÉÑ (10*32*N ÓÄ×ÉÇÏ× É ÓÌÏÖÅÎÉÊ), Á ÎÅ ËÌÁÓÓÉÞÅÓËÉ -- 32 ÓÄ×ÉÇÁ, 32 Ä×ÏÉÞÎÏ-ÄÅÓÑÔÉÞÎÙÈ ÓÌÏÖÅÎÉÑ Ó ÐÅÒÅÎÏÓÏÍ. åÓÌÉ AVR, ×ÏÔ ÈÏÔØ ÕÂÅÊ ÎÅ ÐÏÍÎÀ, ÉÍÅÅÔ ËÏÍÁÎÄÕ BCD ËÏÒÒÅËÃÉÉ ÐÏÓÌÅ ÓÌÏÖÅÎÉÑ, ÂÕÄÅÔ ÏÞÅÎØ ÂÙÓÔÒÏ.

ïÞÅÐÑÔÏÞËÁ Ó ÕÓÌÏ×ÉÅÍ ÔÏÌØËÏ ×ÙÛÌÁ Õ ÔÅÂÑ
  1. åÓÌÉ ÍÌÁÄÛÁÑ ÔÅÔÒÁÄÁ ÒÅÚÕÌØÔÁÔÁ ÂÏÌØÛÅ 4, ÔÏ ÐÒÉÂÁ×ÌÑÅÍ Ë ÎÅÊ 3.
âÌÉÎ! é ×ÅÄØ ÐÁÛÅÔ. á ÎÁÚ×ÁÎÉÅ Õ ÜÔÏÇÏ ÁÌÇÏÒÉÔÍÁ ÅÓÔØ? é ÓÕÝÅÓÔ×ÕÅÔ ÌÉ ÞÔÏ-ÔÏ ÐÏÄÏÂÎÏÅ ÄÌÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÄÒÏÂÎÏÊ ÞÁÓÔÉ ÞÉÓÌÁ (ÂÉÔÏ× ÐÏÓÌÅ ÚÁÐÑÔÏÊ)? ðÏÐÒÏÂÏ×ÁÌ ÄÌÑ 32-È ÒÁÚÒÑÄÏ×. ðÏÌÕÞÉÌÓÑ ÔÁËÏÊ ÔÅÓÔÉË:

unsigned long long bin2bcd(unsigned int n) { int i; unsigned long long l = 0ULL; for(i=0; i<32; i++) { l <<= 1; if(n&0x80000000) l |= 0x00000001; n <<= 1;

if(i==31) break;

if( (l & 0x000000000FULL) > 0x0000000004ULL) l += 0x0000000003ULL; if( (l & 0x00000000F0ULL) > 0x0000000040ULL) l += 0x0000000030ULL; if( (l & 0x0000000F00ULL) > 0x0000000400ULL) l += 0x0000000300ULL; if( (l & 0x000000F000ULL) > 0x0000004000ULL) l += 0x0000003000ULL; if( (l & 0x00000F0000ULL) > 0x0000040000ULL) l += 0x0000030000ULL; if( (l & 0x0000F00000ULL) > 0x0000400000ULL) l += 0x0000300000ULL; if( (l & 0x000F000000ULL) > 0x0004000000ULL) l += 0x0003000000ULL; if( (l & 0x00F0000000ULL) > 0x0040000000ULL) l += 0x0030000000ULL; if( (l & 0x0F00000000ULL) > 0x0400000000ULL) l += 0x0300000000ULL; if( (l & 0xF000000000ULL) > 0x4000000000ULL) l += 0x3000000000ULL; }

return l; }

HÕ Á ÄÌÑ ÍÎÏÇÏÒÁÚÒÑÄÎÙÈ ÐÒÏÃÅÓÓÏÒÏ× ×ÙÇÏÄÎÅÅ ×ÉÄÉÍÏ ÔÁË:

unsigned long long bin2bcd(unsigned int n) { int i; unsigned long long l = 0ULL; for(i=0; i<32; i++) { l <<= 1; if(n&0x80000000) l |= 0x00000001; n <<= 1;

if(i==31) break;

unsigned long long ll = ( (l>>3) | ((l>>2) & ((l>>1)|l) ) ) &

0x1111111111ULL; l += ll | (ll<<1); }

return l; }

Hi Unrau, hope you are having a nice day!

03 HÏÑ 04, Unrau Alexander wrote to All:

äÁ, ÜÔÏ ÔÁË. ðÒÏÓÔÏ ×ÏÓÓÔÁÎÁ×ÌÉ×ÁÌ ÁÌÇÏÒÉÔÍ ÐÏ ÁÓÓÅÍÂÌÅÒÎÏÍÕ ÉÓÈÏÄÎÉËÕ, ÐÏÜÔÏÍÕ ÎÅÐÒÁ×ÉÌØÎÏ ÐÏÓÍÏÔÒÅÌ ÕÓÌÏ×ÉÅ.

HÁ×ÅÒÎÏÅ ÅÓÔØ. ÷ÏÏÂÝÅ ÜÔÏ ÍÏÄÉÆÉËÁÃÉÑ ÁÌÇÏÒÔÉÍÁ ÄÌÑ ÐÒÏÃÅÓÓÏÒÏ× ÂÅÚ ËÏÍÁÎÄÙ Ä×ÏÉÞÎÏ ÄÅÓÑÔÉÞÎÏÊ ËÏÒÒÅËÃÉÉ. ðÏÜÔÏÍÕ, ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ ÎÅ ÕÞÉÔÙÔ×ÁÔØ ÆÌÁÇÉ ÐÅÒÅÎÏÓÁ É ÄÅÓÑÔÉÞÎÏÇÏ ÐÅÒÅÎÏÓÁ ÓÎÁÞÁÌÁ ×ÙÐÏÌÎÑÅÔÓÑ ËÏÒÒÅËÃÉÑ, ÐÏÔÏÍ ÓÄ×ÉÇ. þÉÓÔÏ ÁÌÇÏÒÉÔÍÉÞÅÓËÉ ÎÕÖÎÏ ÓÎÁÞÁÌÁ ÄÅÌÁÔØ ÓÄ×ÉÇ (ÏÂÙÞÎÏ ÓÌÏÖÅÎÉÅÍ ËÁÖÄÏÇÏ ÂÁÊÔÁ ÒÅÚÕÌØÔÁÔÁ Ó ÓÁÍÉÍ ÓÏÂÏÊ), Á ÚÁÔÅÍ ÕÖÅ ×ÙÚÏ× ËÏÍÁÎÄÙ ÄÅÓÑÔÉÞÎÏÊ ËÏÒÒÅËÃÉÉ ËÁÖÄÏÇÏ ÂÁÊÔÁ ÒÅÚÕÌØÔÁÔÁ.

ô.Å. ÎÁ PIC18 ÜÔÏ ×ÙÒÏÖÄÁÅÔÓÑ × ÔÁËÕÀ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ:

rlcf src0,F rlcf src1,F rlcf src2,F rlcf src3,F

movf AARGB0,W addwfc AARGB0,F daw AARGB0,F movf AARGB1,W addwfc AARGB1,F daw AARGB1,F

É Ô.Ä. ×ÏÔ ÔÏÌØËÏ daw ÎÁ pic18 ÎÅ ÒÁÂÏÔÁÅÔ ËÏÒÒÅËÔÎÏ, ÐÏÓÅÍÕ ÐÒÉÈÏÄÉÔÓÑ ×ÍÅÓÔÏ 3-È ËÏÍÁÎÄ ÐÉÓÁÔØ 8.

UA> é ÓÕÝÅÓÔ×ÕÅÔ ÌÉ ÞÔÏ-ÔÏ ÐÏÄÏÂÎÏÅ ÄÌÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÄÒÏÂÎÏÊ ÞÁÓÔÉ UA> ÞÉÓÌÁ (ÂÉÔÏ× ÐÏÓÌÅ ÚÁÐÑÔÏÊ)?

HÅ ÚÎÁÀ. ïÂÙÞÎÏ ÓÎÁÞÁÌÁ ÕÍÎÏÖÁÀÔ ÎÁ 10^n, ÇÄÅ n-ÞÉÓÌÏ ÚÎÁËÏ× ÐÏÓÌÅ ÚÁÐÑÔÏÊ, ÐÒÉ×ÏÄÑÔ Ë ÃÅÌÏÍÕ, ÚÁÔÅÍ ÐÒÅÏÂÒÁÚÏ×Ù×ÁÀÔ.

UA> ðÏÐÒÏÂÏ×ÁÌ ÄÌÑ 32-È ÒÁÚÒÑÄÏ×. UA> ðÏÌÕÞÉÌÓÑ ÔÁËÏÊ ÔÅÓÔÉË:

ëÒÁÓÉ×Ï, ÐÒÁ×ÄÁ ÎÁ ÍÏÊ ×ÚÇÌÑÄ ÜÔÏÔ ÁÌÇÏÒÉÔÍ ÇÏÒÁÚÄÏ ÜÆÆÅËÔÉ×ÎÅÅ ÄÏÌÖÅÎ ÒÁÂÏÔÁÔØ × ÁÓÓÅÍÂÌÅÒÎÏÊ ÒÅÁÌÉÚÁÃÉÉ.

WBR, AVB

ðÒÉ×ÅÔÓÔ×ÕÀ ÔÅÂÑ, Alexey ópÄ HÏÑ 03 2004 22:40, Alexey V Bugrov ÏÔÐÉÓÁÌ Ë Unrau Alexander:

-=[ÐÏÓËÉÐÁÎÏ]=-

AB> HÁ×ÅÒÎÏÅ ÅÓÔØ. ÷ÏÏÂÝÅ ÜÔÏ ÍÏÄÉÆÉËÁÃÉÑ ÁÌÇÏÒÔÉÍÁ ÄÌÑ ÐÒÏÃÅÓÓÏÒÏ× ÂÅÚ AB> ËÏÍÁÎÄÙ Ä×ÏÉÞÎÏ ÄÅÓÑÔÉÞÎÏÊ ËÏÒÒÅËÃÉÉ. ðÏÜÔÏÍÕ, ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ ÎÅ AB> ÕÞÉÔÙÔ×ÁÔØ ÆÌÁÇÉ ÐÅÒÅÎÏÓÁ É ÄÅÓÑÔÉÞÎÏÇÏ ÐÅÒÅÎÏÓÁ ÓÎÁÞÁÌÁ ×ÙÐÏÌÎÑÅÔÓÑ AB> ËÏÒÒÅËÃÉÑ, ÐÏÔÏÍ ÓÄ×ÉÇ. á ËÁË ÂÕÄÅÔ ×ÙÇÌÑÄÅÔØ ÉÓÈÏÄÎÙÊ ÁÌÇÏÒÉÔÍ? ó ÜÔÉÍ ÒÁÚÏÂÒÁÌÓÑ, ÓÐÁÓÉÂÏ ×ÓÅÍ. æÌÁÇ ÐÏÌÕÐÅÒÅÎÏÓÁ ÉÍÅÅÔÓÑ, ÎÏ, imho, ÏÎ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÓÌÏÖÅÎÉÉ BCD ÞÉÓÅÌ.

AB> þÉÓÔÏ ÁÌÇÏÒÉÔÍÉÞÅÓËÉ ÎÕÖÎÏ ÓÎÁÞÁÌÁ ÄÅÌÁÔØ AB> ÓÄ×ÉÇ (ÏÂÙÞÎÏ ÓÌÏÖÅÎÉÅÍ ËÁÖÄÏÇÏ ÂÁÊÔÁ ÒÅÚÕÌØÔÁÔÁ Ó ÓÁÍÉÍ ÓÏÂÏÊ), Á AB> ÚÁÔÅÍ ÕÖÅ ×ÙÚÏ× ËÏÍÁÎÄÙ ÄÅÓÑÔÉÞÎÏÊ ËÏÒÒÅËÃÉÉ ËÁÖÄÏÇÏ ÂÁÊÔÁ ÒÅÚÕÌØÔÁÔÁ.

AB> ô.Å. ÎÁ PIC18 ÜÔÏ ×ÙÒÏÖÄÁÅÔÓÑ × ÔÁËÕÀ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ:

-=[ÐÏÓËÉÐÁÎÏ]=- AB> ëÒÁÓÉ×Ï, ÐÒÁ×ÄÁ ÎÁ ÍÏÊ ×ÚÇÌÑÄ ÜÔÏÔ ÁÌÇÏÒÉÔÍ ÇÏÒÁÚÄÏ ÜÆÆÅËÔÉ×ÎÅÅ AB> ÄÏÌÖÅÎ ÒÁÂÏÔÁÔØ × ÁÓÓÅÍÂÌÅÒÎÏÊ ÒÅÁÌÉÚÁÃÉÉ. åÓÔÅÔÓÓÔ×ÅÎÎÏ. HÅ × ÔÏÐÉË, ÎÏ... óÐÅËÔÒÕÍ Ó 48 Ë ÉÇÒÁÌ × ÛÁÈÍÁÔÙ ÐÏ ÓÉÌÅ ÐÒÉÍÅÒÎÏ ÔÁË ÖÅ, ËÁË ËÁË 286 Ó 640 ËÂ. ðÏÔÏÍÕ ÞÔÏ ËÏÄ "×ÙÌÉÚÙ×ÁÌÉ". á ÓÅÊÞÁÓ embedded ÉÄÅÔ ÐÏ ÐÕÔÉ IBM-PC ÓÅÍÅÊÓÔ×Á - ÚÁÞÅÍ ÄÕÍÁÔØ, ÅÓÌÉ ÍÏÖÎÏ ËÒÉÓÔÁÌÌ ÐÏÂÏÌÅ ÐÏÓÔÁ×ÉÔØ? åÓÌÉ ÞÔÏ - × ÎÅÔÍÅÊÌ.

Bye-bye!

ÜÔÏ ÔÏ ÐÏÎÑÔÎÏ, Ñ ÐÒÏÓÔÏ ÄÕÍÁÌ ÍÏÖÅÔ ËÁË ÅÓÔØ ÂÅÚ ÕÍÎÏÖÅÎÉÑ.
ñ ÐÉÓÁÌ ÔÅÓÔÉË ÄÁÂÙ ÐÒÏ×ÅÒÉÔØ ÁÌÇÏÒÉÔÍ É ÐÏÎÑÔØ ËÁË ÏÎ ÐÁÛÅÔ. HÕ Á ÅÇÏ ÏÐÔÉÍÁÌØÎÁÑ ÒÅÁÌÉÚÁÃÉÑ × ËÁÖÄÏÍ ËÏÎËÒÅÔÎÏÍ ÓÌÕÞÁÅ ÍÏÖÅÔ ÂÙÔØ ÒÁÚÎÁÑ. HÁ ÎÅËÏÔÏÒÙÈ ÐÌÁÔÆÏÒÍÁÈ É 10 ÒÁÚ ÐÏÄÅÌÉÔØ ÎÁ 10 ÂÏÌÅÅ Ẹ̈×Á ÞÅÍ ÜÔÏÔ ÁÌÇÏÒÉÔÍ.

Hello, Unrau Alexander !

á ÐÏ-ÍÏÅÍÕ, ÅÄÉÎÓÔ×ÅÙÊ ËÒÉÔÅÒÉÊ ÏÐÔÉÍÉÚÁÃÉÉ ÔÁËÏÇÏ ÁÌÇÏÒÉÔÍÁ - ÐÏ ÒÁÚÍÅÒÕ. ðÒÉ×ÏÄÉÔØ × ÄÅÓÑÔÉÞÎÙÊ ×ÉÄ ÎÕÖÎÏ ÔÏÌØËÏ ÄÌÑ ÉÎÄÉËÁÃÉÉ, Á ËÕÄÁ ÔÕÔ ÔÏÒÏÐÉÔØÑ?

ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.

óÌÕÞÁÉ ×ÓÑËÉÅ ÂÙ×ÁÀÔ, ÎÁÐÒÉÍÅÒ ÏÞÅÎØ ÍÎÏÇÉÅ ÐÒÏÇÒÁÍÍÅÒÙ ÌÀÂÑÔ ÇÅÎÅÒÉÔØ ÔÅËÓÔÏ×ÙÅ ÐÒÏÔÏËÏÌÙ ÐÒÅÒÅÄÁÞÉ ÄÁÎÎÙÈ/ÏÂÍÅÎÁ ÄÁÎÎÙÍÉ. á ÓËÏÒÏÓÔÉ ÔÕÔ ÍÏÇÕÔ ÂÙÔØ ÎÅÓÏÉÚÍÅÒÉÍÏ ×ÙÛÅ ÞÅÍ ÓËÏÒÏÓÔØ ×ÏÓÐÒÉÑÔÉÑ ÞÅÌÏ×ÅËÏÍ. äÁ É ÅÓÌÉ ÅÓÔØ ×ÏÚÍÏÖÎÏÓÔØ ÓÄÅÌÁÔØ ÏÐÔÉÍÁÌØÎÅÊ, ÐÒÉÔÏÍ × ÒÑÄÅ ÓÌÕÞÁÅ× ËÁË ÐÏ ÓËÏÒÏÓÔÉ ÔÁË É ÐÏ ÒÁÚÍÅÒÕ ËÏÄÁ, ÔÏ ÐÏÞÅÍÕ ÎÅÔ ÔÏ? åÓÌÉ ÐÅÒÅÂÒÁÔØ ×ÏÚÍÏÖÎÙÅ ËÏÍÂÉÎÁÃÉÉ 8/16/32... ÒÁÚÒÑÄÎÙÈ ÐÌÁÔÆÏÒÍ É ÎÅÏÂÈÏÄÉÍÙÊ ÒÁÚÍÅÒ ×ÈÏÄÎÏÇÏ ÚÎÁÞÅÎÉÑ bin2bcd, ÔÏ Ñ ÄÕÍÁÀ ÍÙ ÐÏÌÕÞÉÍ ÞÔÏ × ÏÄÎÉÈ ÓÌÕÞÁÑÈ ×ÙÇÏÄÅÎ ÁÌÇÏÒÉÔÍ ÓÏ ÓÄ×ÉÇÏÍ, × ÄÒÉÇÉÈ ÁÄÇÏÒÉÔÍ Ó ÄÅÌÅÎÉÅÍ ÎÁ 10, ÐÒÉÔÏÍ ÄÅÌÅÎÉÅ ÔÏÖÅ ×ÏÚÍÏÖÎÏ ÒÅÁÌÉÚÏ×ÁÔØ ËÁË ÍÉÎÉÍÕÍ 3-ÍÑ ÓÐÏÓÏÂÁÍÉ.

Hello, Unrau Alexander !

HÅ ÄÕÍÁÀ, ÞÔÏ É ÜÔÏ ÕÄÁÞÎÏÅ ÒÅÛÅÎÉÅ É ÄÁÖÅ ÔÁË, ÚÁÞÅÍ ÇÏÎÑÔØ × ÄÅÓÑÔÉÞÎÏÍ ÆÏÒÍÁÔÅ? ïÎ ÕÄÏÂÅÎ ÔÏÌØËÏ ÞÅÌÏ×ÅËÕ.

åÓÌÉ ÐÏÌÕÞÁÅÔÓÑ É-É, ÔÏÇÄÁ ÄÁ, Á ×ÏÔ ÅÓÌÉ ÔÏÌØËÏ ÐÏ ÓËÏÒÏÓÔÉ, ÔÏÇÄÁ ÓÍ. ×ÙÛÅ.

ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.

Hi Dima, hope you are having a nice day!

04 HÏÑ 04, Dima Orlov wrote to Unrau Alexander:

DO> HÅ ÄÕÍÁÀ, ÞÔÏ É ÜÔÏ ÕÄÁÞÎÏÅ ÒÅÛÅÎÉÅ É ÄÁÖÅ ÔÁË, ÚÁÞÅÍ ÇÏÎÑÔØ × DO> ÄÅÓÑÔÉÞÎÏÍ ÆÏÒÍÁÔÅ? ïÎ ÕÄÏÂÅÎ ÔÏÌØËÏ ÞÅÌÏ×ÅËÕ.

÷ ÒÑÄÅ ÐÒÏÔÏËÏÌÏ× ÜÔÏ ÕÖÅ ÉÓÔÏÒÉÞÅÓËÉ ÓÌÏÖÉÌÏÓØ. ðÏ×ÅÒÈ TCP/IP, ÎÁÐÒÉÍÅÒ, ÍÎÏÇÏ ÞÔÏ ÂÅÇÁÅÔ × ÔÅËÓÔÏ×ÏÍ ÆÏÒÍÁÔÅ.

WBR, AVB

Hello, Alexey V Bugrov !

ëÏÇÄÁ ÒÅÞØ ÉÄÅÔ Ï ÐÏÄÏÂÎÙÈ ÐÒÏÔÏËÏÌÁÈ, ÞÔÏ ÂÅÇÁÀÔ ÐÏ ip, ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ sprintf É ÎÅ ÍÏÒÏÞÉÔØ ÓÅÂÅ É ÄÒÕÇÉÍ ÇÏÌÏ×Õ... ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.

Thu Nov 04 2004 18:42, Dima Orlov wrote to Unrau Alexander:

ôÅËÓÔÏ×ÙÊ ÐÒÏÔÏËÏÌ - ÜÔÏ ÐÒÁ×ÉÌØÎÏ.

  1. ôÅËÓÔÏ×ÏÓÔØ ÐÒÏÔÏËÏÌÁ ÕÄÏÂÎÁ ÄÌÑ ÏÔÌÁÄËÉ.

  1. äÏÓÔÁÔÏÞÎÏ ÔÅÒÍÉÎÁÌËÉ, ËÏÔÏÒÁÑ ÅÓÔØ ×ÓÅÇÄÁ É ×ÅÚÄÅ.
  2. 8-ÂÉÔÎÏÓÔØ ÍÏÖÅÔ ÐÒÉ×ÏÄÉÔØ Ë ÐÒÏÂÌÅÍÁÍ. 7-ÂÉÔÎÏÓÔØ ÂÏÌÅÅ ÓÏ×ÍÅÓÔÉÍÁ.

DO> É ÄÁÖÅ ÔÁË, ÚÁÞÅÍ ÇÏÎÑÔØ × ÄÅÓÑÔÉÞÎÏÍ DO> ÆÏÒÍÁÔÅ?

åÓÔÅÓÔ×ÅÎÎÏ, hex.

VLV

"âÙÔØ ÞÅÓÔÎÙÍ - ÌÕÞÛÉÊ ÓÐÏÓÏ ÏÓÔÁ×ÁÔØÓÑ ÂÅÄÎÙÍ" (c) HÁÐÏÌÅÏÎ âÏÎÁÐÁÒÔ

Hi Dima, hope you are having a nice day!

04 HÏÑ 04, Dima Orlov wrote to Alexey V Bugrov:

HÅ ÎÁÄÏ ÏÂÏÂÝÁÔØ, ÓÌÕÞÁÉ ÂÙ×ÁÀÔ ÒÁÚÎÙÅ. é ÔÁÝÉÔØ × midrange ÍÉËÒÏËÏÎÔÒÏÌÌÅÒ _ÅÝÅ É_ sprintf ÎÅ ×ÓÅÇÄÁ ÃÅÌÅÓÏÏÂÒÁÚÎÏ. é ÕÖ ÔÅÍ ÂÏÌÅÅ ÂÙÓÔÒÏÄÅÊÓÔ×ÉÑ ÏÎÁ ÎÅ ÐÒÉÂÁ×ÉÔ. üÔÏ ËÁË ÆÁËÔ.

WBR, AVB

Hello, Vladimir Vassilevsky !

åÓÌÉ ÅÇÏ ÎÁÄÏ ×ÓÅ ×ÒÅÍÑ ÏÔÌÁÖÉ×ÁÔØ...

åÓÌÉ ÐÒÏÔÏËÏÌ ÖÉ×ÅÔ ÐÏ×ÅÒÈ UART...

ó ÞÅÍ?

äÌÑ ËÏÔÏÒÏÇÏ subj ÎÅ ÎÕÖÅÎ... ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.

Hello, Dima! You wrote to Vladimir Vassilevsky on Fri, 05 Nov 2004 10:48:00 +0300:

éÌÉ ÔÅÌÎÅÔÁ. õ ÍÅÎÑ ÓÅÊÞÁÓ ÎÁÂÌÀÄÁÅÔÓÑ ÉÍÅÎÎÏ ÔÁËÏÊ ÓÌÕÞÁÊ. äÅ×ÁÊÓ ÏÂÝÁÅÔÓÑ ÐÏ ÓÅÔËÅ ÉÓËÌÀÞÉÔÅÌØÎÏ × ÔÅËÓÔÏ×ÏÍ ÆÏÒÍÁÔÅ - ÉÚ×ÏÌØÔÅ Ë ÎÅÍÕ ÇÕÀ É ×ÓÑËÉÅ ÛÁÔÄÁÕÎÙ-ÒÅÇÉÓÔÒÉ ÐÒÉÄÅÌÁÔØ... ðÏ×ÂÙ×Á×-ÂÙ.

Alexander,Derazhne@adic,kiev,ua (replace commas with dots) Alexander Derazhne

Hello, Alexander Derazhne !

ëÌÉÅÎÔ ÄÌÑ ÔÅÌÎÅÔÁ ×ÓÅ ÖÅ ËÌÉÅÎÔ ÄÌÑ ÔÅÌÎÅÔÁ, Á ÎÅ ÔÅÒÍÉÎÁÌ (ÈÏÔÑ ÎÅ ÒÅÄËÏ ÉÈ × ÏÄÎÏÊ ÐÒÏÇÒÁÍÍÅ ÓÏ×ÍÅÝÁÀÔ). HÏ Ñ ÕÖÅ ÇÏ×ÏÒÉÌ, ÞÔÏ ÄÌÑ ÓÉÓÔÅÍ, ÇÄÅ ip, tenet etc. subj ÒÁÚÕÍÎÅÅ ×ÓÅÇÏ ÄÅÌÁÔØ ÐÒÉ ÐÏÍÏÝÉ ÆÕÎËÃÉÉ sprintf.

ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.

åÓÌÉ ÏÂÍÅÎ ÄÁÎÎÙÍÉ × ÐÒÅÄÅÌÁÈ ÏÄÎÏÊ Ô×ÏÅÊ ÖÅ ÐÒÏÇÒÁÍÍÙ -- ÔÏÇÄÁ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÎÅÚÁÞÅÍ.

Hello, Alexey V Bugrov !

åÓÌÉ ÎÁ ÎÅÇÏ ÕÖÅ ÎÁ×ÅÓÉÌÉ ÔÅËÓÔÏ×ÙÅ ÐÒÏÔÏËÏÌÙ Ó ÄÅÓÑÔÉÞÎÙÍÉ ÞÉÓÌÁÍÉ ÐÏ×ÅÒÈ tcp/ip, sprintf ÕÖÅ ÎÉÞÅÇÏ ÎÅ ÐÒÉÂÁ×ÉÔ É ÎÅ ÕÂÁ×ÉÔ, ÎÏ ÂÕÄÅÔ ÐÒÉ×ÙÞÎÅÅ É ÐÒÏÝÅ ÞÉÔÁÔØ.

ó Õ×ÁÖÅÎÉÅÍ, äÉÍÁ ïÒÌÏ×.

Wed, 03 Nov 2004 20:25:34 +0300 Unrau Alexander wrote to All:

UA> Блин! И ведь пашет. UA> А название у этого алгоритма есть? UA> И существует ли что-то подобное для преобразования дробной части числа UA> (битов после запятой)?

Может кому-то пригодится. Как-то попались две мессаги на эту тему, я их затарил. А позже они очень пригодились, когда пришлось реализовывать подобное на MSP430 - помогли быстро разобраться с алгоритмом. Мессаги следующие:

Первая.

=========Beginning of the citation============== From: "Alexander Volkov" snipped-for-privacy@p55.f.n5051.z2.fidonet.org>

Subject: Re: BinBcd Date: 18 февраля 2002 г. 13:10

Привет, Mihail! MP> Подскажите алгоритм сабжа для 16 разрядного числ. MP> Hужно реализовать на 8051. Алгоритм простой: сначала определяется цифра десятков тысяч вычитанием 10000 из исходного числа, затем цифра тысяч последовательным вычитанием 1000, затем цифры сотен, десятков. Остаток дает цифру единиц. Алгоритм менее простой:десятичный эквивалент числа Х можно получить, сдвигая двоичное число влево и подавая выдвигаемые двоичные цифры в младший разряд десятичного регистра. Одновременно со сдвигом двоичного регистра необходимо удваивать содержимое десятичного регистра. Метод основан на представлении числа в виде полинома Горнера: Х=Xn-1*2^(n-1)+Xn-2*2^(n-2)+...+X1*2+X0 - это дв.представление X=(...(Xn-1*2+Xn-2)*2+...+X1)*2+X0 - это по Горнеру

PS: А исходник у меня есть в кодах К580ИК80(это не одно и тоже с 8051 ?)

С наилучшими пожеланиями. Alexander. =========The end of the citation================

Вторая.

=========Beginning of the citation============== From: "Alexander Volkov" snipped-for-privacy@p55.f.n5051.z2.fidonet.org>

Subject: Re: BinBcd Date: 20 февраля 2002 г. 1:16

Привет, Roman!

RS> сдвигая

RS> необходимо

RS> числа RS> непонятно. точнее то, что тут написано никак не является сабжем. Абисняю на примере. Имеем дв.код 1111 , т.е. 15 1) выдвигаем влево 1-ю ед. из дв.рг 2) удваиваем сод. дес.рг (0*2=0000_0000) не забываем, что удвоение - десятичное, т.е. с коррекцией 3) вдвигаем выдв.1 в дес.рг(0000_0001) 4) шаг 1 5) шаг 2 (1*2=0000_0010) 6) шаг 3 (0000_0011) 7) шаг 1 8) шаг 2 (3*2=0000_0110) 9) шаг 3 (0000_0111) 10) шаг 1 11) шаг 2 Внимание! Самое интересное: в данном случае удвоение происходит так: т.к. исх.число >= 5 , то вводим коррекцию +3 получаем 0000_1010, удваиваем ЭТО число (0001_0100) 12)шаг 3 (0001_0101) Это что? Вроде бы дв/дес. 15. Hе так ли ?

С наилучшими пожеланиями. Alexander. =========The end of the citation================

На основе этого код для MSP430 (для IAR'овского ассемблера) выглядит так:

****************************************************** module bin2BCD

public bin2BCD16

; r11 - bit counter

; r12 - input binary number ; r13 - result (low: 4 digits) ; r14 - addr ; r15 - result (high: 1 digit)

rseg CODE(1)

;---------------------------------------------------- bin2BCD16: push r11 push r10

mov.w #16,r11 ; bit count clr r13 clr r15

;----------------------------------- ; ; собственно преобразование ; convert: clr r10 rla r12 rlc r10

dadd.w r13,r13 dadd.w r15,r15 dadd.w r10,r13 dadd.w #0,r15

dec r11 jne convert ;-----------------------------------

; ; дальше просто распаковка десячисных цифр каждую в отдельный байт, ; к самому алгоритму отношения не имеет. ; ;

unpack: call #extract_byte swpb r13 call #extract_byte mov.w r15,r12 call #store_byte

pop r10 pop r11 ret ;----------------------------------- extract_byte: mov.w r13,r12 call #store_byte mov.w r13,r12 call #get_high_nibble call #store_byte ret ;----------------------------------- store_byte: bic.w #0xfff0,r12 mov.b r12,0(r14) inc r14 ret ;----------------------------------- get_high_nibble: rlc.b r12 rlc.b r12 rlc.b r12 rlc.b r12 rlc.b r12 ret ;------------------------------------------------------------

end

******************************************************

Сама реализация алгоритма очень короткая и эффективная благодаря наличию арифметических команд с десятичной коррекцией (то самое прибавление по условию).

Потом, правда, нашел похожую реализацию в одной из аппликух, но не жалею о проделанной работе, было интересно разобраться. :)

Для AVR есть у Atmel подобная функция, написанная на асме. Адаптированная под IAR она выглядит так:

Сишный прототип: void bin2BCD16(word num, byte* Buf);

****************************************************** module Num_2_BCD_Module

public bin2BCD16

rseg CODE:CODE:NOROOT(1)

;--------------------------------------------------------------------------- ;* ;* "bin2BCD16" - 16-bit Binary to BCD conversion ;* ;* This subroutine converts a 16-bit number (fbinH:fbinL) to a 5-digit ;* packed BCD number represented by 3 bytes (tBCD2:tBCD1:tBCD0). ;* MSD of the 5-digit number is placed in the lowermost nibble of tBCD2. ;* ;* Number of words :25 ;* Number of cycles :751/768 (Min/Max) ;* Low registers used :3 (tBCD0,tBCD1,tBCD2) ;* High registers used :4(fbinL,fbinH,cnt16a,tmp16a) ;* Pointers used :Z ;* ;---------------------------------------------------------------------------

;***** Subroutine Register Variables #define zl r30 #define zh r31

#define AtBCD0 0 // address of tBCD0 #define AtBCD2 1 // address of tBCD2

#define tBCD0 r0 // BCD value digits 1 and 0 #define tBCD1 r1 // BCD value digits 3 and 2 #define tBCD2 r2 // BCD value digit 4 #define fbinL r16 // binary value Low byte #define fbinH r17 // binary value High byte #define cnt16a r20 // loop counter #define tmp16a r21 // temporary value

#define rtmp tmp16a #define BCD_AddrLow r18 #define BCD_AddrHigh r19

bin2BCD16: ldi cnt16a,16 ;Init loop counter clr tBCD2 ;clear result (3 bytes) clr tBCD1 clr tBCD0 clr zh ;clear ZH (not needed for AT90Sxx0x)

bBCDx_1: lsl fbinL ;shift input value rol fbinH ;through all bytes rol tBCD0 ; rol tBCD1 rol tBCD2 dec cnt16a ;decrement loop counter brne bBCDx_2 ;if counter not zero

;fill array and ... mov zl,BCD_AddrLow mov zh,BCD_AddrHigh mov rtmp,tBCD0 andi rtmp,0x0f st z+,rtmp ;BCD[0] = value0 (LSD) swap tBCD0 mov rtmp,tBCD0 andi rtmp,0x0f st z+,rtmp ;BCD[1] = value1 mov rtmp,tBCD1 andi rtmp,0x0f st z+,rtmp swap tBCD1 ;BCD[2] = value2 mov rtmp,tBCD1 andi rtmp,0x0f st z+,rtmp ;BCD[3] = value3 st z,tBCD2 ;BCD[4] = value4 (MSD) ret ; ... return

bBCDx_2: ldi r30,AtBCD2+1 ;Z points to result MSB + 1

bBCDx_3: ld tmp16a,-z ;get (Z) with pre-decrement subi tmp16a,-$03 ;add 0x03 sbrc tmp16a,3 ;if bit 3 not clear st z,tmp16a ; store back ld tmp16a,z ;get (Z) subi tmp16a,-$30 ;add 0x30 sbrc tmp16a,7 ;if bit 7 not clear st z,tmp16a ; store back cpi zl,AtBCD0 ;done all three? brne bBCDx_3 ;loop again if not rjmp bBCDx_1

end

Это, кстати, обсосано в соответствующей аппликухе. Только там принцип не объяснен (afair), а только последовательность действий.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required