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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

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

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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"...)
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg 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)
Skriv svar