PIC assembler direktivet RES

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ja, banksel är lite "dum" på det sättet att den inte vet i vilken
bank man råkar befinna sig. Den lägger alltid in bcf/bsf
kommandona för att "byta" bank.

Självklart är det upp till programmeraren att avgöra om man
tycker att man har så stor kontroll över sin kod att man inte
behöver banksel, men å andra sidan så ska det aldrig bli fel
med banksel...

Sen, titta på denna del (t.ex) :

Kod: Markera allt

      banksel   Count
      decfsz   Count,f
      goto   $+2
      goto   $+3
      bsf      ONELED 
Det fungerar *bara* om Count ligger i samma bank som PORTD !
Det gör det inte när jag bygger koden...

Det enklaste i detta fall eftersom det är så få variabler, är
att flytta in Count i UDATA_SHR...

*Eller* att se till att bankerna alltid står rätt, t.ex så här :

Kod: Markera allt

      banksel   Count
      decfsz   Count,f
      goto   $+2
      goto   $+3
      banksel  PORTD
      bsf      ONELED 
Istället för "PORTD" bode man skapa en symbol
så att det blir så här :

Kod: Markera allt

#define   LEDPORT    PORTD
#define   ONELED      LEDPORT,2         ; OUTPUT
#define   TWOLED      LEDPORT,3         ; OUTPUT 
...
... och sen :
...
...
      banksel   Count
      decfsz   Count,f
      goto   $+2
      goto   $+3
      banksel  LEDPORT
      bsf      ONELED 
Då har du bara ett ställe att ändra för att
"flytta" alla LEDs till en annan port...
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

opatagio: Vad får dig att tro att det *inte* fungerar med banksel? Jag testade koden och det funkar här (MPLAB 7.60 med MPSIM), inga fel vid assemblering och inga fel vid länkning och inga konstigheter när jag enkelsteppar programmet genom banksel och instruktionerna som ändrar i "Count".

Som sagt, vad får dig att tro att något är fel?


/Mats
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Problemet är att ett bankfel *ALDRIG* syns i MPASM aller MPLINK.
De har *INGEN* koll på om man sköter bankningen korrekt...

Om man kollar noga med MPSIM så borde man dock se att fel
register skrivs eller läses...

Och som jag skrev, med en banksel där den var i exempelkoden,
så fungerar det inte. När jag byggde koden så hamnade "Count" på h'120'
och en banksel *dit* gör att man skriver till CM2CON0 istället för PORTD...

EDIT:
Kaggen, verifera med din MAP-fil var Count hamnade !
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> inga konstigheter när jag enkelsteppar programmet genom banksel och instruktionerna som ändrar i "Count".

Och varför tror du att det är problem med just *Count* ?
Hur fungerade "bsf ONELED" ett par rader senare ?

En annan sak :

> goto $+2
> goto $+3

Gör helst *inte* så där. Det är en "bug waiting to happen"...
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

> Problemet är att ett bankfel *ALDRIG* syns i MPASM aller MPLINK.
> De har *INGEN* koll på om man sköter bankningen korrekt...

Att den inte har kolla på att *jag* sköter bankningen korrekt förstår jag, men efter en banksel så sätter väl MPSIM STATUS RP0 och RP1 riktigt, eller menar du att den inte har koll på det heller?

Som jag fattade opatagio så sattes inte bankbitarna rätt efter ett banksel kommando, men jag kanske missförstod (vilket jag nu förstår att jag gjorde).

I min MAP-fil hamnade mycket riktigt Count på 0x20, i samma bank som ONELED, därför funkade det för mig. Så det betyder att om MPLINK väljer att lägga Count i en annan bank så kommer ONELED inte att funka eftersom opatagio glömt att köra en banksel ONELED innan han fipplar på den.


/Mats
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

Inte för detta hjälper mycket, men det är av just den anledningen till
att jag mest bara kör PIC18F, då har man iaf 'alltid' (Av de modeller jag testat)
SFR i samma bank.. generellt access-bank.

edit: SPF -> SFR !
Senast redigerad av Johan.o 19 juli 2007, 14:12:35, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kaggen, helt korrekt !!

Visst sätter den RP0/RP1 korrekt, det jag menar är att banksel inte vet
om de *redan* är korrektr satta, utan den sätter dom alltid. Problemet
var att det 'saknades* ytterligare ett banksel för LED-kommandot.

Notera också att om opatagio *inte* hade kortslutit meddelande -302,
så hade det blivit et larm för Count (*om* den allokerades i annan
bank än bank 0) och då hade man kunnat kolla det...

Och när man *inte* gör banksel för Count, så kommer allt att fungera ändå,
*MEN* den minnesadress som man ändrar när man anger "Count" är
*INTE* den som MPASM/MPLINK allokerat till count. Att det ändå fungerade
berodde på att motsvarande adress i bank 0 inte var använd av något annat,
hade den varit det så hade man skrivit över det som stog där...

Och visst, access-banken i PIC18 är trevlig och gör att man till stor
del slipper dessa problem. Å andra sidan *är* det inga problem om
man använder banksel korrekt.

Man kan också "styra" variablerna till den bank där det blir minst
bank-switchningar. I just *detta* fall skulle jag lägga Count i UDATA_SHR
tillsammand med de tre andra variablerna...
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

opatagio skrev:Som jag förstått det så ska 'banksel count' fungera även om denna ligger i samma bank som jag är i sedan tidigare?
Ja. Banksel fixar rätt bank oavsett vilken tidigare bank du är i.
Skriv svar