Problem med PCL och PCLATH (16F767)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Perrx
Inlägg: 176
Blev medlem: 15 december 2003, 21:43:41
Ort: Göteborg
Kontakt:

Problem med PCL och PCLATH (16F767)

Inlägg av Perrx »

Jag håller på att bygga en nummerpresentatör och har kopplat en grafisk LCD till picen. Kodandandet har gått mycket bra men idag råkade jag ut för något jobbig. Jag trodde att om man använde pagesel så behövde man inte bry sig om sidor och så. Men icke! Nedan är ett urklipp ur koden:

Kod: Markera allt

...
...
        org H'00BE'
	pagesel nummerHEX
	CALL     nummerHEX
....
....
        org H'0A5D'
nummerHEX		
		
	BANKSEL	PCLATH     <----
	BSF	   PCLATH,1  <----
	ADDWF   PCL,F
		
	pagesel zero
	CALL     zero
	RETURN		
	pagesel one
	CALL     one
	RETURN
Det fina är att den kommer till nummerHEX utan problem. Men sen, om jag inte har de två raderna om PCLATH så hoppar programmet bakåt (till H'085D') vilket ju inte är så kostigt, om vi antar att W är noll.

Måste man alltid ladda PCLATH när man hoppar såhär och nu måste jag ju återställa PCLATH nu när jag har pillat i den, det blir mycket omkodande.

Kunde jag ha löst detta på ett bättre sätt? (Sätta tabellen först på en ny sida är inte ett alternativ)

Tack och hej!
-Per
Användarvisningsbild
Icecap
Inlägg: 26737
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kod: Markera allt

   BANKSEL   PCLATH ; Varför? Den är ALLTID tillgängelig oberoende av bank
   BSF      PCLATH,1  <----
   ADDWF   PCL,F
      
   pagesel zero ; Varför? CALL klarar väl hela minnet?
   CALL     zero
   RETURN      
   pagesel one
   CALL     one
   RETURN

Varför inte:

  ... bla bla
  call NummerHEX
  ... bla bla


NummerHEX:
  addwf PCL,F
  jmp Zero
  jmp One
  jmp Two
....

Zero:
  bla bla
  RETURN
One:
  bla bla
  RETURN
Two:
  bla bla
  RETURN
Användarvisningsbild
Perrx
Inlägg: 176
Blev medlem: 15 december 2003, 21:43:41
Ort: Göteborg
Kontakt:

Inlägg av Perrx »

Tack för svaret!
Din lösning med hopptabellen var verkligen snygg, att jag inte tänkte så! :oops:

Men BSF PCLATH,1 behövs väl fortfarande?

Tack för tipsen!

Hälsningar
Per
Användarvisningsbild
Icecap
Inlägg: 26737
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Om du har din Zero: One: Two: Three: osv så högt i minnet att den behövs så ja. Kom bara ihåg att rensa bort den vid returen.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> CALL klarar väl hela minnet?

PIC16 : CALL innehåller 11 adressbitar [0..10], 2 bitar kommer från PCLATH.
PIC18 : CALL innehåller *hela* adressen.

CALL kan alltså "hoppa" inom den 2 Kord sida som man befinner sig på,
om inte PCLATH först justeras för att peka på rätt sida där subrutinen
ligger. PAGESEL är ett sätt att fixa det på ett säkert sätt.

*** Se också PAGESELW i MPASM manualen !! ***

PAGESELW är smidigare eftersom det laddar alla *5* bitarna i PCLATH vilket
är nödvändigt inför en "ADDWF PCL, f". PAGESEL sätter bara de *två* bitar
i PCLATH som krävs av CALL.
Skriv svar