Fórum témák
» Több friss téma |
Sziasztok, Lenne egy kérdésem a tapasztaltabb PIC-es kollégákhoz. Adott egy futópad kontrollere PIC16F723 vezérli a motorokat. Valaki már piszkálta előttem, cserélt benne látszólag PIC-et + kvarc-ot ??? van egy etalon panelem ICSP konnectorral, meg K150 égetőm. Viszont a jó-ból sem tudom a PIC tartalmát kiolvasni. Az látszólag legalább működik, mert bekapcsoláskor behúzza a reléket, hallatszik. Akkor is, ha a programozóval megszólítom, viszont csak 0000-k vannak mindenhol. Minden ötletet köszönök! Üdv: Mike
Minden bizonnyal azért nem tudod kiolvasni a tartalmát, mert a kódvédelem be van kapcsolva. Ennyi, nincs tovább. Bár, mintha valahol azt olvastam volna, hogy valahogy ki lehet kényszeríteni belőle a programot, de lehet, hogy csak hallucinálok.
Lehet, hogy viccnek gondolod, de én teljesen komolyan kérdezem.
Biztosan létezik valamilyen számolási mód mellyel meg lehet állapítani, hogy mennyi memóriára van szükségem az esetleges adataim tárolására. Mivel az adatok rugalmasak és változnak így nem tudom meghatározni mekkora memóriát kellene használnom, hogy elég legyen mindenre. De, hogy képbe kerüljetek milyen adatokat akarok tárolni egy példát mondanék: Egy hőprofilt szeretnék tárolni aminek több mezője is lenne: 1. név, 2. 150, 3. 320 . . . 8. 660 Tehát számokat és betűket egyaránt kellene tárolnom nyilván egy meghatározott sorrendben. Ennek kapcsán kérdezném, hogy van e valami számolási módszer amit alkalmazhatnék, hogy a memória pontos vagy kisebb nagyobb pontossággal meghatározzam a méretét. Tehát, hogy egy karakter mennyi helyet foglal, 1 szám mennyi helyet foglal, 1kb-ba mennyi karakter vagy szám fér el...stb Biztos van erre egy egyetemes szabály... vagy nincs?
A mikrokontrollerek igazábol csak számokkal tudnak dolgozni.
Nézzük például a nevet. Ha megelégszel három karakterrel, akkor minden karaktert helyettesítesz egy számmal. Mivel a magyar ABC 44 betűből áll, így egy betűre max. a 43-as szám jut (0-val kezdődik). Ezt egy bájton már el lehet tárolni, három karakterhez három bájt kell. Most jönnek a számok. Ha egy szám meghaladhatja a 255-öt de kissebb, mint 65 281, akkor annak tárolásához két bájtot kell felhasználnod, mivel a mikrokontrollerek EEPROM-jai bájtonkénti elrendezésűek. Egy bájt max. értéke 255 lehet. Ha van nyolc számadatod egy névhez, akkor 16 bájtnyi hely kell neked. A karakterek három bájtja, plusz az értékek 16 bájtja = 19. Egy középkategóriás mikrokontrollerben 256 bájtnyi EEPROM található, tehát ebbe 13 adatsor fér bele, plusz marad egy kicsi. Az EEPROM-hoz hozátartozik az a tény is, hogy nem lehet végtelenszer írni, viszont cserébe megtartja a tartalmát akkor is, ha kikapcsolod a kontollert. Ha a RAM-ban tárolod az adatot, akkor nagyságrendekkel tovább bírja a kontroller (elméletileg végtelenszer), cserébe viszont csak addig, amíg ki nem kapcsolod az egészet. Viszont, viszonylag olcsón lehet kapni viszonylag nagy RAM-mal rendelkező mikrokontrollereket, pl.: PIC18F14K22. Természetesen vannak ettől jóval nagyobb memóriájú PIC-ek is. A hozzászólás módosítva: Ápr 11, 2014
Már értem a problémádat.
Egy karakter, alapesetben egy bájt. Mostanában ASCII kódolást használunk, főleg mikrokontrolleres környezetben. Hátránya, hogy legfeljebb 256 különböző karakterből állhat a szöveg. A számokat binárisan, vagy szövegként tároljuk. A bináris tárolás a pontosságtól, illetve a legnagyobb értéktől függ, így lehet 1,2,3,4,8 bájt. A kihagyott számok gyakorlatilag nem használtak. Ha szöveget akarsz tárolni, két lehetőséged van. Fix hosszúságú, vagy változó hosszúságú szöveg a választék. Fix hosszúság esetén annyi bájt kell egy szövegnek, amennyi a leghosszabb szöveg hossza. Ezt meg kell szorozni a a szövegek számával. A módszer előnye, hogy egyszerűen programozható. Akkor érdemes használni, ha nagyjából azonos hosszúságú szövegeid vannak. Változó hosszúság esetén vagy a szöveg hosszát tárolod, vagy a szöveg végére teszel jelölést. Ilyenkor 1-két bájt többlet kell szövegenként.
A környezet amiben majd használom mert ezt elfelejtettem megemlíteni: PIC18F4550 és ehhez menne valami SPI memória aminek majd a méretét akarom kiszámolni, hogy ne legyen se túl nagy se túl kicsi.
Ha ilyen külső memóriát használok pl: 25LC640A-I/P ahhoz, hogy megtartsa a memóriát kell hozzá elem? A PIC memóriáját nem akarom használni mert elég nagy programot tervezek és kell a hely.. Tehát ha jól értem. 1 bájt = 8bit számban maximum 256-ot tud tárolni karakterben (betűben) meg csak 1-et? Ha viszont a szám nagyobb mint 256 de kisebb mint 512 akkor már 2bájt-ot fog foglalni? A PIC nem fog magának le a memóriából az olvasás és írás miatt? ui: a szövegek mivel max 20karakteres az LCD méretem így maximum 20karakternyiek lesznek. A számok pedig 1-től maximum 500-ig fog menni, hogy 2bájt-ba beleférjek és felesleges is több. A hozzászólás módosítva: Ápr 11, 2014
Szia, Rémlik nekem is valami az olvasásvédelemről, megpróbálok komolyabban rákeresni. Köszi! Üdv: Mike
- Két bájt az nem 512-ig számol, hanem 0-65535-ig (he előjel nélküli...)
- 20 karakteres litániákat nem hiszem, hogy érdemes lenne eltárolni. Ha program állította elő (máshonnan honnan is lenne?) akkor elég visszaolvasáskor generálni. - Ha EEPROM-ot akarsz venni, akkor 1 Mbit (128 kB) a plafon a Microchip kínálatában. Ha eldöntöd. hogy milyen gyakorisággal tárolsz és egy feljegyzéshez hány bájt kell, akkor kiderül, hogy mennyi idő alatt telik meg. - Megfontolandó, hogy SPI vagy I2C legyen (ha más soros eszközt is használsz, ahhoz kell igazodni...)
Köszönöm a kiigazítást.
20karakter: Itt előre kell majd beállítani az egyes programokat. A programok opcionálisak lesznek, tehát aki használja majd annak kell beállítani egy 4x4-es matrix gombsorral az értékeket. Minden egyes programnak lesz egy neve és ahhoz sorakoznak az adatok. A beírás követően elmenti a beállítást vagy is elmentődik a memóriába a beállított profil és ez így fog szépen majd egymás után tárolódni egészen addig ameddig én akarom vagy amíg a memória el nem fogy. (nyilván itt lesz korlát) Tehát kellene a 20karakteres név. Az eltárolási folyamat jó esetben egyszer lesz, de nyilván ha nem jó a beállított érték akkor szükség lesz majd a szerkesztésre vagy törlésre. Gondolom itt a szerkesztés lesz majd a jobb mert a törlés után megüresedik az a rész és az összes többi utánit feljebb kellene helyezni. Nah mindegy ez már majd kiderül és le lehet programozni ha muszáj. SPI porton keresztül lenne használva, de persze emellett még majd a szenzorok is azon fognak lógni szóval itt kell majd a chip select. Vagy nem jó a gondolat menetem? Úgy számolom, hogy kb. elnagyolva is 400bajt-ra lesz szükségem, így még sem kell félnem, hogy nem férek bele egy kisebb memóriába
Nem tudjuk még, hány különböző nevet akarsz eltárolni, és az honnan kerül a kontrollerbe.
Az biztos, én nem számolgatnék, a legnagyobb, a büdzsébe még beleférő EEPROMot venném. Az adatfelépítés is érdekes, pont túllépi a kerek számokat. 20 karakteres névhez 6 darab szám tárolható 32 bájton. Ha kettővel rövidebb lesz a név, akkor 32 bájtos adatsorokkal szépen ki lehet használni a memóriát. Ha kell a 20 karakter, akkor lehet, hogy az egyszerűség, és rugalmas struktúra érdekében 64 bájtos darabokra osztanám fel, így a 20 karakter mellé még 22 darab szám elfér. Ha a nevet szépen léptetjük,forgatjuk , mondjuk másodpercenként, akkor a 20 karakter lehet több is.
A program helyet 10-re akarom lekorlátozni mert felesleges több.
Tehát 10 név és a hozzátartozó adatok (6 szám) lesznek. Igen ez igaz..lehetne léptetni, forgatni is egy sorban. Had kérdezzem meg, miért irtóztok a karakterek mentésétől? 1 karakter 1 bájt, ha 20 karaktert akarok eltárolni az 20bájt lesz vagy is 20x8bit. A pazarlás miatt mondjátok, hogy inkább itt valami olyasmi jön képbe amit én még nem tudok vagy nem értek? Tehát itt a 8-16-32-64 bájtos blokkokra kellene beállítani az adatsorokat? Még egyelőre csak az elmélet olyan fázisban létezik a fejembe, hogy szeretném memóriában tárolni az adatokat, de a hogyan még nem ismerem így minden tanácsot szívesen veszek. Igazából soha nem csináltam még ilyesmit, de mindent el kell egyszer kezdeni ![]() Ez lehet alap kérdés, de nem értem miért számít, hogy 32 vagy 64bájtos legyen az egy adatsor? Könnyebb kezelni, ha 8-16-32-64-es struktúrákban van eltárólva?
Valószínűleg a pazarlásnak gondolják a 20 karaktert, de ha a vevő ezt kéri, ezt kell neki adni. 20 karakter, 20 bájt, 6 szám, 12 bájt. Összesen 32 bájt / adatösszeg. Nem számít, hány bájtos egy adatsor, lehet 13 is, ha neked úgy tetszik. Felesleges felkerekíteni 16-ra, mert így minden egyes adatsoron 3 bájtot buksz a semmibe.
A tárolási cím kiszámítása egy nagyságrenddel könnyebb, gyorsabb, ha szorzás helyett mondjuk léptetéssel, vagy összeadással állítjuk elő. Én ezért preferálom a 2 hatványait rekordhosszúságnak. Engem nem zavar a karakterek mentése!
![]() A nagyobb memória előnye, hogy a később előjövő probléma nem okoz olyan fejtörést, amit hardver módosításával lehet orvosolni. Egy kétszeres tárhely nem sokkal drágább. Ez főleg akkor érvényes, ha nem látod a folyamat végét. Később, ha már lesz gyakorlatod, jobban tudsz spórolni, az első projekteknél szerintem nem érdemes. Még az is lehet, a hardver egészen más célra lesz felhasználva, amikor jól jön a tartalék.
Bakman: köszi, hogy tisztába vágtad a dolgot. Kicsit át kell állni az agyamnak erre bájtos dologra.
nedudgi: Igen én is úgy vélem, hogy talán a 2 hatványos számolás talán tényleg egyszerűbb lenne mint sem össze vissza számolgatni és úgy meghatározni a következő címzést. Bár ez szerintem megoldható csak mondjuk egy picivel több programozással. 64KB-os memóriát rendeltem szóval ebbe fér adat bőven és majd a későbbiekben lehet szűkíteni bár, ahogy az árakat nézem teljesen felesleges a kisebb még akkor is ha nem használom ki. Köszönöm az infókat és a segítséget. Ja még annyi, hogy ezekhez a memóriákhoz kell elem, hogy megtartás az adatokat? Pl: 25LC640A-I/P A hozzászólás módosítva: Ápr 11, 2014
Az EEPROM memória nem felejt, csak ha törlik, erre a célra szolgáló paranccsal. Nem kell feszültség az adatok megőrzésőre.
Ilyen esetben nem csak a picivel több programozásról van szó. A szorzás, főleg az egyszerűbb kontrollereknél, (ahol nincs szorzó utasítás) időigényes művelet lehet, ami a többí azámítástól veheti el az időt. Jelen esetben valószínűleg nem számít.
Nem tudom, nem néztem még utána, de ha el is férne akkor is azt szeretném másra tartogatni.
Ezeket az adatokat minden kép külső memóriába akarom vezetni, hogy kellőképpen rugalmas legyen és ne keljen szűkölködnöm. Nem mellesleg külső memória használatával lehetőségem adódik megtanulni az SPI port kezelését és memória programozását. Közben még is megnéztem és 256bájt a memóriája ami kevés lenne nekem.
Igen igazad van az időre nem is gondoltam.
Ez igen csak okozhat gondot mármint a számításokkal vesztett idő, ha nem is most, de később mindenképp. Szerintem a te gondolatmeneted alapján fogok elindulni és 2-es hatványával fogom megoldani az adatstruktúra felépítését. Köszi.. Idézet: Nem nagy kihívás, főleg hogy a honlapomon már részletesen le van írva! „Nem mellesleg külső memória használatával lehetőségem adódik megtanulni az SPI port kezelését és memória programozását.” ![]() Az SPI vagy I2C választást csak azért feszegettem, mert ha jól emlékszem, akkor a PIC18F4550-nél nem megy egyszerre a kettő...
Húhúúú az már nekem kicsit húzós lenne nem?
Mármint még az SPI sem lesz egyszerű mert mindent nulláról kell megírjak előzetes tudás nélkül. Bár ha az SD kártya is soros SPI porton tud működni akkor gondolom nem lehet az sem gond. De ezt még nem tudom elképzelni. Persze majd kelleni fog valami ilyesmi is, ha akarok logolni és utána a logolt adatokat menteni egy fájlba, de ez már hosszabb távú elképzelés.. Más: Mi a véleményetek a C18-as fügevénykönyvtárakról. Szerintetek érdemes és jó ötlet használni a benne lévő függvényeket? Mint pl: timerek, pwmek, spi...stb. Vagy jobb, ha mindent magunk írunk meg és magunk állítunk be a regiszterekbe?
Mennyi időd van a projektre? Ha van 1-2 hónapod, menni fog biztosan. Ha nincs, akkor keress egy programozót.
Az SD előnye, hogy hordozható és tényleg nagy a kapacitása. Egy jól működő rutint, egyszer kell csak megírni...
Igen-igen nagyon sokat tanulok az oldaladról.
Eszméletlen segítséget nyújt csak van hogy 10szer kell átolvasnom mert az agyam is túlcsordul. Eddig az analóg portokban és a megszakításoknál segített a legtöbbet. A PWM-et már nekem kellett kibogozni mert azt még nem fejezted be pedig jól jött volna. Közben már megírtam ![]() Itt is köszönöm a befektetett energiát, hogylétre hoztad ezt az oldalt. Bárkinek bátran ajánlom mert nagyon jól tanulható belőle... És most fényesre nyaltam a hátsód A hozzászólás módosítva: Ápr 11, 2014
Én nem másnak csinálom a cuccot.
Nem profitálok belőle. Magam szórakoztatására és a tudásom szélesítése miatt kezdtem el a C nyelvet tanulni és a PIC programozást is. Nem mellesleg nagyon érdekel a téma így van bennem nem kevés kitartás... Szóval van időm mindenre bár nem tudok állandóan ezzel foglalkozni csak max a szabadidőmbe...
Akkor már (elvileg) tök mindegy mivel kezdesz. Hasonló az SD kártya kezelés is és általában van is kéznél...
Ő is SPI-n megy?
Vagy az már I2C porton? Egyébként, hogy tiszta legyen: SPI == soros port I2C == párhuzamos port Jól értem?
Az I2C két vezetéken kommunikál (adat és óra), a protokollban szerepel a periféria címzése, az SPI pedig 3+1 vezetéken (adat ki, adat be, órajel, és a megcímzett eszköz engedélyező jele).
A hozzászólás módosítva: Ápr 11, 2014
Azért egy 20 -szal való szorzás sem olyan bonyolult: 20 = 16 + 4 = 4 * (4 + 1). M'sr;syt egz 18F már rendelkezik szorzó utasítással.
Szia, keresgéltem, de nem találtam semmi használhatót, ha esetleg mégis lenne valakinek ötlete, esetleg más kommunikációs csatornán keresztül megköszönném. Így össze sem tudom hasonlítani a PIC-et, hogy legalább azt kizárhatnám a hibakeresésben. Köszi :Mike
|
Bejelentkezés
Hirdetés |










