Sida 1 av 1
Konstigt problem med att skriva till en variabel
Postat: 16 mars 2009, 16:39:38
av Johel572
Hej nu är jag igång igen och jag har ett knepigt problem när jag försöker skriva till en variabel i min pic18f258. Bakgrunden är att jag har ett program som jag skrivit och det fungerar som det ät tänkt men sen när jag skulle lägga till en funktion så vägrar programmet att acceptera att jag försöker skriva ett värde till en variabel (spelar ingen roll om jag definerar en ny variabel eller tar en gammal).
Så här lag jag till en liten kodsnutt för test som inte exekveras.
Kod: Markera allt
;Break point
nop
nop
movlw d'100'
movwf avstand_byte1
bsf TIME_OUT
Det som fungerar är att skriva vädret 100d till wreg men något mer görs inte. Vad jag kan se är adressen för variabel helt ok (139h) om man jämför med linker filen. Kodsnutten ligger i en funktion i en separat fil och anropas från main programmet med detta har ju aldrig varit något problem förut. Jag kontrollerar värdet på variabeln genom min ICD2 och stegar mig genom dessa fem rader.
Kör jag samma kodsnutt i main så fungerar det (precis som det ska göra!). Det får mig att tro att det blir något galet vid anropet av funktionen eller andra funktioner i samma fil (har även testat detta). Det knepiga är att i övrigt så fungerar min funktionsfilen perfekt, det är bara det att jag inte kan lägga till variabler eller movwf, bsf, bcf instruktioner (de jag har testat hitils) som påverkar en variabel. Jag är lite osäker på vad man bör kontrollera först?
Re: Konstigt problem med att skriva till en variabel
Postat: 16 mars 2009, 16:53:50
av sodjan
Ligger koden du visade i samma modul (d.v.s ASM fil) som där avstand_byte1 definieras ?
Om inte, har du korrekta GLOBAL och EXTERN ?
> Vad jag kan se är adressen för variabel helt ok (139h)
Och du har BANKSEL med ? Notera att 139h ligger i bank1...
Re: Konstigt problem med att skriva till en variabel
Postat: 16 mars 2009, 17:20:34
av Johel572
Tack för ett snabbt svar. Variabel defineras i samma fil som koden och används bara lokalt. Det konstiga är att jag har kanske 30 variabler som defineras och används på samma sätt i funktionsfilen men vad jag än lägger till accepteras inte.
BANKSEL, hm, nu är jag lite osäker på vad ni menar. Jag kanske är ute och cyklar men inte använder man väl BANKSEL på en pic18? Tittar jag i map filen kan jag se att funktionsfilen startar på adress 234h till 448h (214bytes) men det gör mig inte så mycket klokare. Jag skulle nog behöva en lite mer "for dummies" förklaring av vad ni menar då jag inte riktigt hänger med.
En fullösning jag testat är att dela upp funktionsfilen i flera mindre delar (skulle kunna göra en lämplig uppdelning med styr resp data funktioner) men det löser ju egentligen inte själva problemet.
Re: Konstigt problem med att skriva till en variabel
Postat: 16 mars 2009, 17:29:56
av sodjan
OK, läs på om minneshanteringen i databladet och återkom sedan.
BANKSEL behövs ibland (om variabel ligger utanför "access bank").
Normalt försöker man hålla enkla variabler till access bank och
lägger buffrar (som man ofta läser via index-registren) i andra banker.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 10:26:24
av Johel572
Hej, tack för tipset. Nu ska vi se om jag förstått det hela rätt. Access bank är alltså en del av minnet som går att nå oavsett värde på Bank Select Register. För variabler är det i mittfall (pic18f258) från adress 0h-5Fh (95bytes, står till och med ACCESSBANK i länk-filen).
En snabb titt i map-filen ger att en stor del av mitt huvudprogram (FUNCTIONS, 00Ch-230h ligger i denna del av minnet. Se nedan.
Kod: Markera allt
Section Info
Section Type Address Location Size(Bytes)
--------- --------- --------- --------- ---------
RESET_VEC code 0x000000 program 0x000004
.cinit romdata 0x000004 program 0x000002
ISR_VEC code 0x000008 program 0x000004
FUNCTIONS code 0x00000c program 0x000224
DP_DATA code 0x000230 program 0x00012e
DP_EXTRA code 0x00035e program 0x000080
MAIN code 0x0003de program 0x000052
UART_LIB code 0x000430 program 0x000030
ISR_ROUTINE code 0x000460 program 0x00001c
MAIN_VARS udata 0x000060 data 0x00006f
TEST_VARS udata 0x0000cf data 0x000002
DP_DATA_VARS udata 0x000100 data 0x00003e
Min först fråga blir då varför det är så? I min värld torde väl ACCESSBANK vara reserverad för variabler man vill ha snabb återkomst till?
Jag är fortfarande osäker på om det här kommer att lösa mitt problem men är i vilket fall som helst väldigt intressant och inte någonting jag pysslat med tidigare.
Tillägg: De variabler jag har bekymmer med och som det endast sporadiskt går att skriva till ligger i DP_DATA_VARS.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 10:52:10
av Johel572
Ha Sodjan du har rätt igen.
Jag väljer helt enkelt rätt minnesbank med movlb innan jag skriver till variabeln. Fungerar hur bra som helst. Då har jag lärt mig något nytt i dag med
Tack!
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 10:53:13
av Icecap
Det du tittar i är program-ROM, inte RAM... Det kanske förklarar varför det blir så.
En PIC har Harward-arkitektur, där har ROM och RAM olika busser vilket betyder att de fint kan ha samma adresser utan att "kollidera" för det.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 11:54:55
av sodjan
Som Icecap sa, blanda inte ihop program och data minne !
"FUNCTIONS" är ett segment i ditt program och ar ingenting med
dina variabler eller Access bank göra.
> DP_DATA_VARS : är däremot ett segment i RAM.
> "Access bank är alltså..." ...exakt det som databladet beskriver.
Att dina variabler börjar på h'60' tolkar jag som att du inte
använder Access bank alls. D.v.s du har ingen UDATA_ACS, vilket
ju är lite dumt...
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 13:09:38
av Johel572
Icecap
Det där var ett bra påpekande. Jag var helt fel ute, tog ett tag innan jag förstod vad ni menade. Tack.
Sodjan
Med tanke på ovanstående hade jag inte alls förstått det rätt bara gjort något som verkade fungera. Nu har jag gjort om igen och det här ser väl lite bättre ut.
Kod: Markera allt
Section Info
Section Type Address Location Size(Bytes)
--------- --------- --------- --------- ---------
RESET_VEC code 0x000000 program 0x000004
.cinit romdata 0x000004 program 0x000002
ISR_VEC code 0x000008 program 0x000004
FUNCTIONS code 0x00000c program 0x00022c
DP_DATA code 0x000238 program 0x000142
DP_EXTRA code 0x00037a program 0x000080
MAIN code 0x0003fa program 0x000052
UART_LIB code 0x00044c program 0x000030
ISR_ROUTINE code 0x00047c program 0x00001c
DP_DATA_VARS udata 0x000000 data 0x00003e
MAIN_VARS udata 0x000060 data 0x00006f
TEST_VARS udata 0x0000cf data 0x000002
DP_DATA_VARS på adress 000h vilket är i accessbank. Nu fungerar testprogrammet som det är tänkt så nu är det dags att skrivas om på riktigt. Jag har dock några funderingar.
Till att börja med, ska jag lägga alla variabler i accessbank eller bara det jag använder lokalt i mina funktionsfiler? Jag är inte riktigt säker på hur jag skall använda accessbank.
Hur gör jag med SFR? Borde det inte vara bra att ha de i bank 15 (accessbanksfr). Idagsläget definerar jag dem precis som en variabel enligt:
Kod: Markera allt
avstandsdata res 20 ;Array för avståndsdata
Och anropar dem genom:
Kod: Markera allt
;Välj FSR0 för att lagra data
lfsr FSR0, avstandsdata
.
.
.
Jag menar det fungerar ju att ha dem i accessbank men vill man ha lite mer data så räcker ju inte de där 96byte långt.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 13:33:22
av sodjan
Generellt (om det får plats) :
Access bank: variabler som du använder direkt, så att säga. Eller där du vill
ha maximal prestanda (du slipper BANKSEL).
Övriga banker: buffertar och andra strukturer som används via indexregistre (FSRx)
eller som i alla fall inte används "ofta" (vad "ofta" är är naturligstvis applikationsspecifikt).
Det framgår ju inte vad som ingår i DP_DATA_VARS resp MAIN_VARS, men du har
i alla fall en del utrymme kvar i Accessbank, så t.ex de två variablerna i TEST_VARS
skulle mycket väl kunna läggas i Access bank med UDATA_ACS...
> Hur gör jag med SFR?
De ingår i Access bank (ungefär halva, den övre delen).
"avstandsdata" skulle kunna ligga i vilken bank som helst eftersom den hanteras genom FSR0,
alltså att ingen BANKSEL hantering behövs. Lite dumt/onödigt att ta utrymme i Access bank
för det.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 13:55:56
av Johel572
Tack för förklaring. Jag hade visst fått det lite om bakfoten. Nu tror jag att jag grejar det.
Jag kan föresten tillägga att map-filen jag länka från ovan bara är ett exempel för att testa och felsöka funktionsfilerna en och en i en lite enklare miljö innan jag impelemterar dem i det "riktiga" programmet. Därför stämmer kanske inte antalet variabler och dylikt med vad jag har i skallen.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 15:27:17
av vfr
Det är en mycket bra taktik att testa enskilda funktioner var för sig! Då ser man många konstigheter som kanske annars inte kommer fram bakom all annan funktionalitet.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 15:33:00
av sodjan
> med vad jag har i skallen.
Helt ointressant vad du "har i skallen".
Det enda som *vi* vet är vad står i tråden och det är det som gäller här.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 16:38:24
av Johel572
Så sant.
Jag kan meddela att det gick bra att impelemtera detta i huvudprogrammet. Det blev 71 stycken variabler till slut och sen kanske det behövs tio stycken till för två småfunktioner jag måste fixa. Sen är det klart.
Det är alltid kul att lära sig något nytt.
Re: Konstigt problem med att skriva till en variabel
Postat: 17 mars 2009, 16:46:04
av sodjan
Perfekt...
Jag hoppas att du ser fördelarna med att köra "relocatable" (d.v.s
med RES, CODE, UDATAxxx o.s.v), speciellt om man har flera
olika moduler (ASM filer). PIC18 är ju dessutom lite smidigare
att programmera generellt (än PIC16)...