Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Tor Maj 01, 2012 6:55 pm Naslov sporočila: C18 - napačno računanje |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1011 Aktiv.: 4.27 Kraj: Rače
|
Objavljeno: Tor Maj 01, 2012 8:10 pm Naslov sporočila: |
|
|
Malo zaskrbljen nad temi rezulalti sem takoj šel preizkusiti.
C18 3.40 na 18F67J11:
signed long A = 0;
signed char B = -1;
A += B; rezultat: A=-1
unsigned long A = 0x1234;
unsigned long B = 0;
if (A > B) drži.
Očitno problem ni v prevajalniku. |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Tor Maj 01, 2012 8:21 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.17 Kraj: Ljubljana
|
Objavljeno: Tor Maj 01, 2012 8:46 pm Naslov sporočila: |
|
|
Ja probelm imaš v poravnavi variabel!
Očitno si izklopil ali pozabil vklopiti neki prevajalnikov switch!
Oziroma si ročno določil kazalce variabel!
Posamezna 4 bytna variabla mora biti znotraj 256 bytne banke, kar pri tebi ni.
Če gledaš kodo (odebeljene adrese)...
0021fe 59ff SUBWFB 0xff,0x0,0x1
002200 50ee MOVF 0xee,0x0,0x0
002202 5900 SUBWFB 0x0,0x0,0x1
Adresa prve 4 bytne variable ti kaže na naslov 0xfe, kar pa ni ok!
LP GJ |
|
Nazaj na vrh |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1011 Aktiv.: 4.27 Kraj: Rače
|
Objavljeno: Tor Maj 01, 2012 10:55 pm Naslov sporočila: |
|
|
Če je spremenljivka večja od 256 bytov, ti prevajalnik javi napako. Tudi če je skupna velikost spremenljivk večja od 256 bytov ti javi napako.
Če rabiš večje spremenljivke (oziroma več) moraš banko povečati oz. spremenljivke razdeliti med posamezne banke.
Če si banko povečal, potem lahko do spremenljivk dostopaš samo preko kazalcev!!! |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.72 Kraj: Kranj - struževo
|
Objavljeno: Sre Maj 02, 2012 12:35 am Naslov sporočila: |
|
|
1. Zamenjaj procesor s takim, ki nima bank
2. Uporabi proc z več spomina
V teh časih je izbira ogromna...
Poskusi še z Little / Big Endian... _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
trully1 Član

Pridružen-a: Pet 14 Nov 2003 20:20 Prispevkov: 216 Aktiv.: 0.91 Kraj: Železniki
|
Objavljeno: Sre Maj 02, 2012 9:38 am Naslov sporočila: |
|
|
Zdravo
Tudi jaz sem naletu na težave, če nista bili spremenljivki enakega tipa.
Koda: |
signed long A1 = 0;
signed char B1 = -1;
signed long A2 = 0;
signed char B2 = -1;
A1 += B1; //rezultat: A1=-1
A2 += B2; //rezultat: A2=0x00FFFFFF |
Namesto zgornjega zapisa testiraj s tem: (pri meni je pomagalo)
Koda: |
A1 += (signed long)(B1);
A2 += (signed long)(B2); |
LP |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sre Maj 02, 2012 9:51 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.17 Kraj: Ljubljana
|
Objavljeno: Sre Maj 02, 2012 11:27 am Naslov sporočila: |
|
|
Kroko je napisal/a: |
Razlog je bil v tem, da sem banke povečal (.lkr datoteka) saj sem v eni .c datoteki potreboval več kot 256 bytov spomina. |
Aha, če spreminjaš linker datoteke moraš biti pazljiv, ker ne moreš kar razširiti banke, ker je hardware-sko določena!
LP GJ |
|
Nazaj na vrh |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1011 Aktiv.: 4.27 Kraj: Rače
|
Objavljeno: Sre Maj 02, 2012 12:49 pm Naslov sporočila: |
|
|
Citiram: |
Če si banko povečal, potem lahko do spremenljivk dostopaš samo preko kazalcev!!! |
|
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sre Maj 02, 2012 12:52 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1011 Aktiv.: 4.27 Kraj: Rače
|
Objavljeno: Sre Maj 02, 2012 2:19 pm Naslov sporočila: |
|
|
Citirano iz Microchip help:
Citiram: |
By default, MPLAB C18 assumes that an object will not cross a bank boundary.
An object that is larger than 256 bytes can be created, but the following steps are required to create a multi-bank object:
1. The object must be allocated into its own section using the #pragma idata or #pragma udata directive.
#pragma udata buffer_scn
static char buffer[0x180];
#pragma udata
2. Accesses to the object must be done via a pointer.
char * buf_ptr = &buffer[0];
...
// examples of use
buf_ptr[5] = 10;
if (buf_ptr[275] > 127)
|
Se držim tega in ni težav. |
|
Nazaj na vrh |
|
 |
galjotj Član


Pridružen-a: Pet 02 Nov 2012 15:08 Prispevkov: 231 Aktiv.: 1.50 Kraj: Zgornji Brnik
|
Objavljeno: Sob Nov 03, 2012 12:39 am Naslov sporočila: |
|
|
Imam en "mogoče" podoben problem. C18 Projekt je ravno tako na 18F4550 (fizično sicer na 2550) in tudi že precej "zapolnjen", saj obdelujem kup senzorjev, servo motorje ter USB komunikacijo. Vse deluje BP, dokler ne vstavim kakšne matematike ala sin, atan2, acos, kar povzroči nestabilno delovanje, čeprav prevajanje ne najde nobenih problemov. Problem nastane že, ko so omenjene funkcije v neuporabljeni proceduri.
Se je kdo že srečal s čim podobnim ?
Sem našel domneve okrog premajhnega sw stacka, nepravilno definiranih spremenljivk... Nekaj tega sprobal, ne vem, če pravilno, a zaenkrat vse brez uspeha..
Hvala in lp _________________ Pa sam programirat sem hotu! |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Sob Nov 03, 2012 2:32 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
galjotj Član


Pridružen-a: Pet 02 Nov 2012 15:08 Prispevkov: 231 Aktiv.: 1.50 Kraj: Zgornji Brnik
|
Objavljeno: Sob Nov 03, 2012 2:10 pm Naslov sporočila: |
|
|
Ja, res je, da sem z veliko manjšimi spremenljivkami presegel velikost banke, kar je javil tudi prevajalnik. Pa sem dodal:
#pragma udata udata1
in problem je "izginil".
Tudi dokler ne vklopim spornih funkcij, "premeščene" spremenljivke delajo navidez normalno.
Torej, če je bug, kako potem stvar zaobiti, saj toliko spremenljivk pač rabim ?
HVALA IN LP _________________ Pa sam programirat sem hotu! |
|
Nazaj na vrh |
|
 |
|