Sida 1 av 3
Register?
Postat: 26 januari 2009, 20:46:51
av MGKea
Välj register. Åter till register .....
Behöver hjälp med att förstå vad som sker.
Tack på förhand /Magnus
Kod: Markera allt
bsf STATUS,RP0 ; select Register Page 1
.....
bcf STATUS,RP0 ; back to Register Page 0
.....
bcf STATUS,RP0 ; address Register Page 2
bsf STATUS,RP1 ;
.....
bcf STATUS,RP0 ; address Register Page 0
bcf STATUS,RP1 ;
...osv
Re: Register?
Postat: 26 januari 2009, 21:22:04
av Icecap
Vad som sker är att du har hittat ett väldigt dåligt exempel på hur man byter bank i en PIC!!!
bsf STATUS, RP0 får bit RP0 i STATUS-registret att bli '1' men hade det varit ett bra exempel hade det t.ex. hetat:
banksel TRISA (eller vilket register man ville komma åt)
Orsaken är att de olika register har lite olika adresser, t.ex. har PORTA en adress i bank 0 och tar man exakt samma adress fast då i bank 1 blir det TRISA registret man kommer åt.
Vill man då välja bank 1 måste RP0 settas till '1' och vill man ha bank 0 måste den bit nollas.
I verkliga livet skriver man:
movwl 0x55 (eller whatever)
banksel TRISA
movwf TRISA
banksel PORTA
clrf PORTA
Re: Register?
Postat: 26 januari 2009, 22:05:19
av sodjan
> Behöver hjälp med att förstå vad som sker.
Om du menar vad BCF och BSF har för funktion så framgår det
av beskrivningen (som finns i varje datablad) för resp kommando.
Om du menar vad det har för funktion att sätta/cleara de två
RP0/RP1 bitarna i STATUS registret, så framgår det av kapitlet om
"Data Organization" speciellt sektionen "Data Memory Organization".
Även detta finns i princip i alla datablad.
Om det är något annat du behöver hjälp med så kanske du
kan förtydliga dig lite så att det framgår vad som är oklart,
så tar vi det...
Om som Icecap säger, läs på lite om BANKSEL vilket är ett bättre
sätt att göra det som de där kommandona gör...
Re: Register?
Postat: 27 januari 2009, 00:34:31
av MGKea
Får ursäkta men jag får inte ihop hur detta går till....
Kod: Markera allt
Start:
;bsf STATUS,RP0
banksel TRISA
movlw 0xFF
movwf TRISA
clrf TRISC
movlw 0x10
movwf ADCON1
bcf STATUS,RP0
; address Register Page 2 ..
bcf STATUS,RP0 ; tömmer RP0
bsf STATUS,RP1 ; sätter RP1
; och vipps är jag i adress 2 ... hur kan det komma sig...?
movlw 0xFF
movwf ANSEL
bcf STATUS,RP0
bcf STATUS,RP1
movlw 0x01
movwf ADCON0
MainLoop:
nop
nop
nop
nop
nop
bsf ADCON0,GO
btfss ADCON0,GO
goto $-1
swapf ADRESH,w
movwf PORTC
goto MainLoop
end
Re: Register?
Postat: 27 januari 2009, 00:44:51
av wolfheat
MGKea skrev:Välj register. Åter till register .....
Behöver hjälp med att förstå vad som sker.
Tack på förhand /Magnus
Kod: Markera allt
bsf STATUS,RP0 ; select Register Page 1
.....
bcf STATUS,RP0 ; back to Register Page 0
.....
bcf STATUS,RP0 ; address Register Page 2
bsf STATUS,RP1 ;
.....
bcf STATUS,RP0 ; address Register Page 0
bcf STATUS,RP1 ;
...osv
bsf samt bcf är kommandon, dessa hittar du sammanfattade i slutet av de flesta datablad. kolla "Instruction Set Summary"(PIC-modeller), där hittar du även information om övriga kommandon och hur de fungerar, vilka register de påverkar etc.
det finns ett register som heter status. Jag antar att du inte deklarerar värdet i STATUS själv utan använder ett includekommando för tex en .inc-fil. Samt skriver din kod i något program tex MPLAB. Inklude-kommandot ser då vanligen ut så här...
Då inkluderas inc filen och blir en "del" av din kod. Lägg gärna till denna inc fil i projektet (under other files) i MPLAB så kan du öppna den och kontrollera värden. I INC-filen tilldelas "ord" ett värde
tex. (för tex PIC16F877A)
eller
När du sedan använder ett kommando, tex bsf. Så ser du i databladet hur den fungerar. Tex "bsf f,b" där f är destinationen till registret du vill använda och b en bit i det registret. Att du skriver STATUS istället för H'0003' är för att det blir lättare att förstå vilket register man håller på med.
Samma sak sker oavsätt om du skriver (PIC16F877A)
eller
bsf vill ha destinationen till ett register samt en bit som parametrar.
(Hoppas jag fick det här rätt. Rätta mig om jag råkat fått med något fel...)
Re: Register?
Postat: 27 januari 2009, 04:30:23
av bearing
Re: Register?
Postat: 27 januari 2009, 08:56:07
av MGKea
Ahaaa nu trilla polletten ner.....
RP0 och RP1 är samma byte.
Set RP0 och clear RP1 = 10
Re: Register?
Postat: 27 januari 2009, 09:29:27
av MGKea
Det börjar klarna. Har bara programmerat program för Windows de senaste 15åren. Man är så bortskämd i Visual Studio....
(Senast jag programmerade en microprocessor var 1993 då vi i en förstudie åt Assa utveklade en styrning till deras då nya motorlås. Det blev skit med det då Assa köpte Abloy som redan hade en färdig lösning.)
Först skall jag gå igenom alla 12 lektioner som medföljde Pickit2. Under tiden tror jag att det kommer en och annan "dum" fråga som jag hoppas Ni har överseende med.
Tack för stödet!
/Magnus
Re: Register?
Postat: 27 januari 2009, 09:54:12
av korp
Rekommenderar som vanligt
http://www.mikroe.com/en/books/picmcubook/ som jag önskar hade funnits när jag började. Den ger inte svar på allt, men väldigt mycket för att komma igång med grunderna.
Re: Register?
Postat: 27 januari 2009, 10:11:36
av sodjan
> Ahaaa nu trilla polletten ner.....
> RP0 och RP1 är samma byte.
Nej, det är det *INTE*. RP0 och RP1 är inte "bytes".
RP0 och RP1 är två olika *bitar* i registret STATUS.
> ; och vipps är jag i adress 2 ... hur kan det komma sig...?
Kollade du alls på de delar av databladet som jag hänvisade dig till ?
(Alltså "Data Organization", speciellt sektionen "Data Memory Organization".)
Det verkar inte så...
Re: Register?
Postat: 27 januari 2009, 10:28:53
av Icecap
Jämför med ett MMU (Memory Management Unit) som man har på processorer som kanske inte har så mycket adressomfång. Jag byggde om en TRS80 i sin tid, den har ju en Z80 µC och den kan adressera 64kB enbart.
En del av denna adressomfång upptas av skärmens minnesadress, tangentbordet tar sin lilla del också och ROM'en likaså. Kvar blir det inte så himla mycket plats fast i de dagar var det MYCKET kvar.
Jag kom över ett antal 32kB SRAM och bytte ut de 8kB dynamisk ram som fanns mot 32kB SRAM och det var bra. Men jag ville ha lite extra "hårddisk" (med batteri back-up) och jag hade ett antal MB av dessa SRAM-kretsar så vad göra? Jag lade en bank på 16kB i minnet som jag kunde använda till detta men bara 16kB... det var ju lite... så jag lade dit 128kB (4 kretsar) men hur skulle jag komma åt dom? Fanns ju bara 16kB...
Jo, jag lade till ett register (en fysisk krets) som processorn kunde skriva ett värde till, detta värde blev då använd som högsta adressbits till detta extraminne och plötsligt kunde jag välja vilken bank av 8 som jag ville komma åt och då jag hade dekodad BASIC-PROM'et totalt (och därmed kunde assemblera källkoden och få ett fungerade program) lade jag in kommandon som gjorde detta automatisk för mig via de save/load kommandon som tillhör disk-BASIC'en men det är en annan sak.
Precis så är det med bankningen i PIC också: vissa register ligger så att man inte omedelbart kan adressera dom, detta på grund av antal bits i kommandoordet vilket kan härledas till effektivitet, dels ekonomisk och dels cykelmässigt. Med dessa bits i STATUS kan man alltså välja vilken bank man vill komma åt, de 2 bits är alltså högsta adressbitsen när man ska välja register.
Att det sedan är mycket dumt att setta/resetta dessa bits när det finns BANKSEL-kommandot är egentligen bara en tydlighetsfråga, precis som att vissa skriver målet i kommandon som '0' eller '1' när det bör vara W eller F, det är alltså en läsbarhets-fråga.
Re: Register?
Postat: 27 januari 2009, 10:45:11
av MGKea
sodjan skrev:> Ahaaa nu trilla polletten ner.....
> RP0 och RP1 är samma byte.
Nej, det är det *INTE*. RP0 och RP1 är inte "bytes".
RP0 och RP1 är två olika *bitar* i registret STATUS.
> ; och vipps är jag i adress 2 ... hur kan det komma sig...?
Kollade du alls på de delar av databladet som jag hänvisade dig till ?
(Alltså "Data Organization", speciellt sektionen "Data Memory Organization".)
Det verkar inte så...
Status är en byte ? Och RP0 och RP1 är varsin bit i Status byte:en....
Skulle ha skrivit RP0 och RP1 återfinns i samma byte"
Re: Register?
Postat: 27 januari 2009, 11:01:08
av MGKea
Re: Register?
Postat: 27 januari 2009, 11:02:10
av sodjan
> Status är en byte ?
Jo, eller "register" eller "SFR" som det kallas i databladet, eller hur ?
> Och RP0 och RP1 är varsin bit i Status byte:en....
Helt korrekt. Men säg "status registret" så använder du samma
begrepp som databladet (då blir det enklare när du väl öppnar det).
Nu får *du* svara på en väldigt enkel fråga...
Har du, eller har du inte, läst på om BCF/BSF samt kapitlet om
"Data Memory Organization" i databladet. Ja eller Nej.
Om nej, varför ? Om ja, vad är oklart ?
Re: Register?
Postat: 27 januari 2009, 11:45:03
av MGKea
sodjan skrev:> Status är en byte ?
Jo, eller "register" eller "SFR" som det kallas i databladet, eller hur ?
> Och RP0 och RP1 är varsin bit i Status byte:en....
Helt korrekt. Men säg "status registret" så använder du samma
begrepp som databladet (då blir det enklare när du väl öppnar det).
Nu får *du* svara på en väldigt enkel fråga...
Har du, eller har du inte, läst på om BCF/BSF samt kapitlet om
"Data Memory Organization" i databladet. Ja eller Nej.
Om nej, varför ? Om ja, vad är oklart ?
Förstod vad de skriver om BCF och BSF. Det som inte klickade var att det var i samma byte.
Förstår vinken om att kötta manualer och datablad. Även om man läser stöter man på problem om man inte förstår.
Har läst en del. Måste komma på vart efter för att det inte skall bli för mycket som man inte förstår på en gång.