# PIC mikrokontrolleri >  binārā uz decimālo

## SawLV

Sveiki,

Ja kādam nav grūti tad varat lūdzu apskaidrot kā no binārā koda 0000 0001 var iegūt 0110 0100. Cenšos izburties cauri tam visam un lai nesalaistu dēlī visu jautāju tiem kas zina. Situācija tāda ka vajag uzrakstīt PIC16F54 programmu kur viņš no decimālā pārveido uz bināro.

----------


## next

Kad drusku padomaasi sapratiisi ka tas darbojas abos virzienos:

;A simple algorithm to convert binary to BCD is:
;1. Add 3 to every BCD nibble that's >=5
;2. Shift left

;Example: Convert $F9 to BCD
;0000 0000 0000 : 1111 1001
;0000 0000 0001 : 1111 0010 (shift left)
;0000 0000 0011 : 1110 0100 (shift left)
;0000 0000 0111 : 1100 1000 (shift left)
;0000 0000 1010 : 1100 1000 (add 3)
;0000 0001 0101 : 1001 0000 (shift left)
;0000 0001 1000 : 1001 0000 (add 3)
;0000 0011 0001 : 0010 0000 (shift left)
;0000 0110 0010 : 0100 0000 (shift left)
;0000 1001 0010 : 0100 0000 (add 3)
;0001 0010 0100 : 1000 0000 (shift left)
;0010 0100 1001 : 0000 0000 (shift left)


PS. Izraadaas ka jau 10 gadi pagaajushi no briizha kad es sacereeju shito:
http://www.microchip.ru/phorum/read....033#reply_6129
 ::

----------


## JDat

0000 0001
0100 0011 +
----------
0100 0100 =

Neder?

Bet... Skaita tikai līdz 9, tālāk būs podi. Neko citu šobrīd domāt negribu.

----------


## habitbraker

0000 0001 bcd ir tachu tas pats 0000 0001  ::

----------


## SawLV

diemžēl pie 1 pieskaitīt 99 šoreiz nederēs , vajag tā lai ir programma to dara pa solim un sākums ir 1 bei beigas 100 , tākāk tiks pieskaīti desmiti un vieni. vēlos saprast kādam ir jābūt tam vidusposmam , jo vel nesaprotu kā īsti tās komandas strādā RLF, MOVWL, ADDWF. Teorētisku skaidrojumu es viņām zinu , vēlos iegūt arī piemēru :/

----------


## next

Iesaakumaa liec mieraa PIC instrukcijas.
Tev jaasaak ar binaaro aritmeetiku un binaaro skaitlju formaatiem.
Peec tam vajag izpeetiit BCD un padomaat kaapeec i8080 komandsetaa bija DAA.
Kad tiktaal tiksi vareesim atgriezties pie algoritma ko tepat augstaak ieposteeju.

----------


## karloslv

Kurš vispār pieminēja BCD? Sākotnējais jautājums bija par 'decimālo' sistēmu, lai kādā nozīmē arī tas būtu lietots - baits uz ciparu (skaitlis vai ASCII simbols) vai 4 biti uz ciparu (BCD)?

Tāpat arī autors nolaida nesaprotamu lažu ar "no binārā koda 0000 0001 var iegūt 0110 0100" - kādā veidā to var iegūt, var tikai minēt. Ko tie skaitļi reprezentē?

----------


## next

BCD iesaaku es.
Jo necik normaalu bin2dec paarveidojumu bez taa uztaisiit nevar.

----------


## SawLV

labi teikšu kā ir- tiek dots decimāls skaitlis ar trīs cipariem , tad es viņus pārveidoju katru uz bināro sistēmu kur katrs skaitlis ir savā reģistrā un tad ar programmas palīdzību viņš to skaitli saskaita un iegūst to pašu skaiti tikai jau binārajā sistēmā, piemēram, 123 

                                             R1----------R2---------R3
                                        0000 0001--0000 0010--0000 0011 
                                              kur galā jāsanāk ir    
                                        0110 0100--0001 0100--0000 0011
                                tad mēs saskaitām visus trīs reģistrus un iegūstam   0111 1011 kas arī ir tas 123

----------


## next

Vispaar jau fignja tas uzdevums, taa neko labu neiemaaciisies.
100 (dec) = 01100100 (bin)
20 (dec) = 00010100 (bin)
3 (dec) = 00000011 (bin)
Tagad saskaiti binaaros kopaa un buus kas vajadziigs.

