Val av banker

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Val av banker

Inlägg av Stene »

Hej! Kommer här med en mycket dum fråga igen. Sitter pickit 2 med en 16f690 och försöker lära mig att programera. Har kört fas riktigt ordentligt på hur man väljer olika banker med status registret. Jag har läst i databladet men jag begriper inte hur det går till väga.Det står:
00=bank0
01=bank1
10=bank2
11=bank3
Har tittat på exemlen i databladet men begriper inte :?:
Så om det fans någon som kunde förklara hur man skriver vore jag tacksam!!
Användarvisningsbild
JockeE
Inlägg: 330
Blev medlem: 4 augusti 2004, 08:46:50

Inlägg av JockeE »

Bank-bitarna RP1 och RP0 brukar vara bit nr 6 och 5 i STATUS-registret.

För att ändra dom är det bara att använda exempelvis

Kod: Markera allt

bsf STATUS,RP1
bcf STATUS,RP0
för att välja bank2 (10).


Men bättre är att använda assemblerdirektivet BANKSEL (läs om det i hjälpfilen för MPASM)
Bara att skriva exempelvis

Kod: Markera allt

banksel TRISA
för att välja banken som TRISA ligger i.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Som sagt, bankbitarna är bara ett par bitar i ett register och
ändras/sätts/clearas precis som vilka andra bitar som helst.

För att underlätta (man behöver inte kolla i databladet vilken bank
varje register ligger i) så har MPASM ett direktiv BANKSEL som
genererar rätt BCF/BSF instruktioner automatiskt.

BANKSEL gör alltså inget magiskt, den gör bara samma sak som man
själv skulle få göra annars, alltså kolla upp vilken bank ett register
ligger i och skriva rätt BCF/BSF instruktioner...

Kolla lite exempelkod så ser du snabbt hur det funegrar.
T.ex : http://www.jescab.se/HD44780.html

Notera att 99% av all kod ute "på nätet" är ganska risig, även kod
i "turorials" vilka annars ser snygga och "väldesignade" ut. Många
tycker att det är roligare att bygga flashiga web-sidor är att skriva
snygg PIC kod...
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Inlägg av Stene »

Ok Tack för dom svaren, då vet jag att det finns något som heter BANKSEL.
Ska läsa på lite om det. Men jag undrar fortfarande hur man gör med statusregistret för att välja bank. Jag vill gärna förstå från grunden hur man gör, visst jag kommer nog att använda banksel men jag vill veta hur det går till. I det svaret som jockeE skriver så har han tagit:
bsf STATUS,RP1
bcf STATUS,RP0
som exempel för att välja bank 2. Hur gör man? När ska det vara bsf, bcf RP0 eller RP1? Tacksam för svar!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Men jag undrar fortfarande hur man gör med statusregistret för att välja bank.

Exakt så som JockeE visade !!!
Om det ska vara BCF eller BSF beror bara på vilen bank du vill till...

Du kan nog inte få mycket mer hjälp, exakt vad är det som ör oklart ?
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Inlägg av Stene »

Jo, jag förstår att man väljer det genom att använda BCF eller BSF tillsammans med RP0 eller RP1. Men hur vet jag vilken kombination av detta som leder till vilken bank? Om jag till exempel ska välja bank 3, hur skriver jag då?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Allt du frågar om finns nog enkelt att läsa i databladet. Ändå svarar jag.

Det är svårt att förstå riktigt vad du undrar eftersom att det (med grundläggande kunskaper inom processorns register- och instruktionsuppsättning) borde vara ganska uppenbart.

Statusregistret innehåller 8 bitar. Två av dessa används för att välja någon av de fyra bankerna. Jag tror det är bit 6 (RP0) och bit 7 (RP1) och kommer därför fortsättningsvis anta det. Värdet på dessa bitar är helt enkelt siffran för den valda banken.

Kod: Markera allt

Bank0 - STATUS = 00xxxxxx
Bank1 - STATUS = 01xxxxxx
Bank2 - STATUS = 10xxxxxx
Bank3 - STATUS = 11xxxxxx
BSF betyder Bit Set Flag
BcF betyder Bit Clear Flag

Genom att skriva:

Kod: Markera allt

bsf STATUS,RP1
bcf STATUS,RP0
Sätts bit 7 och nollas bit 6. Resultatet blir STATUS = 10xxxxxx.

