Konstigt problem med att skriva till en variabel

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Konstigt problem med att skriva till en variabel

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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...
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
Senast redigerad av Johel572 17 mars 2009, 10:53:10, redigerad totalt 1 gång.
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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!
Senast redigerad av Johel572 17 mars 2009, 11:10:44, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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...
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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.
Användarvisningsbild
Johel572
Inlägg: 53
Blev medlem: 5 juli 2006, 10:36:01
Ort: Linköping

Re: Konstigt problem med att skriva till en variabel

Inlägg av Johel572 »

Så sant. :D

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.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Konstigt problem med att skriva till en variabel

Inlägg 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)...
Skriv svar