nonkel_dw
nonkel dw
maar later word doe potensiometer vervangen door een waarde die va uart binnenkomt en dit is een 8 bit waarde.
Dus zo simpel is het nog niet 
Nog eens even voor de zekerheid (ik ben niet zeker meer)
als er in w 180 staat en je telt daar 200 bij op den heb je 380 wat staat er dan in het W register ? 124?
[Bericht gewijzigd door nonkel_dw op (36%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
als er in w 180 staat en je telt daar 200 bij op den heb je 380 wat staat er dan in het W register ? 124?
Ja, dat klopt. Bij > 255 vindt er gewoon een roll-over plaats. (255 -> 0 -> 1 -> 2, enz...)
Hey ik weet niet of je er wat aan hebt maar hier word een beetje uitgelegd over vermenigvuldigen in asm.
Daan Timmer
Ik ben programmeur! geen electronicus! http://www.daantimmer.nl/ Er is een ontwerp! nu nog inhoud :-)
Of je kan gebruik maken van een lookuptable.
Dit kost dan wel 256512bytes geheugen, maar het scheelt heel wat rekenwerk 
A/D result
0 0
1 8
2 16
3 24
4 31
---snip---
30 235
31 243
32 251
33 259
34 267
---snip---
98 769
99 776
100 784
101 792
102 800
---snip---
251 1969
252 1976
253 1984
254 1992
255 2000
Waarbij ik dit in excel heb gebruikt om deze tabel te maken:
=AFRONDEN((2000/255) * A257;0)
(ja ik weet het, nederlandse office..... blame my ex girlfriend)
nonkel_dw
nonkel dw
hoi,
Nu ik deze avond wat tijd heb, ben ik begonnen aan het berekenen van men 16 Bit waarde.
Maar ik loop tegen een probleem aan...
Ik dacht de opzet zo te maken:
aantal pulsen: totaal van de pulsen in Voorbeeld 2000
totaal: de uitkomst van de vermenigvuldiging
Waarde: waarde van de byte
Lus:
aantal pulsen tel op in totaal
zet weg in totaal
trek 1 af van waarde
waarde niet gelijk aan 0
terug naar lus
wel gelijk aan 0 verdoen met programma ...
Het probleem dat ik heb is het volgende:
Laten we er van uitgaan dat er in aantalpulsenH 10 staat en in aantalpulsenL 200 staat.
als ik nu de lus maak
dan zou er in aantalpulsenH 20 staan
en in aantalpulsenL 400 dus daar loopt het mis...
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik begrijp eerlijk gezegd hiet hoe je van 10:200 na de loop op 20:400 zou kunnen komen.
Maar los daarvan is 2000 in 16 bit geen 10:200, maar 7:208 (0x07D0 hex)
nonkel_dw
nonkel dw
Ik zou gewoon op en of andere manier
de aantal pulsen x de waarde moeten kunnen uitrekenen.
en dit dan delen door 255
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
nonkel_dw
nonkel dw
Voor 8 bit heb ik net wat geschreven.
Dit is zo al wat de opzet
LUS
MOVF AANTALPULS,W
ADDWF TOTAALL,F
BTFSC STATUS,C
INCF TOTAALH,F
DECFSZ WAARDE,F
GOTO LUS
Alleen zie ik nog niet zo direct een oplossing voor die met 16 bit te doen 
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Alleen zie ik nog niet zo direct een oplossing voor die met 16 bit te doen
Daarom zei ik ook: geebruik de math libraries van Microchip. Waarom opnieuw het wiel uitvinden?...
nonkel_dw
nonkel dw
Oke
ik heb nu dus weer de tijd gehad om van alles wat uit te testen en zo ...
Nu heb ik een code die 16x16bit doet dit werkt alleen is de uitkomst groter dan 16 bit.
Maar hier vind ik niet direct een code voor bij microchip.
Heb ik er over gekeken? Of is dit wel opnieuw het wiel uitvinden?
Nou ik heb voor mezelf eigenlijk ook het wiel opnieuw uitgevonden zoals sommigen hier beweren. Ik vind dat zelf niet erg, maar juist leerzaam. Dat is voor mij de voornaamste reden dat ik deze hobby heb.
Sommige stukken code vanuit de AN's van microchip zijn voor mij soms gewoon onleesbaar. Ik heb immers geen/amper elctronica en sofware lessen gehad op school. Dus heb zelf wat gemaakt wat ik soms domweg gewoon kan invoegen als subroutine. Misschien dat je er wat aan hebt en belang bij hebt. Alleen een stukje om te vermenigvuldigen ontbreekt nog. Daar heb ik nog geen tijd voor/zin in gehad.
Het zijn 16-16 naar 16 bit berekingen.
Groetjes,
Lampie
nonkel_dw
nonkel dw
We kan me er bij helpen?
Bij dit te ontwikkelen.
LUS
MOVF TELLERH,W
SUBWF UITH,F
BTFSC STATUS,C
INCF UITZ,F
MOVF TELLERL,W
SUBWF UITL,F
BTFSC STATUS,C
INCF UITH,F
MOVWF UITL
INCFSZ TELLER,W
GOTO LUS
zou dit kunnen werken om gewoon op te tellen?
[Bericht gewijzigd door nonkel_dw op (70%)]
nonkel_dw
nonkel dw
Na een avond proberen krijg ik nog altijd zeer rare zaken als uitkomst
Dit is een code om 24bit*24bit = 24 bit te doen
echter krijg ik deze niet juist aan de praat
MULTIPLY_24x24
;Multiplier EQU Product3
; preload values to test
MOVLW d'0'
MOVWF Multipland
MOVLW d'0'
MOVWF Multipland1
MOVLW d'2'
MOVWF Multipland2
MOVLW d'0'
MOVWF Multiplier
MOVLW d'0'
MOVWF Multiplier1
MOVLW d'20'
MOVWF Multiplier2
; these values should generate the reply = 0x6651AF33BC6C
;24 x 24 Multiplication
;Input:
; Multiplier - 3 bytes (shared with Product)
; Multiplicand - 3 bytes (not modified)
;Temporary:
; Bitcount
;Output:
; Product - 6 bytes
CLRF Product ; clear destination
CLRF Product1
CLRF Product2
MOVLW D'24'
MOVWF BitCount ; number of bits
RRF Product3,F ; shift out to carry
RRF Product4,F ; next multiplier bit
RRF Product5,F
ADD_LOOP_24x24
BTFSS STATUS,C ; if carry is set we must add multipland
; to the product
GOTO SKIP_LOOP_24x24 ; nope, skip this bit
MOVF Multipland2,W ; get LSB of multiplicand
ADDWF Product2,F ; add it to the lsb of the product
MOVF Multipland1,W ; middle byte
BTFSC STATUS,C ; check carry for overflow
INCFSZ Multipland1,W ; if carry set we add one to the source
ADDWF Product1,F ; and add it (if not zero, in
; that case mulitpland = 0xff->0x00 )
MOVF Multipland,W ; MSB byte
BTFSC STATUS,C ; check carry
INCFSZ Multipland,W
ADDWF Product,F ; handle overflow
SKIP_LOOP_24x24
RRF Product,F
RRF Product1,F
RRF Product2,F
RRF Product3,F
RRF Product4,F
RRF Product5,F
DECFSZ BitCount,F
GOTO ADD_LOOP_24x24
RETURN