Ovanstående borde hjälpt för att förstå principen. Huruvida siffrorna var rätt spelar egentligen ingen roll eftersom det inte behöver vetas - RP0 och RP1 är definierade i include-filen. Vidare så skapar BANKSEL-makrot lämpliga bit-instruktioner för bankval; kunskap om RP0 och RP1 behövs egentligen inte.

Det fina med BANKSEL är att det (tror jag) håller reda på bitarna och genererar minsta möjliga instruktioner (ibland inga) för bankbytet. Kanske färre än du själv skulle använt utan att göra en djupare analys av hur bitarna är satta.
Stene
Inlägg: 276
Blev medlem: 13 maj 2008, 19:21:52
Ort: Uppsala

Inlägg av Stene »

Ok nu tror jag att jag förstår. Det är så att jag inte har grundläggande kunskaper inom processorns register- och instruktionsuppsättning så det är därför jag frågar dom här dumma frågorna. Jag håller precis på att lära mig det här och har ingen annan o fråga. Tack för svaren!!
Användarvisningsbild
korp
Inlägg: 1216
Blev medlem: 30 maj 2006, 02:21:18
Ort: Strömstad

Inlägg av korp »

Stene, ta ett djupt andetag och starta från grunden med någon trevlig tutorial på nätet eller bok. BSF och BCF är i princip de enklaste direktiven, och greppar du inte dem så är lösningen att läsa på lite. Det finns massor av bra referenser till information i den här forumdelen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det är så att jag inte har grundläggande kunskaper inom processorns register- och instruktionsuppsättning

Då får du läsa databladet ett par gånger till... :-)

Eller, hitta något mer grundläggande om även det är på för hög nivå.

> Det fina med BANKSEL är att det (tror jag) håller reda på bitarna...

Nej, det håller inte reda på bitarna från ett anrop av BANKSEL till nästa,
om det var det du menade.

Däremot så tror jag att BANKSEL inte genererar någon kod alls för de
register som är "un-banked", d.v.s de som finns i alla 2 (eller 4) bankerna.

BANKSEL är inte effektivare än om man hade optimerat det själv,
däremot gör BANKSEL aldrig fel, vilket kan vara en stor skillnad... :-)
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Inlägg av Nerre »

Det där handlar ju egentligen inte om att förstå det här med banker, det handlar främst om att förstå binära tal och hur de kan delas upp.

Att minnet är indelat i banker beror på att adressbussen är "för kort". Nu har jag ingen koll alls på hur lång adressbussen är, men vi kan hypotetiskt säga att vi har en processor med 8 bitars adressbuss.

Den kan då adressera 256 adresser. Det är ganska lite.

Säg att vi vill ha en 10-bitar adressbuss. Två bitar extra. För att slippa konstruera om processorkärnan så vill vi inte göra själva bussen större, så vi lägger till två bitar på adresseringen av minnet, som vi styr på annat sätt.

Det innebär då att för att kunna adressera minnesplatsen

0100101101

Så måste vi först sätta "bank select"-bitarna till 01 (de två första bitarna i adressen). Sen lägger vi ut adressen 00101101 på adressbussen och vips har vi adresserat 0100101101 trots att vi bara har en 8-bitars adressbuss.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Så enkelt är det inte eftersom att det finns register som är tillgängliga i alla banker.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det ändrar ingenting. Det fungerar fortfarande att sätta banker,
även om det inte är helt nödvändigt.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Så måste vi först sätta "bank select"-bitarna till 01 (de två första bitarna i adressen). Sen lägger vi ut adressen 00101101 på adressbussen och vips har vi adresserat 0100101101 trots att vi bara har en 8-bitars adressbuss.
Jo, men sedan så finns det extra logik som gör att vissa register är tillgängliga i alla banker, det som kallar shared RAM.

Samma banking återfinns även på programsidan (eftersom PIC har separata minnesutrymmen för program och data), så att de översta bitarna hämtas från ett separat register man måste ta hänsyn till om man gör en CALL eller GOTO utöver en sida (page), tex 2k på en 16F690.

Jag rekommenderar varmt att man använder PAGESEL hellre än att manipulera bitarna direkt, blir mycket enklare att läsa och avlusa.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Samma banking återfinns även på programsidan

Liknande *hantering* återfinns även på programsidan,
fast det där kallas "paging". Det finns ingen "banking"
i programminnet...

> eftersom PIC har separata minnesutrymmen för program och data

Nu så är det inte just *därför* som det är så, utan för att adressbitarna
i instruktionerna (t.ex GOTO pch CALL) inte räcker till...
Skriv svar