[ Risto. @ 11.06.2014. 20:23 ] @
Imam problem sa mplab-om, vec dva dana se mucim.

Pravim generator funkcija sa ad9850.
I sve sam lepo ja napisao softver, sa displejem i biranjem frekvencije.
I modul izbacuje lepo sinus na svim frekvencijama osim, na opsegu izmedju 30kHz i 100kHz.

E sad ja sam mislio da je do mog koda, menjao sam sve zivo, ali na kraju nista.
Kada upisem u svoju funkciju za slanje frekvencije 50000 sve lepo radi.
Ali kad napisem 5 * 10000, ili 50 * 1000, ili neku drugu vrednost u problematicnom opsegu, kompajler skroz pobrljavi i izbacuje nesto bezveze.

Otkrio sam da nije do mog programa tako sto sam napisao jednostavan program:

unsigned long proba = 5 * 10000;

u debaggeru mi izbacuje 4294951760.

unsigned long - moram da koristim zbog duzine broja koji saljem, Ali primetio sam da kad posaljem, isto ovo u unsigned int dobijem dobar rezultat, ali je problem sto int nije dugacak dovoljno

Isto to od gore sam probao i u mikroc-u, i sa njim funkcionise.

Nemam pojma sta se desava. Mozda ja nisam nesto dobro podesio posto tek od pre neki dan koristim xc8.
Ako moze neko da proba ovo isto pa da vidi da li mu se javlja ovaj problem.

Imao sam verziju kompajlera 1.30, malopre sam updateovo na 1.32 i opet isto

P.S. Kada izbacujem vrednost 150kHz, 250khz, 1,050MHz sve funkcionise normalno

Moram da posaljem ovako sliku zbog rezolucije

[img]http://postimg.org/image/za5y1dv5r/[/img]
http://postimg.org/image/za5y1dv5r/

Edit: zaboravio sam " = 0 " na ovoj slici ali ne menja nista...
[ goran_68 @ 11.06.2014. 22:53 ] @
Probaj ovako:

Code:
unsigned long proba = 5 * (unsigned long)10000;
[ mikikg @ 11.06.2014. 23:03 ] @
Citat:
goran_68: Probaj ovako:

Code:
unsigned long proba = 5 * (unsigned long)10000;


ili skraceni iskaz

unsigned long proba = 5 * 10000L;
[ Risto. @ 11.06.2014. 23:05 ] @
Hvala na pomoci.

Bas je to bio problem. Pomogao mi je mikikg malo pre pa mi je pomogao da resim to.

unsigned long proba = 5 * 10000L;
On mi je dao ovo resenje, ali ista je stvar.

Samo ne znam da li je o bug kod njihovog compilera ili tako treba.
Posto mi je u mikroc-u normalno radilo. Probacu i u Keilu ali verujem da ce isto da radi.
[ bogdan.kecman @ 12.06.2014. 00:18 ] @
i long i long long su u xc8 32bita
10000 i 10000L ne prave razliku, to je obicna int velicina
vec za ove vece tipa 100k ili milion mora L

da li ovo tuces kroz simulator ili kroz pravi pic? koji pic? simulator je dosta bagovit tako da ako koristis simulator verovatno je tu greska


btw retardiran je XC8 .. stavi

proba = 5L * 10000L;
ili
proba = (unsigned long) 5 * (unsigned long) 10000;

dakle da bi radilo mora oba da budu unsigned long (retardirano ?!?!)

Code:

unsigned long b;
unsigned long a;
b = 5;
a = b * 10000L;


ovako isto radi i ovako
Code:

unsigned long b;
unsigned long c;
unsigned long a;
b = 5;
c = 10000;
a = b * c;


zasto 5*10000 ne radi je retardirano, ja bi rekao bug u xc8

[Ovu poruku je menjao bogdan.kecman dana 12.06.2014. u 01:41 GMT+1]
[ mikikg @ 12.06.2014. 08:13 ] @
Ja probao to sve isto sa XC16 i ISTO se ponasa!
Buguje kada se ne navede explicitno da je konstanta long.

Doduse u simulatoru sa slucajno izabranim PIC modelom ...

[ Risto. @ 12.06.2014. 09:52 ] @
Sva sreca pa je simulator "dobro" radio.
Pa isto sto se desavalo na pic-u (16f884) desavalo se i u simulatoru.
Posle sam shvatio da je pocinjalo da se gubi za frekvencije oko 32 000 (duzina inta) pa do 100 000. (kad se mnozi 4 * 10 000 npr. A kad upisem 40 000 direktno, onda radi)

A ja presao sa bagovitog mikroc-a na bagovit xc8 :D
[ goran_68 @ 12.06.2014. 10:03 ] @
Treba da radi i ovako:

Code:

unsigned long proba;

proba = 5;
proba *= 10000;



Probaj ako te ne mrzi!
[ mikikg @ 12.06.2014. 10:10 ] @
Trebalo bi, nego se XC zaglupi sa konstantom, to je problem ...
[ goran_68 @ 12.06.2014. 10:18 ] @
U ovom slučaju se ne zaglupi. Verovatno zato što u jednom izrazu radi sa po jednim konstantnim operandom. Dva i više mu prave problem. Treba probati razne varijante.
[ Risto. @ 12.06.2014. 10:41 ] @
To isto funkcionise.