Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Vagy 3 szilicium dioda sorban (ha mar ganyolunk -- ehhez en ugyis ertek )
Hát ha egy 3.3V-os stabilizátorhoz nincs 3 kondija, akkor valószínű hegyekben áll nála a zéner meg sziliciumdióda..
Idézet: „Ha jól értettem, a stabilizátor típusával volt gond, de az nem feltétlenül jelenti azt, hogy alapvető alkatrészek nincsenek kéznél.”
Sziasztok!
Kérdésem lenne hogy egymás után ASCII formátumban érkező számokat hogyan tudok egy számként kezelni? pl. egymás után jön 2 / 3 / 5 / 0 / 3 nekem ezt egybe kéne valahogy rakni, hogy 23503 legyen. Lehet hogy láma kérdés, de ezen elakadtam... köszi
A megfelelő karakter alaki értékét megszorzod a helyiértékével és egy változóban összeadod...
Sajnos tudtommal csak ez a favágómódszer van A változó byte számát a várható értéknek megfelelően kell megválasztani és az összeadás is több byte-os! Steve
Köszi, akkor nekiállok ha nincs egyszerűbb módja..
Persze az a kérdés, hogy mire akarod használni? Például BCD kódban csak be kell pakolnod az ASCII-ből átalakított nibble-ket és BCD aritmetikával dolgozhatsz a számmal!
Steve
A következőt kéne összehoznom:
GPS modul soroson küldi a koordinátákat (NMEA GPRMC mondat) ASCII formátumban. A koordináta formátumát át kell számolnom, osztanom kell 60 al (6 al), de ehhez egyben kéne kezelni a sorosan jövő adatokat. Pl 47,23503. A megfelelő formátum kiszámolásához a tizedes utáni számot (23503) el kell osztanom 60 al, vagy 6 al ( a tizedest már oda teszem ahová akarom..) eredmény = 47,39171 Ezt az új koordináta formátumot pedig tovább kell küldenem egy GSM modullal. Minden működik csak a koordinátát kéne valahogy átszámolni, de ezen a dolgon nagyon elakadtam.
Vagy ha C ben programoz, akkor atoi -függvénnyel.
Nem tudom milyen PIC-et használsz, tudsz-e valamilyen nagyságrendben osztani és a rászánható időt sem ismerem. Én most azt csinálnám, hogy a tizedesvesszőt tolnám, hogy csak hattal kelljen osztani. A hattal osztás meg ciklikus kivonás. Eltolva 9999 a legnagyobb szám, ami hattal osztva 1666 ( és 0,5). A kivonások számát megszámolva tudod az eredmény néhány ms alatt! Én nem is alakítanám át, hanem helyiértékenként nézném ( H3 - H1 a helyiértékek!):
9171 ( a te példád) /6= 9-6=1 H3=1 marad 3<6 (a 3 a köv. helyiértéken 30! ) 31-6=25 H2=1 marad 25>6 25-6=19 H2=2 marad 19>6 19-6=13 H2=3 marad 13>6 13-6=7 H2=4 marad 7>6 7-6 =1 H2=5 marad 1<6 ( az 1 10 a köv. helyiértéken!) 17-6=11 H1=1 marad 11>6 11-6 =5 H1=2 marad 5<6 51-6=45 H0=1 marad 45>6 ... . . . H0=8 marad 3<6 Végeredmény: H3H2H1H0= 1528 Ez is járható út! Steve
Nem hiszem, hogy C-ben ennyit kinlódna az osztással!
Steve
Hát ha asm -ben kínlódik lebegő pontos számokkal, meg sztringekkel akkor meg is érdemli (ez olyasmi hogy neki lehet állni egy szál baltával hajót építeni, de mennyivel egyszerűbb ha van egy hajógyárunk)
Sajnos asm. - ben kínlódom, a C vel nem próbálkoztam még sosem.. Az osztáshoz Watt oldalán találtam egy példát, azzal meg tudom oldani remélem. A PIC egy 16F628A.
Hattal osztás kivitelezhető úgy, hogy X/6=X/4-X/8+X/16-X/32+X/64-... Ezek pedig valójában egyszerű jobbrashiftelések és összeadás/kivonás. Talán ez a leggyorsabb módszer rá.
Az előző példám nem túl nehezen programozható le ( nem néztem Watt oldalát, ha az szerinted egyszerűbb, akkor azt csináld!)!
Steve
Nem, ez számomra lényegesebben egyszerűbb mint Watt osztás rutinja. Köszi, ezt megpróbálom. Első ránézésre nem is tűnik olyan vészesnek.
Ez pedig kimondottan jó, csak a számnak bináris formátumban kell rendelkezésre állnia!
( a hiba nagysága itt maximum az utolsó tag lehet, ha jól emlékszem!) Steve
Azért vigyáz, mert a maradékot tízszerezni kell, de mivel az kisebb, mint hat, ezért egyszerűen megszorzod nyolccal és még hozzáadod a kétszeresét ( ezek itt tényleg shiftelések és nem lesz túlcsordulás !) vagy "csak" 10-szer összeadod!
Használd a szimulátort a megoldásod ellenőrzésére! Steve
Ez még egyszerűbbnek tűnik.
Köszönöm mindenkinek a segítséget, innen már remélem elboldogulok valahogy! (ha mégsem akkor kérdezek.. )
Vigyázz vele, mert az osztás csak bináris számnál shiftelés, Neked jelenleg nem olyan a számod ( ezzel a módszerrel visszajutottunk a kiinduláshoz, azaz át kell alakítani ! ) !
Steve
Ezek szerint az ASCII formátumot binárisba kell konvertálnom. Ha jól tudom az ASCII felső nibble je (0 - 9 ig) azonos, az alsó négy bit hordozza a lényeget. Ezt meg csak megoldom valahogy.
Nem ennyi a feladat!!!
Az ASCII kódnál az alaki érték mellett a helyiértékekre is szükséged van, hogy egy sok byte-os bináris számot kapj ( nem csak egymás mellé kell tenned a nibble-ket!!) ! A sok byte-os számot is lehet shiftelgetni, de először az átalakítás, majd a helyiértékenkénti öszeadogatás a shifteléssel... Te tudod! Ezt a bináris átalakítást írtam le legelőször! Várom az eredményt! Steve
Köszönöm az infókat, átgondolom és nekiülök próbálgatni. Nem lesz könnyű falat úgy érzem. :no:
Jó kis oldal..köszi! (Csak pont az nincs ami kéne, mint általában) De tényleg sok hasznos dolog van.
Azért nem oda tettem ezt a kérdést, mert nem először használtam hőlégfúvót alkatrészkiszedéshez, és eddig még soha semmi probléma nem volt.
Egyébként meg hőfokszabályzós hőlégfúvót használok, csak annyira állítom be amennyire épp szükséges a kiforrasztáshoz.
Nem tudom, hogy elfelejtette-e, de, hogy tönkrement az biztos.
"miért forrasztottad ki ?" Egyszerűbbnek tartottam, úgy voltam vele, így tuti nem csinálok zárlatot valahol, meg nem kavar be a többi áramkör. Először azt hittem valamit rosszul kötöttem be a próba során, de most néztem át 20-adjára és tuti mindent jó volt. Vss : - Vdd: +5V Mclr: +12V Rb7: Pgd Rb6: Pgc Az adatlapján fel van tüntetve a max. hőmérséklet, amit elvisel? Én nem találtam. Az írás védelemmel úgy voltam, hogy egy próbát megér, hátha nincs rajta, ugyanis elég fontos lenne kinyerni belőle a HEX fájlt. Úgy is fogalmazhatnék nem az izgat, hogy elszállt a PIC, ha meglenne a hex az nemkicsit kárpótolna. üdv
Még kivonásokat sem kell alkalmazni, ha felírod az osztó konstans reciprokának "kettedestört" alakját, és ebből veszed a törtrész valamennyi értékes jegyét. Ahol ebben a sorozatban 1 van, ott hozzáadod az eredményhez az osztandót, ahol 0, ott meg nem. Persze a ciklusban az osztandót mindig léptetni kell jobbra a sorozatban lévő minden egyes következő jegy megvizsgálása előtt. Ez tulajdonképpen egy bináris szorzás.
1/6 ~= 0.001010101010101010 (2) 16 értékes jegyre, ezt úgy célszerű felhasználni, hogy a bal oldalon lévő nullákat elhagyjuk, tehát a "1110101011011011" sorozattal számolunk. A három nulla elhagyásával tulajdonképpen 8-szorosára növeljük a szorzót (amit az osztó reciprokából nyertünk), gyakorlatilag az eredeti szám 8/6 részét fogjuk így kiszámolni. A végeredmény igazítása majd egyszerű jobbra shiftelésekkel történik. 23503 = 0101101111001111 (2)
Ha az utolsó sorban szereplő végeredményt 3-mal jobbra toljuk, akkor 0000111101001100 (2) lesz belőle, ami megfelel 3916-nak. 23503/6=3917.1666..., tehát egész jól sikerült kiszámolni, ha a jobbra shiftelésnél az utolsó kiléptett bitet hozzáadjuk az eredményhez (kerekítés), akkor a 3917 még pontosabb közelítés lesz. Egyébként észrevehető, hogy az 1/6 speciális alakja miatt lehetne olyan ciklust szervezni, ami minden futáskor hozzáadja az eredményhez az osztandót, majd kettővel shifteli az osztandót jobbra. Ha csak konstans 6-tal való osztást kell alkalmazni a progiban, akkor én ezt csinálnám. A számjegyekből bináris szám előállítása során szükség van egy 10-es szorzásra, ezt szintén tologatással és összeadással kell megvalósítani: egy érték eggyel balra tolt (2-szeres) és hárommal balra tolt (8-szoros) módosulatát összeadva megkapjuk az érték 10-szeresét.
Sziasztok
Van egy kis elektronikai kütyüm amin van egy PIC és többek között Sorosan is küldene ki adatot. C18-ban programozom és nem akar működni az adatküldés. Egy másik eszközzel kommunikál és a fogadás már összejött. Arra gondoltam hogy ti eltudnátok dönteni hogy a kóddal van a gond, vagy esetleg hardveres gond van, tehát a PIC lába egy mérés következtében rövidre lett zárva és tönkre ment az USART kimenete. Bemásolom a kód ide eső részét ha láttok vmi hibát kérlek jelezzétek:
Ettől eltérő kódokat is kipróbáltam már, de eddig nem tudtam rávenni hogy küldjön ki adatot. Oszcilloszkóppal ellenőrzöm az adatkiküldést. Amennyiben a kódra azt mondjátok hogy nem láttok benne hibát akkor hardver gond van. Csak sajnos most nem tudok egy PIC cserét végrehajtani teszt céljából. Köszi előre is a segítségeteket. István |
Bejelentkezés
Hirdetés |