 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
mehatronik Član

Pridružen-a: Tor 28 Dec 2004 8:28 Prispevkov: 16 Aktiv.: 0.07 Kraj: Šenčur, EU
|
Objavljeno: Sre Sep 21, 2005 7:36 am Naslov sporočila: Negativna števila |
|
|
Pozdravljeni!
Imam probleme z negativnimi števili, s katerimi v PIC-u zapisujem trenutni položaj koračniega motorja. In sicer se mi dogaja, da program v IF/ELSE zanki obravnava negativno število kot pozitivno število ... zadevo sem preveril tako, da sem število izpisal pred in po klicanju IF zanke, kjer imam pogoj >=0, izpisano število je bilo v ebeh primerih negativno, zanka pa se je vseeno izvedla.
Za programiranje uporabljam CCS prevajalnik.
Je imel že kdo podobne prebleme, oziroma pozna celo rešitev problema? _________________ LP,
Boštjan |
|
Nazaj na vrh |
|
 |
b0j3 Član

Pridružen-a: Sre 07 Apr 2004 19:52 Prispevkov: 117 Aktiv.: 0.49
|
Objavljeno: Sre Sep 21, 2005 7:47 am Naslov sporočila: |
|
|
Če lahko, uporabi za spremenljivko signed int.
Če to ne gre, boš moral gledati zadnji (MSB) bit števila. Če je 1, gre za negativno število. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70829.99
|
Objavljeno: Sre Sep 21, 2005 11:04 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
mehatronik Član

Pridružen-a: Tor 28 Dec 2004 8:28 Prispevkov: 16 Aktiv.: 0.07 Kraj: Šenčur, EU
|
Objavljeno: Sre Sep 21, 2005 12:18 pm Naslov sporočila: |
|
|
Inicializacija na začetku:
int16 perioda, cakaj;
int16 position=0; // polozaj motorja
Del kode:
printf("\r\n Zacetni polozaj: %ld", position);
if(position>=0) // POZITIVNO PODROCJE
{
printf("\r\n Zacetni polozaj: %ld", position);
if(position>=0) // POZITIVNO PODROCJE
{
printf("\r\n Pozitivno podrocje");
if(direction==1) // PREMIK V ISTO (POZITIVNO) PODROCJE
{
...
Čeprav mi program izpiše, da je npr. position = -500, še kljub temu izvede prvi IF stavek, ki zahteva položaj >= 0, in še enkrat izpiše position = -500 _________________ LP,
Boštjan |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Sep 21, 2005 1:27 pm Naslov sporočila: |
|
|
Ti moraš že deklarirat spremenljivke tako, da bo prevajalnik upošteval negativna števila:
signed int16 position = 0; |
|
Nazaj na vrh |
|
 |
mehatronik Član

Pridružen-a: Tor 28 Dec 2004 8:28 Prispevkov: 16 Aktiv.: 0.07 Kraj: Šenčur, EU
|
Objavljeno: Sre Sep 21, 2005 2:15 pm Naslov sporočila: |
|
|
NeoTO je napisal/a: |
Ti moraš že deklarirat spremenljivke tako, da bo prevajalnik upošteval negativna števila:
signed int16 position = 0; |
Sem probal, pa ni nič pomagalo ...
Počasi se mi dozdeva, da gre za napako prevajalnika ...
Hvala VSEM za odgovore! _________________ LP,
Boštjan |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Sre Sep 21, 2005 3:14 pm Naslov sporočila: |
|
|
Kaj pa če bi preverjal position kot int, in sproti še MSB bit?
Nekako v stilu:
#define MSB position,7
if((position >=0) && (MSB != 1)) _________________ If in doubt about performance disassemble your code and try to follow it. If you get bored then the CPU probably will too... |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Sep 21, 2005 4:07 pm Naslov sporočila: |
|
|
Malo čudno se mi tole zdi. Tudi sam uporabljam CCS-ov prevajalnik in naslednji program čisto normalno dela:
Koda: |
void main()
{
signed int bit8 = 0;
signed int16 bit16 = 0;
bit8 = -12;
bit16 = -12;
output_b(0);
if (bit8<0) output_high(PIN_B0);
if (bit16<0) output_high(PIN_B1);
if (bit8>=0) output_high(PIN_B2);
if (bit16>=0) output_high(PIN_B3);
bit8 = 12;
bit16 = 12;
if (bit8<0) output_high(PIN_B4);
if (bit16<0) output_high(PIN_B5);
if (bit8>=0) output_high(PIN_B6);
if (bit16>=0) output_high(PIN_B7);
}
|
Prižgejo se izhodi 0, 1, 6 in 7 na B portu. |
|
Nazaj na vrh |
|
 |
mehatronik Član

Pridružen-a: Tor 28 Dec 2004 8:28 Prispevkov: 16 Aktiv.: 0.07 Kraj: Šenčur, EU
|
Objavljeno: Sre Sep 21, 2005 5:28 pm Naslov sporočila: |
|
|
Živjo!
Kodo sem malce predelal, da mi ni bilo trebe sestavljati dodatnega vezja, in jo vstavil v moj program ...
Koda: |
signed int bit8 = 0;
signed int16 bit16 = 0;
bit8 = -12;
bit16 = -12;
// output_b(0);
if (bit8<0) printf("\r\n bit8<0"); // output_high(PIN_B0);
if (bit16<0) printf("\r\n bit16<0"); // output_high(PIN_B1);
if (bit8>=0) printf("\r\n +napaka8"); // output_high(PIN_B2);
if (bit16>=0) printf("\r\n +napaka16"); // output_high(PIN_B3);
bit8 = 12;
bit16 = 12;
if (bit8<0) printf("\r\n -napaka8<0"); // output_high(PIN_B4);
if (bit16<0) printf("\r\n -napaka16<0"); // output_high(PIN_B5);
if (bit8>=0) printf("\r\n bit8>=0"); // output_high(PIN_B6);
if (bit16>=0) printf("\r\n bit16>=0"); // output_high(PIN_B7);
|
Program mi v prvem delu lepo javi, da sta bit8 in bit16 <0, nato pa v isti sapi javi, da je bit16 hkrati >=0 (izpiše: +napaka16)!!! Naprej ni več problemov, saj spremenljivkama priredimo pozitivni vrednosti.
Očitno ima program probleme s 16 bitnimi negativnimi vrednostmi?! _________________ LP,
Boštjan |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Sep 21, 2005 8:52 pm Naslov sporočila: |
|
|
Poglej malo, kaj dela assemblerska koda. V takšnih primerih največkrat najdem napako ravno tam.
Če ti pa to ne pomaga, pa si poskusi dobiti novo verzijo CCS prevajalnika. Jaz imam verzijo 3.227. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|