Binärt till BCD

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
evert2
Inlägg: 2182
Blev medlem: 18 april 2004, 22:47:56
Ort: Jönköping

Inlägg av evert2 »

Håller med dig cribbe, det enda felet med idén är att jag inte kom på den själv!
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Jag har testat för Pic18 nu och det tar 141 klockcycler att omvandla talet 0 och 126 klockcycler att omvandla talet 59999. (lustigt)
Programmet blev 139 instruktioner.

Jag ska testa att göra en komprimerad variant oxå.
Jag måste även göra en till Pic16.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Nu har jag samlat alla BIN till BCD konverterings rutiner på ett ställe (För Pic).

http://hem.bredband.net/b105170/forum/P ... _16bit.txt
Euphaz
Inlägg: 49
Blev medlem: 18 juni 2004, 23:21:07

Inlägg av Euphaz »

Bra jobbat måste jag säga! Har du sett den här, skulle kunna spara en 10-12 instruktioner:

http://www.piclist.com/techref/microchi ... b/16bb.htm
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Jag har ganska nyligen kommit underfund med att mitt gamla sätt att göra 16bit-add och 16bit-sub är fel (man får ingen korrekt carry ut)
Nu vet jag hur man ska göra, tackar!

Men du påstår att man även sparar instruktioner, det kan inte stämma.

Mitt gamla sätt (fel sätt):

Kod: Markera allt

	movf	Temp1,w
	subwf	L_byte,w
	movwf	Temp3
	movf	Temp2,w
	btfss	STATUS,C
	addlw	1
	subwf	H_byte,w
Rätt sätt:

Kod: Markera allt

	movf	Temp1,w
	subwf	L_byte,w
	movwf	Temp3
	movf	Temp2,w
	btfss	STATUS,C
	incfsz	Temp2,w
	subwf	H_byte,w
Jag kanske ska tillägga att alla BIN-BCD rutiner som jag länkade till fungerar även om jag har använt felaktiga sub:ar
Euphaz
Inlägg: 49
Blev medlem: 18 juni 2004, 23:21:07

Inlägg av Euphaz »

Jag tänkte på den här, har inte testat det dock...

Kod: Markera allt


movlw D'123'
subwf low,f
movlw D'45'
btfss STATUS,C
movlw D'46'
subwf high,f
rlf bcdreg,f
btfsc bcdreg,0
goto next
addwf high,f
movlw D'123'
addwf low,f

next


Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Det funkade fint det :tumupp:
Jag har testat med den komprimerade varianten av "din algoritm"
Programmet blev 1 instruktion kortare och 7 klockcycler snabbare.
Då är det bara att ändra på alla andra oxå.

EDIT:
Nu har jag optimerat klart.
Exempel12 blev 11 instruktioner kortare och 5 klockcycler snabbare.
Exempel14 blev 1 instruktion kortare och 7 klockcycler snabbare.
Exempel16 blev 1 instruktion kortare och 5 klockcycler snabbare.
Nu går det nog inte att pressa ut mer av den algoritmen.
Euphaz
Inlägg: 49
Blev medlem: 18 juni 2004, 23:21:07

Inlägg av Euphaz »

Tror inte jag häller.

Sista jag tänkte på var att först kopiera dom 6 högsta bit:arna till ett eget tusenregister (32, 16, 8, 4, 2, 1K) , ta bort bit:arna och addera 'resten' (768,384,192,96,48,24) till dom två startregistren för att kompensera.

På så sätt skulle det bara vara kvar maximalt 2535 i dom två registren att räkna på. Fast då måste man på något smart sätt fläta in 'tusenregisteret' i resultatet.
Skriv svar