Zit met lastig probleempje......
Hoe filter ik de MSD (most significant digit) van een dubbel digit decimaal getal ?, vb.

34d

Ik heb alleen die 3 nodig (voor een compare)
(34d = 00100010b = 22h) Het gaat dus niet om afronden, maar filteren van de MSD. 89 zou een 8 worden. Simpeler gezegd ik moet de LSD wegfilteren ?
Lastige ;(

met een & functie?

je zoekt uit wat je max is die je wilt hebben en & het spu lmet die waarde:

voorbeeldje in bits met dec en hex erachter:



1110    13       D
0111     7       7
-------------------- &
0110     6       6

duidelijk toch? ik neem tenminste aan dat je het met een uC doet, ander moet je het uiteraard met andpoortjes doen, maar dan moet het wel eerst parallel staan, anders lukt het niet :P

dit wordt juist specifiek gebruikt om bits op 0 te zetten, dus meot voor jouw ook wel werken.

BTW ff ander vraagje ATTINY C-compiler, ik heb nu de image craft: werkt dat ding een beetje? nog nix meej geprogd 30 dagen trial (ik ken geen assambler)

[Bericht gewijzigd door High met Henk op ]

Met een nibble kan het alleen tot 15, maar ik moet tot 99.
Ik probeer een truukje uit te halen. Ik moet bij de hele getallen iets doen.

00 <- rond getal
//
09
10 <- rond getal
11
//
19
20 <- rond getal

2 digits kost een byte, het kan wel als ik elke kant een apparte nibble geeft, alleen heb ik al een teller van 0 - 99. opsplitsen in nibbles is een gedoe ;(

ATTINY C compiler ? heb er wel eens van gehoort, ik ben een ASM progger. moet je ff op AVRfreaks.net kijken of rondvragen. heb weer geen sjoege van C en die compilers.
Zit je aan je limieten met die image craft ?

paar minuten later.......

denk dat ik het al weet, juist naar LSD kijken, die komt telkens op 0.

10 = 00001010
20 = 00010100
60 = 00111100

nee heb ik ook niks aan ;(

[Bericht gewijzigd door RES op ]

ff 2 ideetjes...

1) met 'binary coded decimal' instructie

34 coderen als BCD dan krijg je als ik het goed heb twee nibbles waarin de hoogste nibble de tientallen bevat en de laagste de eenheden.

34 in BCD -> high nibble = 0011, low nibble = 0100

(34bcd AND 15d) =? 0 -> ofwel (00110100 AND 00001111) =? 0 -> nee, dit is geen rond getal

(30bcd AND 15d) =? 0 -> ofwel (00110000 AND 00001111) =? 0 -> ja, dit is een rond getal

2) met 'div' instructie

Anders met div tien en kijk je naar de rest. Als de rest = 0 dan heb je ook een rond getal. If de rest van (34 div 10) = 0 dan rond getal. Ik weet niet waar de rest geparkeerd wordt na 'div', maar het moet ergens te vinden zijn.

[Bericht gewijzigd door ikkedus op ]

Ja klopt ik moet naar BCD dus 34 wordt 3 en 4.
AVR's hebben geen BCD of div instructies ;(
Weet de manier niet wat decimaal naar BCD.

34 in BCD -> high nibble = 0011, low nibble = 0100

Hoe kom ik op die nibbles ? want nu heb ik 0010 0010, want 34d is 22h.
Het getal 34 staat nu in 1 register. Volgens mij moet het niet al te lastig zijn. Ik moet even op zoek, zal wel ergens op internet te vinden zijn.

Even later.......

Het kan veel simpeler:

stel ik zit op 34.

34 - 10 = 24 (1)
24 - 10 = 14 (2)
14 - 10 = 4 (3)
4 is lager dan 10, dus end. nu heb ik 3 keer 10 eraf getrokken.

[Bericht gewijzigd door RES op ]

avr taal ken ik niet maar jij wel dus zet dit om naar de juiste taal en je hebt bcd
leest bit 7
1 tel dan 8 bij eenheden 2 bij tientallen en 1 bij 100 tallen
lees bit 6
1 tel dan 4 bij eenheden en 6 bij tientallen
zo ga je door tot je alle bits gehad hebt
dan begin je overnieuw met de eenheden
daarna nog eens met de tientallen
en je hebt bcd in 3 registers

mischien is er een simpelere methode
maar dit werkt
[edit]
jouw methode zou idd ook moeten werken nooit aan die methode gedacht
[/edit]

Echt BCD moet ik ook nog maar eens uitproberen, maar dit truukje werkt nu perfect.
Kan ook met een andere getal.

bijv. 67

67 - 10 -> (1)
57 - 10 -> (2)
47 - 10 -> (3)
37 - 10 -> (4)
27 - 10 -> (5)
17 - 10 -> (6)
7 -> kleiner dan 10, dus end. Nu heb je 6 staan in een teller.
Ik doe dit:

ldi temp, 67
rond:
cpi temp, 10
brlo end
subi temp, 10
rjmp rond
end:
----

Nu zit in temp het getal 7. (tussen ROND loop in kan je andere dingen laten uitvoeren, gaat dus 6 keer rond)

Als je nu een ander register (temp2 ofzo) die je voor de lus op 0 hebt gezet elke keer eens verhoogd als je subi doet heb je daar het aantal 10-tallen in staan. Na de lus shift je temp2 viier keer naar links en tel je daar temp bij op. Nu heb je dus het hele getal in BCD staan! :)