----------


## habitbraker

AAa tad tev vajag no BCD uz binaaro?

Var lietot, piemeeram, rezinaashanu. Nezinu vai ir efektiivaakas metodes...

----------


## SawLV

to es saprotu, es nesaprotu to kā ar komandu palīdzību var nonākt pie tā 0110 0100

mans minējums par šo tēmu 
BCF 3,0 =  0000 0001
RLF R1,1 = 0000 0011
RLF R1,0 = 0000 0110
RLF R1,0 = 0000 1100
RLF R1,1 = 0001 1001
RLF R1,0 = 0011 0010
RLF R1,0 = 0110 0100

----------


## next

Davai paskatamies kautko daudzmaz reaalu.
Teiksim gribam no klaviatuuras ievadiit decimaalu skaitli un saglabaat binaaraa formaa.
Pienjemam ka skaitlis satilpst 2 baitos (diapazons 0...65535 (dec)).
Vispirms sapakojam sanjemtos ciparus BCD formaa.
Vajadzees 3 baitus un decimaalaa veertiiba 54321 izskatiisies taa: 05 43 21 (hex) vai 00000101 01000011 00100001 (bin).
Vispirms vajag parbaudiit katru BCD regjistru pusbaitu (tetradi) uz >=8.
Ja veertiiba vienaada vai lielaaka par 8 tad atnjemam no taas 3.
Taa shai gadiijumaa arii ir decimaalaa korekcija.
Peec tam veicam paarbiidi visos baitos:
RRF bcd2
RRF bcd1
RRF bcd0
RRF bin1
RRF bin0
Un taa 16 reizes peec kaartas (korigjeejam un biidam).
Rezultaataa dabuujam ievadiito skaitli (regjistos bin1 un bin0) binaaraa formaa.

PS.Jaaprecizee ka darbiibu seciiba shai paarveidojumaa protams ir preteeja, vispirms nobiide peec tam korekcija.  ::

----------


## karloslv

next, var jau būt, ka algoritms ir optimāls un foršs, bet ja es to lasītu kā iesācējs, godīgi, ne vella nesaprastu. Es tomēr lietoju kaut ko, kam pats varu izsekot līdzi:
1. uzstādām Z=0
2. nolasām kārtējo ciparu ASCII formātā, pārbaudām, ka tas ir '0'--'9', atņemam '0' un dabūjam skaitli 0-9
3. pieskaitām to pie Z
4. ja beigas, tad Z ir vēlamais skaitlis
5. ja ne, pareizinām Z ar 10 un ejam uz 2. soli

Pareizināšana ar 10 ar reģistra bīdes operācijām ir ļoti vienkārša: 2(x + 4x)

Skaitli mēs konstruējam ciparu pēc cipara, kas nozīmē, ka oriģinālais pieraksts nav jāglabā - tas ir noderīgi, piemēram, uzreiz lasot no seriālā porta. Nav nekādu BCD starpsoļu un mistisku 3 atņemšanu. Iespējams pārveidot arī no citām skaitīšanas sistēmām.

----------


## next

> next, var jau būt, ka algoritms ir optimāls un foršs, bet ja es to lasītu kā iesācējs, godīgi, ne vella nesaprastu.


 A vot taisni taapeec es jautaataaju suutiiju studeet binaaro aritmeetiku, BCD un DAA.
Citaadaak to algoritmu saprast nevar.
Tur augstaak iemetu linku uz 24bitu bin2dec paarveidojumu, cik Tavam algoritmam ciklus vajadzeetu?

----------


## karloslv

Principā katrs decimālais cipars = 1 atņemšana, 2 saskaitīšanas (ok, viena no tām 16 vai 24 bitu), 2 bīdes operācijas. Mēs taču nesacenšamies par 10 vai 100 taktīm - vai tad tie skaitļi ir jāpārveido desmitiem tūkstošu sekundē?

----------


## next

> Nav nekādu BCD starpsoļu un mistisku 3 atņemšanu.


 Par mistiskumu.
Redz kur cilveekam kas algoritmu pats nesaprata tas netrauceeja izmantot un veel citiem maaciit.
Vienkaarshiiba, universaalums un elegance piesaista:
http://www.microchip.ru/phorum/read....46#reply_68005

----------

