Sida 1 av 1

MPASM makron för att bryta ut bitar ur 32 bitars tal?

Postat: 25 oktober 2008, 20:21:41
av AndersG
Typ HIGH/LOW. Dvs anta att man har en 32-bitars konstant och vill ha MSbyte i rega0, nästa byte i rega1 etc?

Tänkte fråga före jag skriver själv.

Postat: 25 oktober 2008, 20:38:31
av sodjan
Kolla UPPER.
Annars kan du använda vanliga shift o.s.v.
Har du något exempel ?
Kolla även "Example of a 32-Bit Delay Routine"
i MPASM help-filen...

Postat: 25 oktober 2008, 20:56:23
av AndersG
Mja tex:

Kod: Markera allt

	banksel	regd0				; Prime rega with suitable value
	clrf	regd3
	clrf	regd2
	movlw	0x35
	movwf	regd1
	movlw	0xac; 			; 0x35ac
	movwf	regd0
	;
Och vad katten är det för skillnad mellan HIGH och UPPER?

Kod: Markera allt

      movlw   (DLY-1) & H'FF'
      movwf   Dly0
      movlw   (DLY-1) >>D'08' & H'FF'
      movwf   Dly1
      movlw   (DLY-1) >>D'16' & H'FF'

Ah, jo, det var väl i de banorna jag tänkte.

Postat: 26 oktober 2008, 00:15:11
av sodjan
> Och vad katten är det för skillnad mellan HIGH och UPPER?
Low, high and upper operators are used to return one byte of a
multi-byte label value. If low is used, only bits 0 through 7 of the expression
will be used. If high is used, only bits 8 through 15 of the expression will be
used. If upper is used, only bits 16 through 21 of the expression will be used.
(Från MPLAB's help file, "Low, High and Upper Operators"...)

Postat: 26 oktober 2008, 08:46:05
av AndersG
Ahhh.. Jag var så låst i att se det som 16-bitar. Då borde man kunna skriva ett generellt makro:

Kod: Markera allt

movbyte	macro   reg,var,byte
		movlw   var >>(D'08' * byte) & H'FF'
		movwf	reg
        endm
eller så..

och sedan använda som

Kod: Markera allt

	movbyte	regd0,0x35ac,0
	movbyte	regd1,0x35ac,1
	movbyte	regd2,0x35ac,2
	movbyte	regd3,0x35ac,3
Skall testa

Edit: Finns även ett exempel i MPASM manualen på sidan 165 (DS33014J)