www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Negativna števila

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
mehatronik
Član
Član



Pridružen-a: Tor 28 Dec 2004 8:28
Prispevkov: 16
Aktiv.: 0.07
Kraj: Šenčur, EU

PrispevekObjavljeno: Sre Sep 21, 2005 7:36 am    Naslov sporočila:  Negativna števila Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
b0j3
Član
Član



Pridružen-a: Sre 07 Apr 2004 19:52
Prispevkov: 117
Aktiv.: 0.49

PrispevekObjavljeno: Sre Sep 21, 2005 7:47 am    Naslov sporočila:   Odgovori s citatom

Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70830.68

PrispevekObjavljeno: Sre Sep 21, 2005 11:04 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mehatronik
Član
Član



Pridružen-a: Tor 28 Dec 2004 8:28
Prispevkov: 16
Aktiv.: 0.07
Kraj: Šenčur, EU

PrispevekObjavljeno: Sre Sep 21, 2005 12:18 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Sre Sep 21, 2005 1:27 pm    Naslov sporočila:   Odgovori s citatom

Ti moraš že deklarirat spremenljivke tako, da bo prevajalnik upošteval negativna števila:

signed int16 position = 0;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mehatronik
Član
Član



Pridružen-a: Tor 28 Dec 2004 8:28
Prispevkov: 16
Aktiv.: 0.07
Kraj: Šenčur, EU

PrispevekObjavljeno: Sre Sep 21, 2005 2:15 pm    Naslov sporočila:   Odgovori s citatom

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 ... Sad

Počasi se mi dozdeva, da gre za napako prevajalnika ...

Hvala VSEM za odgovore!

_________________
LP,
Boštjan
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Sre Sep 21, 2005 3:14 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Sre Sep 21, 2005 4:07 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mehatronik
Član
Član



Pridružen-a: Tor 28 Dec 2004 8:28
Prispevkov: 16
Aktiv.: 0.07
Kraj: Šenčur, EU

PrispevekObjavljeno: Sre Sep 21, 2005 5:28 pm    Naslov sporočila:   Odgovori s citatom

Ž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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Sre Sep 21, 2005 8:52 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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