Fórum témák
» Több friss téma |
A bcd-decimál átalakítót nyugodtan kösd rá közvetlenül
a pic lábaira . Ha decimális adat jön ki a picből (és jó a program) akkor nem lesz lebegő láb ..
Köszönöm ez jó hír.. Nálam csak 4800 al megy a GPS és a GSM is, ezek szriont nem lehet gond. Valami szűrést tettél valamelyik oldalra? Soros induktivitás, valami kis értékű kondi a gnd felé...stb? Vagy nem kell? Hogy kéne ezt "jól csinálni"..?
Üdv!
Van ez a kivonás: Bővebben: Link Az lenne a kérdés, hogy minek bele a btfss STATUS,C incfsz SourceH,W sorok, elvégre ahogy tapasztaltam, hogy ha a kivonandó nagyobb mint a kivonó (az eredmény pozitív), akkor mindig 1-et ad a Carry bit, tehát átugorja az incfsz utasítást. Ha meg kisebb (az eredmény negatív szám lenne), akkor meg hülyeséget kapok eredményül. Vagy milyen esetben lehet még 0 a Carry bit? Pl.: 20760-36502=-15742, és ehelyett 49794-et ad. Holott azt várnám, hogy ugyanazt adja vissza, csak pozitívba, vagy ha belefér a tartományba, akkor jelezze a legfelső bittel az előjelet. Mert ha kiveszem a két sort, akkor csak 256-tal kapok többet eredményül, mintha benne hagytam volna. Valaki fel tudna világosítani?
Igazad van, nekem is 4800-zal ment. Nem volt rajta semmi szűrés, simán ment a kábel az RX/TX lábra. (Persze a GPS-modulon belül valószínűleg volt szűrés gyárilag.) Egyébként én egy régi PMB-248-as GPS-szel csináltam.
Idézet: Emlékeim szerint kivonáskor fordítva működik a dolog, tehát NEM ugorja át. „akkor mindig 1-et ad a Carry bit, tehát átugorja az incfsz utasítást.”
Pedig szimulátor szerint átugorja.
Pl. 8-ból 2-t vonok ki akkor a Carry = 1, de ha 2-ből 8-at vonok ki, akkor a Carry 0. Idézet: „Pl.: 20760-36502=-15742, és ehelyett 49794-et ad...” Az eredmény teljesen jó, mivel a legfelső bitje 1, azaz negatív a szám és 65536 - 49794 = 15742. Idézet: Akkor mi is a probléma? Akkor van áthozat, amikor a Carry bit 0, mert akkor nem ugorja át az inkrementáló utasítást. „Pl. 8-ból 2-t vonok ki akkor a Carry = 1, de ha 2-ből 8-at vonok ki, akkor a Carry 0.”
Szép estét minden kedves fórumozónak!
Szeretnék építeni egy labortápot és nagyon meg tetszett egy PIC-es panelmérő, csak nincs hozzá HEX fájl)én legalábbis nem találom). Az lenne a kérdésem, hogy valakinek talán meg van-e? Nagyon jó lenne, mert egyszerű és nagyszerű! ITT VAN-NI Köszönöm szépen előre is! mhatyalyak
Igazad van, közben már én is rájöttem, hogy a negatív számokat máshogy ábrázoljuk, nem csak kibiggyesztjük elé az 1-est (régen tanultam már a számábrázolást). Bár lehet az én esetemben pont nem ilyen megoldásra van szükség, mert csak két szám különbsége kellene előjel nélkül. De még át kell gondolnom.
Már semmi, csak annyi volt a probléma, hogy fordítva írtad.
Én ezt írtam: Idézet: „ha a kivonandó nagyobb mint a kivonó (az eredmény pozitív), akkor mindig 1-et ad a Carry bit, tehát átugorja az incfsz utasítást.” Te meg erre ezt: Idézet: „kivonáskor fordítva működik a dolog, tehát NEM ugorja át.” Pedig átugorja. Kivéve negatív eredménynél.
Szia!
Még egy byte- ot használni vagy az eredmény összes bitjét megálni és 1 -et hozzáadni, ha a legfelső bit 1.
Köszi ezt észre sem vettem, hogy a kettes komplemens visszaadja az eredetit.
De ahogy feljebb írtad egyszerűbben is meg lehet csinálni kivonással (65536-eredmény):
Ez 2 utasítással kevesebb, ha minden igaz működnie kell, de még nem teszteltem le.
Javítok: csak 1 utasítással kevesebb, de nálam most számít a sebesség.
De nem kezeli a lehetséges átviteleket...
És ezt hogy kell benne értelmezni?
incf comf eredmenyH,f Ezt most csak elírtad, vagy lehet benne ilyet is csinálni? Ez most 1 vagy 2 utasításnak számít? Minek veszed még egyszer az eredmenyH negáltját, ha már előtte negáltad? És milyen átvitelre gondolsz? Példát tudsz mondani amit rosszul fog kiszámolni?
Elírtam... Abba a sorba nem kell a comf, csak
incf eredmenyH,f
Ne baj, én is elírtam a subwf-et, mert nem lehet betenni közvetlenül az eredménybe, előbb ki kell rakni a W-be, tehát akkor meg már lassabb lesz.
Idézet: Valószínűleg csak félig olvastam el a mondatodat: "ha a kivonandó nagyobb...", s erre válaszoltam. „Már semmi, csak annyi volt a probléma, hogy fordítva írtad.” A félreértést tisztázandó, az "a - b" műveletben b a "kivonandó" a pedig a "kisebbítendő". Szerintem ezért nem értettük egymást.
Szia!
Idézet: „Példát tudsz mondani amit rosszul fog kiszámolni?” Ha az eredmeny változó 0xFF00 értékkel indul, akkor a decf eredmeny,W átvitelt generál. Ez itt inkább decf eredmeny,f akarna lenni, akkor 0xFFFF keletkezne az eredményben. Ha a magas és az alacsony byte -ból is levonunk 255 -öt, 0 -t kapunk, pedig a helyes eredmény 0x100 azaz 256.
Szia!
Egy LCD-re szeretném egy regiszter értékét kiírni, de nem tudom pontosan hogyan kell osztani a számot a megfelelő helyi értékekhez. A gondom a következő: ha mondjuk a tízes helyiérték kell, akkor el kell osztani 10-el, de ha a szám több mint kétjegyű volt, akkor az eredmény sem egyjegyű lesz... hogyan lehet az osztás eredményeként csak a legkisebb helyiértéket megtartani (mikro)C-ben?
Szia!
Nem használon a mikro C -t. De C -ben van szöveggé konvertáló rutin (a printf ugyan szószátyár, de talán van itoa vagy hasonló). Keress a topikban, feltöltöttek már jónéhányat... Indulj hátulról. Vedd az eredeti számot és tedd egy másik változóba. Cilkus: Vedd a szám 10 -es modulóját. Jegyezd meg a számjegyet. Lépj a nagyobb helyiértékre. Oszd el a számot 10 -zel. Ha a szám még nem 0, menj a ciklus elejére. A legnagyobb helyiértéktől kiindulva írd ki a számot...
Ebben a hozzászólásomban ismertettem azt a függvényt, amit én használok. Nem MikroC, de ez most lényegtelen.
Idézet: „A gondom a következő: ha mondjuk a tízes helyiérték kell, akkor el kell osztani 10-el, de ha a szám több mint kétjegyű volt, akkor az eredmény sem egyjegyű lesz... hogyan lehet az osztás eredményeként csak a legkisebb helyiértéket megtartani (mikro)C-ben?” Maradek kepzessel szokas ezt csinalni, azaz a % jellel... Tehat a "szamjegy = szam % 10;" 0-9 megadja neked a legutolso szamjegyet. Valami ilyesmi fuggvenyt tudsz irni, csak at kell alakitanod a sajat igenyeidnek megfeleloen (pl string buferbe helyezes helyett az LCD-re kozvetlen kiirod jobbrol-balra pozicionalgatassal)
De amugy meg hasznald az itoa fuggvenyt vagy printf / sprintf, lehet azok jobban optimalizaltak, mint ez, es meg csak fel sem kell talalnod hozza a Spanyol viaszt...
Sziasztok.
Olyan problémám van, hogy van egy 4x7 szegmenses kijelzőm és azt szeretném úgy vezérelni hogy a programban soros vonalon kap egy számot a PIC majd azt kiírja a kijelzőre. Tehát a valós problémám az hogy a kapott számot hogy tudnám felbontani majd így egyesével a kijelzőre vinni. Írtam már olyan programot, hogy gombnyomásra fel-le lépteti a számokat, de ott nem kellett különösebb trükk. Tehát a kijelzéssel nem lesz problémám, csak maga a szám felbontása jelent problémát helyiértékekre. Valaki tud ebben nekem segíteni? Vagy van valakinek egy forráskód részlete? (C nyelven programozok)
Szia!
Szóval ha osztás helyett a %-jelet használom, akkor írhatok, 10-et, 100-at, 1000-t is, az utolsó számjegyet fogom megkapni az osztásból, ami nekem kell? A kiírást pl így gondoltam: lcd_out(1,1,48+[a kiírandó érték]), vagyis lcd_out(1,1,48+változó % 10). Ha az egyesek kellenek, akkor ezt írjam: "változó % 1"? Bocs, de még csak ismerkedek a programozással. Kösz a választ mindenkinek.
Szia!
Idézet: Ennek nincs sok értelme, minden egész szám osztható 1 -gyel, így az eredmény mindig 0.„"változó % 1"” Idézet: „...szóval, ha osztás helyett a %-jelet használom, akkor írhatok, 10-et, 100-at, 1000-t is...” Nem. A tizes számrendszerben a legutolsó helyiértéken mindig a szám % 10 érték áll. A tizesek helyén levőt nem a szám % 100 alakban kell felírni, hiszen ennek eredmény kétjegyű, hanem (szám /10) % 10 - egész osztást alkalmazva. Az százas helyiértékre (szám /100) % 10. Szegény kontroller már megint csak oszt és oszt... Helyiértékek számának kétszerese -1 osztást végez el. Már többször linkeltem egy léptetős - korrigálós megoldást, ahol nincs egyetlen osztás sem... |
Bejelentkezés
Hirdetés |