Sida 1 av 1

indirekt adressering av bit i PIC assembler

Postat: 11 september 2010, 21:52:50
av ToPNoTCH
Problem:
Jag har en rutin som använder en pinne som utgång och ger ett pulsmönster.
Jag vill kunna använda denna rutin med en dynamiskt vald pinne.

Exempel:
Genom att sätta X till 0-4 välja port A-E
Genom att sätta Y till 0-7 välja pin 0-7

På så vis skulle man kunna nyttja rutinen genom något liknande detta.

Kod: Markera allt

movlw 0x3
movwf X
movlw 0x4
movwf Y
call rutin
Vilket skulle skicka mitt pulsmönster på port D pinne 4.

Jag kommer inte på något klurigt sätt att lösa det på.
Port kan man ju fixa med indirekt adressering men det hjälper ju inte för val av pinne.

Finns det något sätt att indirekt adressera en bit eller finns det något annat sätt att lösa problemet på ?

Re: indirekt adressering av bit i PIC assembler

Postat: 11 september 2010, 22:49:09
av AndersG
Maska med en framräknad mask?

Re: indirekt adressering av bit i PIC assembler

Postat: 11 september 2010, 23:10:40
av Swech

Kod: Markera allt

   call get_mask

get_mask
  movf   y,w
  andlw  7
  addwf  pcl,same
  retlw  0b0000001
  retlw  0b0000010
  retlw  0b0000100
  retlw  0b0001000
  retlw  0b0010000
  retlw  0b0100000
  retlw  0b1000000
med reservation för att det var 5 år sedan jag körde PIC... :D

Swech

Re: indirekt adressering av bit i PIC assembler

Postat: 12 september 2010, 08:27:04
av AndersG
Japp, något ditåt och samma system kan även användas för TRIS ifall man skall växla riktining oxå.

Re: indirekt adressering av bit i PIC assembler

Postat: 12 september 2010, 11:55:19
av ToPNoTCH
Smart.

Det funkar oxo :tumupp:

Tack skall ni ha.

Re: indirekt adressering av bit i PIC assembler

Postat: 12 september 2010, 12:41:13
av sodjan
> Det funkar oxo...

Om du menar Swech's exempel så fungerar det oftast, med lite tur.
Vill du vara säkert på att det alltid fungerar så får du göra lite mer,
främst ta hand om PCLATH innan ADD'en till PCL.

Re: indirekt adressering av bit i PIC assembler

Postat: 12 september 2010, 13:28:55
av AndersG
Dvs, se AN556

Kod: Markera allt

								; Page-safe jumptable from AN556. Checks for carry when adding offset and
								; adjusts PCLATH accordingly
	banksel	dspmode
	movf	dspmode,w			; Get display mode in W
	andlw	.7					; Make sure it is within bounds (0..7)
	movwf	rega0				; save in temp register

	movlw	LOW dsptable		; Get low address of table
	addwf	rega0,F				; add offset
	movlw	HIGH dsptable		; Get high 5 bits of address
	btfsc	status,c			; Did we cross a page?
	addlw	1					; Yes, increment high address
	movwf	pclath				; Load high address in latch
	movf	rega0,w
	
	movwf	pcl					; Load computed offset into program counter
dsptable
	goto	displaymode0 		; Jump table to display mode handlers
	goto	displaymode1

Re: indirekt adressering av bit i PIC assembler

Postat: 12 september 2010, 16:12:32
av sodjan
Notera att AN556 (i alla fall för något år sedan) har/hade en bugg
i kodexemplena som gjorde att man hamnade en rad fel i tabellen.
Jag har inte kollat om det är åtgärdat. Men beskrivningen i texten
har jag för mig stämmde/stämmer så som den är.

Re: indirekt adressering av bit i PIC assembler

Postat: 12 september 2010, 21:39:16
av Swech
Tja.. det är ju som sagt ett exempel.

På min tid lade jag tabellerna på kända adresser så att PAGE eländet
inte uppstod. Man fick ha tungan i rätt mun...

Swech