Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Az EEPROM egy másik érdekes tulajdonsága, hogy ha csak néhány cellában frissülnek rendszeresen az adatok, akkor azok a cellák, amik régebben kaptak írást, folyamatosan közelítenek az alapállapothoz, azaz szép lassan elfelejtik az adatokat. Emiatt tehát szükséges időnként végigfutni a teljes EEPROM területen és újraírni a régi adatokat, frissíteni azokat ( is ). Az adatlapok erről is adnak tájékoztatást.
Ezeknek nem 40 év az adatmegőrzési idejük? Mintha valami ilyen "emberfeletti" időt olvastam volna az adatlapokon ?
Steve
De igen, ha nyugton hagyod. De ha a szomszédos cellákat rendszeresen írkálod, akkor időnként frissíteni kell azokat is, amiket nem írsz.
Ez nekem is új! Milyen időközönként kell?
Úgytűnik az adatlapokból, hogy nem minden picnél van erre szükség. Pl. 18F452 adatlap 6.8 fejezete szól erről. Ott az van megadva, hogy minimum egymillió, tipikusan tízmillió eeprom írás után van szükség ilyen frissítésre.
Árulja el valaki, hogy 64 bites Windows 7 alatt hogyan kell az MPLAB-ot installálni? Hiába adtam meg telepítési útvonalnak a Program files mappát, mindenáron a Program Files(x86)-ba települt. Végeredményben igaza van, de velem jól kitolt. Ha most az összes meglevő projektemet át kell szerkeszteni emiatt, az is bosszantó, de ha úgy teszem közzé (pl. a PICCOLO projektben), az méginkább az lesz - másoknak.
Van erre valami intelligens megoldás?
Megvan a megoldás!
Bővebben: Link
Hiszen az elvi ciklusa is 1millió, akkor már minek frissíteni a mellette lévőt? Majd megnézegetem ezt, mert most éppen egy olyan projectem van, ahol 20 cellát végtelenített szalagként írok percenként, pont azért, hogy 20millió perc legyen a kapacitás. Ha a mellettük lévő elfárad az gond, mert kalibrációs értékek vannak letárolva épp. Jó, hogy írtál erről, mert ez nem jutott volna eszembe!
Nem bájtonként, hanem összesen 1000000 eeprom írás után kell egy ilyen frissítés. Tehát ha van pl. 256 bájt eepromod, amiből 200-at rendszeresen írsz, akkor amikor már mindegyik bájtot 1000000/200=5000-szer már írtál, akkor kell egy ilyen frissítés a maradék 56 bájtra - már persze csak akkor, ha használod is valamire azokat.
Ezt hol lehet olvasni, mert én ilyennel még nem találkoztam ?
Steve
Közben megtaláltam az adatlapban és régebben is olvastam, csak az nem esett le, hogy ez nem egy-egy cellára vonatkozik, hanem összességében!
Köszi a figyelemfelhívást ! Steve
Szeretnék két táblának lefoglalni bájtokat a memóriában, egy 160 bájtosat és egy 100 bájtosat. Emellett még vagy 60-70 bájtnyi egyéb regiszter is kellene. Ezek egy részét az UDATA_ACS direktíva után írtam, aztán egy részüket az UDATA után. De nem engedi lefordítani mert túl sok a regiszter. Mit lehet ilyenkor tenni? Az adatlapja szerint a PIC18F25K80-nak (erről van szó) 3648 bájtnyi adatmemóriája van. Én ettől még nagyon messze vagyok! Hogy a bánatba lehet akkor akár mind a 3648 bájtot használni?
Én ugyan nem sokat programoztam a 18F sorozatot, de azt már tudom, hogy a 16F-ben sokat szidott bankolást nem sikerült felszámolni a 18F sorozatban sem, bár már nem olyan erősen jelentkezik. Nagyobb egybefüggő memóriaterületet érdemes indirekt címzéssel használni az FSR és INDF regisztereken keresztül. Ezekkel akár 256 bájtnál nagyobb egybefüggő blokkot is kezelhetsz. Az acces ram megoldással valahol 160 bájt körül van a határ, de ez megintcsak változó az egyes eszközök esetén. Bankolásos címzéssel egy bankban 256 bájtot tudsz használni.
A fordítói direktívákban nem tudok segíteni. Az a terület még ködös számomra.
Linker scriptedben kellene egy teruletet lefoglalni a nagy tablaknak es abba pakolgatni ezeket. ACS-be kulonben sem tennek ilyeneket, felesleges.
Hogyan? Olvasgattam neten meg a Kónya-könyvben de sehol nem írják le azt amire én vagyok kíváncsi.
Így néz ki most:
Ezt le tudja fordítani de ha a fűtés_tábla-nál átírom hogy ne 40 hanem 50 bájt legyen (annyit szeretnék de lehet hogy inkább 100-at) akkor már nyavalyog hogy túl sok.
Azt nem próbáltad, hogy az UDATA direktívához konkrétan megadod a RAM kezdőcímet? Két külön bankba helyezve a két táblát szerintem megoldaná a problémát.
Pl.:
Ahha... végre! Erre voltam kíváncsi, köszönöm!
A "group1" és a "group2" ugye azért kell hogy bankváltáskor erre hivatkozhassak? Még egy dolog: Hogyan tudom értékekkel feltölteni a fűtés_tábla 50 (inkább 100) bájtját? Idézet: „A "group1" és a "group2" ugye azért kell hogy bankváltáskor erre hivatkozhassak?” Azért kell leginkább, mert nem engedi meg az assembler, hogy több ugyanolyan nevű UDATA szekció legyen egy forrásfájlban, így el kell nevezni őket. Ha tömbként akarod kezelni a lefoglalt változókat, akkor az indirekt memória címzést javaslom. Ha "egyedülálló" változókként, akkor el kell nevezned a változókat és a RES direktívával foglalni nekik területet. Gondolom, neked tömbként kellene kezelni. Tömbök esetén kiválóan használható az indirekt címzés. Ekkor a kiinduláskor van egy báziscímed, amit valamelyik FSR regiszterbe kell tölteni, ez a tömb 0. eleme (korábbi példánál maradva mondjuk a 0x100). Az indirekt címzést támogató utasításokkal lehet lépegetni a tömbben. Ilyenek a POSTINC, PREINC, POSTDEC, PLUSW típusú indirekt műveletek. A használatukat az adatlap tárgyalja. Nézd át ezeket az adatlapban, ha konkrét kérdésed merülne fel, akkor majd írj és megpróbálok/próbálunk segíteni.
Az FSR mutatókat már sokszor használtam, ez nem probléma. Már meg is oldottam a dolgot, köszönöm a segítséget!
Köszi akkor pontos veszem leveszem!
Most akkor ezt így irom! #define x_allapot LATDbits.LATD0 #define x_kimenet TRISDbits.TRISD0 = 0 #define x_ki x_allapot=0 #define x_be x_allapot=1 Így csak egy helyen szerepel a LATDbits.LATD0 egyszerűbb módosítnai! Ez így jó??
Valaki nem tud nekem segíteni a #1060345 hsz ügyében?
(Maskor legyszi a valasz gombra kattints es akkor a valaszoloknak nem kell keresgelniuk a hozzaszolasod -- magyaran nem kell leirnod kezzel melyik szamu hozzaszolasodra varnal valaszt, hanem azt megkeresed es ott a valasz gombra kattintasz...)
Most en sem emlekszem pontosan, de a CBLOCK-bol vagy az EQU-val definialt valtozokbol nem tudja vissza szedni, hogy mi a valtozo es mi nem. Ugyanis ezek nem valtozok. Az EQU egy szamot rendel egy nevhez (ez a szam pedig a memoria cim lesz, de lehet ezt masra is hasznalni), a CBLOCK pedig konstans blokk (Constant BLOCK), amivel egy kezdo ertektol kiindulva lehet inkrementalisan ertekeket rendelni nevekhez -- megintcsak a memoria cimek lesznek ezek, de ezt a fordito nem tudhatja, mert CBLOCK-ot is lehet masra hasznalni csak ugy, mint az EQU-t... Magam reszerol meg mindig a linkres scriptes (relokativ) programozasi modot javasolnam, ahol igazi valtozo definialasok vannak a RES kulcsszo segitsegevel, es ott mar mukodnie kell a watch ablaknak.
Működik a Watch ablak a cblock .. endc között definiált és az EQU -val megadott szimbólumokra is abszolut fordítási modelben az MpLab Sim debuggerrel. A változó nevét kell a "Symbol Name" mezőbe írni / másolni.
Köszönöm, időközben megtaláltam.
A lényeg, az abszolut fordítási mód. Most viszont egy érdekes gondom akadt. 4x4-es billentyűzet kezelőt próbálok írni saját fejemből. A programot mellékelem, mert elég hosszú. Az érdekes az, hogy az első és a harmadik oszlopban található gombokra tökéletesen teszi a dolgát, kigyújtja a hozzájuk rendelt LED-et. A második oszlop gombjaira nem reagál (legalábbis nem látok semmit belőle). A negyedik oszlopnál pedig teljesen véletlenszerű a LED-ek bekapcsolása.
A globalis felhuzo ellenallas minek van bekapcsolva? A PORTB a sor vezerlo, nem? Ezekre a vonalakra ki kellene kapcsolni kulonben input modban ott neked fel fogja huzni a vonalakat amitol esetleg a billentyu nem jol mukodik... Szimulatoron mar jol mukodik a programod amugy?
Szia!
A SCAN rutinban állítgatod a TRISB regisztert, de a PORTB nincs beállítva... Az PORTB felhúzásokat a WPUB regiszterrel lehet vezérelni. A SUBLW utasítás előtt nem kell törölni a Z, C, DC bitet...
A PORTB a teljes billentyűzetet kezeli.
Úgy gondoltam, a globális felhúzó egyszerre kapcsolja az egészet, nem kell kínlódnom egyenként. A működés szempontjából éppen az kell nekem, hogy minden bemenet, csak az épp vizsgált oszlop nem. Lehet, hogy rosszul gondoltam, de úgy véltem, hogy a láb bemenetre kapcsolásával a felhúzó ellenállás automatikusan visszakapcsolódik, és 1-be rántja a bitet. Ezért nem állítgatom a portot. A szimulátoros működtetés elég nehézkes, mert nem igazán vagyok képben a stimulusokkal. Annyit csináltam, hogy a lépésenkénti futtatáskor manuálisan váltom a lábakat, ahogyan lennie kéne. Így jól működik, csak éppen nem biztos, hogy úgy állnak be a lábat, ahogy én állítom kézzel. Ha ebben tudnátok segíteni. Azt az excelest már néztem, de nekem ide nem nagyon jó.
Még annyit tennék hozzá, hogy a PORTB egyes bitjeit állítom. Próbáltam egyébként a teljes portot állítani, de a szimulátorban semmilyen hatása nem volt.
Szia!
Idézet: „Azt az excelest már néztem, de nekem ide nem nagyon jó.” Egyszerűen átvéve tényleg nem jó, hiszen 16F639 típusra van beállítva és egészen már lábakkal működik. Egy kicsit átírva már működik is...
Köszönöm, de egy kis magyarázatra szorul a működése.
Tulajdonképpen mit csinál ez a kis billentyű? Átadja a szimulátornak a lenyomott gomb értékét? Mikor teszi? Ha lépésenként hajtom végre akkor mikor kell megnyomnom? Vagy a futtatást válasszam, és akkor figyeljem a változókat? |
Bejelentkezés
Hirdetés |