Sida 1 av 1

Makrofråga, MPASM

Postat: 29 oktober 2008, 21:05:53
av AndersG
Följande makro bryter ut oktetter ur ett 32-bitars tal:

Kod: Markera allt

;**********************************************************************
; Helper macro for 32-bit numbers. Puts byte number 'byte' of a 32-bit literal 'var'
; into register 'reg'
;
movbyte	macro   reg,var,byte
		movlw   (var >>(D'08' * byte) & H'FF')
		movwf	reg
        endm
Det funkar bra så länge jag har "var" som ett tal, men om jag har ett uttryck som:

#define AFACTOR ((.4096 * .1000)/(GVFC * RSENSE * .3600))

Då ballar det ur

Kod: Markera allt

                      00799 
                      00800         MOVBYTE REGB0,AFACTOR,0 
Error[112]  : Missing operator
0138   3000               M                 MOVLW   (((.4096 * .1000)/(.22.2 * .0.01 * .3600)) >>(D'08' * 0) & H'FF')
0139   00??               M                 MOVWF   REGB0
Någon som kan hjälpa mig genom att berätta vad jag gör för fel?

Postat: 29 oktober 2008, 21:36:11
av bearing
Förmodligen går det inte att använda flyttal. Makrot funkar om * 22.2 byts ut till * 111/5, och * 0.01 mot /100.

Det kanske finns något kommando som trunkerar?

EDIT: Det enklaste är väl att skala om konstanterna så att inga decimaler behövs.

Postat: 30 oktober 2008, 09:48:15
av AndersG
Tydligen ej, måste väl göra det manuellt.

Postat: 30 oktober 2008, 16:22:01
av bearing
Om resistansen anges i mΩ istället för Ω, samt om även GVFC skalas om med faktorn tusen blir det såhär:

Kod: Markera allt

		movbyte	REGB+0,((.4096 * .1000000000)/(.22200 * .10 * .3600)) ,0
		movbyte	REGB+1,((.4096 * .1000000000)/(.22200 * .10 * .3600)) ,1
		movbyte	REGB+2,((.4096 * .1000000000)/(.22200 * .10 * .3600)) ,2
		movbyte	REGB+3,((.4096 * .1000000000)/(.22200 * .10 * .3600)) ,3

Postat: 30 oktober 2008, 16:31:21
av AndersG
Det är ju en tanke. Ett annat tips jag fick är använda PREPIC (http://www.embedinc.com/pic/dload.htm).