Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
A típusjelzés utáni "A" általában az 'A'-nélküli típus javított változata. Tehát nem 100 %-osan ugyanaz, s a fordító/programozó is külön típusként kezel.
De az ott megadott program ezen is működni fog?
Az függ a programtól. Ha nem használ olyasmit, ami eltér, akkor működni fog. Ahogy nézem, a 877A-ban van két komparátor, de ezek alapból tiltva vannak, így nem okoznak problémát. A saját programmemóriájának írása eltér, ez pl. bootloaderes alkalmazásnál biztosan gond, de az alapján, hogy az "ott megadott program", azthiszem, hogy ezzel sem lesz gond. A harmadik eltérés az égetés algoritmusában van, ezt meg az égető program tudja kezelni, úgyhogy ez elméletileg megint nem okoz problémát. Néhány paraméterben látok még eltérést, de ezeken már elvileg nem múlik semmi, úgyhogy én 99%-ra tenném, hogy működni fog.
Igen, direkt bemenet a C0. Ezt a C0-t úgy értettem, hogy hiába teszek rá tápot nem lép tovább, Olyan mint ha 0-t érezne.
Az analóg részeket is használni akarom (RA2), csak azokat kiszedtem.
18F sorozatban
Onnan tudod, hogy te adod meg. 0x60 az a nullás bank, mert a fordító nullákkal tölti fel az üresen hagyott helyeket. Ha másik bankba akarod tenni a változódat, akkor azt úgy is kell megadni. Pl. cblock 0x260 ... endc, akkor amit itt adsz meg, az a kettes bankban lesz.
Ez eddig világos, de ha én "sok" változót sorolok fel a block -ban, hiába adok meg 0X60 at, átnyúlhatok vele 'észrevétlen' a következő bankba is. Ez valójában a gondom. Elvileg lehetséges? Kapnék fordítási üzenetet? (figyelmeztetést)
Nem cblock-kal kellene változókat definiálni, hanem udata szekciókat és linker scriptet használva (lásd az MPASM Template/Object könyvtárában a mintapéldákat, valamint a hlpMPASM.chm leírásban az udata címszónál!).
A linker script-ben laponként vannak megadva az adatmemória tartományai, ezért a fordító panaszkodni fog, ha egy-egy definált szekció nem fér el egy lapon. Ha nagyon akarod, abszolút kezdőcímet is meg lehet adni így:
Meg lett a bibi nem váltottam bankot, ezért az ansel helyett az adresl-t állítottam. Így megoldódott...
[code=c] BANKSEL TRISC MOVLW b'00000001' MOVWF TRISC MOVLW b'00001111' BANKSEL ANSEL MOVWF ANSEL
Hogy lehet egyedi karaktert beírni CGRAM-ba? 80 helyen olvastam már utána, de sehol nem fejtik ki kezdő szinten. Szóval mindenki egyből tömböt definiál és anélkül szeretném megoldani, hogy megértsem előtte.
Szóval a kódom a következő:
SEND_DATA ugyanaz a procedúra, mint amivel kiíratom a kijelzőre a karaktereket. SEND_COM meg ugye a parancs kiküldés. Maguk a procedúrák 100%, hogy működnek mert minden mást ki tudok íratni. Az egyedi karakter kiíratását így képzeltem el (adatlap szerint RW-nek 1nek kell lennie)
Mi lehet a gond? Az itteni leírás szerint a második sorba ugrik a kurzor és ez nálam is megtörténik, de kiírni nem akarja az egyedi karaktert. Már pár napja ezzel kínlódok, de sehol nem találtam értelmezhető teljes leírást róla, ami ASM-ben van.
Akkor mindent ugyan úgy kössek be és az első fajta égető is jó hozzá?
A WriteText nálam egy makró, ami a megadott cimkénél tárolt szöveget kiírja az LCD-re. A tárolt szöveg első bájtja a kijelző pozícióját jelenti, a végén a 0x00 pedig a szöveg végét. Ha jól megnézed logikailag ugyanaz, amit te is írtál, szóval a megoldásodnak működnie kellene. Én a kijelző RW vonalát nem szoktam használni, az GND-re le van kötve. Az RW vonal akkor kell, ha a kijelzőtől szeretnél valamit visszaolvasni. Tehát szerintem az RW-t hagyd nyugodtan nullában. Amúgy az alábbi kis programrészlet a celsiusfok kijelzés lenne, bár gondolom adódik is.
Idézet: Az, hogy kiírás előtt nem állítottad vissza a címet a megjelenítési területre! Így próbáld:„Mi lehet a gond?”
De ez már terítéken volt korábban is, csak a CGRAM kulcsszóra kellett volna rákeresni! Bővebben: Link
Szia!
A parancsok kiadásánál nem az RW vonalnak kell magas szinten lennie, hanem a RS -nek, hogy a parancs regisztert érd el az íráskor... A karakter definíciók előtt a (0x40+8*kód) parancsot, a végén 0x80 parancsot kell küldeni, vagy a megfelelő kurzor pozícióra kell állni...
Nem értem minek írnak, akkor hülyeséget az lcd adatlapjába...
Erre a kódra gondoltam, hogy ezt nem értem De akkor már had ragadjam meg az alkalmat: - Mi az a PCL? - Hogy definiálok makrót (mondjuk ehhez a példához)? - Pontosan mi is az a makró? Ha jól értelmeztem, akkor olyan mint C-ben egy függvény, bemenő paraméterekkel (vagy anélkül)? icserny: Így se működik Hp41C: csatoltam, ahol írták, hogy RW-nek is 1-re kell állítani (de ezek szerint ez marhaság)
Idézet: „Pontosan mi is az a makró?” Az MPASM makroassembler helpjében a Macro Language kifejezésre keress rá! Néhány példát makrókra a honlapomon is találsz. Bővebben: Link A Közepes Teljesítményű PIC Mikrovezérlők Felhasználói Kézikönyvében pedig a 11. fejezet 11.5.11 alfejezetében van róla szó. Bővebben: Link Idézet: Épp ellenkezőleg! Ott azt írják, hogy R/W-t nullába kell állítani CGRAM és DDRAM íráskor is.„csatoltam, ahol írták, hogy RW-nek is 1-re kell állítani” CGRAM írása: amikor definiálod a karaktert DDRAM írása: amikor használod a karaktert
Hogy mi a makró? Azt nem tudom. Hogy én mire használom?
- ismétlődések egyszerűsítésére pl.: néhány NOP utasítást kellene betenni a programba több helyre is. Megtehetem, hogy mindig leírom a NOP-okat, de csinálhatok egy makrót is, amelyikbe beleírom a szükséges számú NOP-ot, aztán ahol szükség van rájuk, beírom a makró nevét. A fordító ilyenkor úgy tesz, mintha a makró helyett a makróban levő részt írtam volna le. A makró hasonlít az eljárásra ( szubrutinra, függvényre ), de a makró tartalma minden egyes használatánál hozzáíródik a programhoz. Az eljárások ( általában ) csak egyszer szerepelnek a programban és egy CALL utasítással hívod meg azokat. Így aztán ha egy makród 100 utasításból áll és tízszer hivatkozol rá, az 1000 utasításnyi tárat fog elhasználni. Ha viszont az eljárásod áll 100 utasításból és tízszer meghívod, az 110 utasítást fog elhasználni ( egyszerűbb esetben ). Röviden talán ennyit erről. Ha jobban érdekel a különbség, akkor a T&T oldalt tudom ajánlani. Abból elég sokat tanultam. Valószínűnek tartom, hogy a Pikula, meg Pikkoló projektek átnézése is ad majd bővebb magyarázatot a kérdésedre. A PCL a PIC programszámlálója. Minden utasítás végrehajtása után változik az utasítástól függően, de többnyire csak eggyel növekszik. A PCL egy regiszterként is jelen van a vezérlőben, tehát az értékét összeadással vagy más művelettel is lehet változtatni. Ezt a fajta megoldást "Computed goto"-nak vagyis számított ugrásnak mondják. A példámnál maradva, a W munkaregiszter tartalma megy át a PCL-be. Hogy aztán hol fog folytatódni a program, az néha csak a szerencse kérdése. Én arra próbáltam rávenni a vezérlőt, hogy a Pontocska cimke utáni sorból vegyen ki egy adatot, majd térjen vissza a főhurokba.
Olvasásnál adtam RW-nek 1-es értéket (én erre értettem). Ez a T&T oldal nagyon jó. Köszi mindenkinek a segítséget. Viszont, akkor mi lehet még a probléma? Random össze-vissza karakteret írkál a kijelzőre. RW-t lekötöttem földre.
Szia!
Ha a R/W láb a földön van, akkor a program nem használhatja a Busy flag kiolvasását a parancs végrehajtás végének érzékelésére. Ekkor minden parancsnál a programnak legalább annyit időt kell várnia, ami az adatlapban szerepel. Egy kis tartalék is kellhet, hiszen az egyes gyártók / típusok / darabok órajele eltérhet... Nézd át az inicializálás lépéseit. Töltsd fel a programot lcd kezelő részét, add meg a kezelt LCD típusát ...
Szia!
A csatolt ábrán látható táblázat második sorában a CGRAM olvasása szerepel, ott valóban a R/W -nek magas szinten (1) kell lennie...
Idézet: Te a SEND_DATA előtt állítottad '1'-be. Az pedig nem olvasás, hanem írás. Olvasás csak a Busy flag figyeléséhez kell (ha kell).„Olvasásnál adtam RW-nek 1-es értéket” Idézet: Változatosak a lehetőségek:„mi lehet még a probléma? Random össze-vissza karakteret írkál a kijelzőre.” 1. Rossz inicializálás 2. Rossz időzítés 3. Érintkezési hiba
Ja igaz!
Minden mást kiír! Csak a CGRAM-os karaktert nem (illetve nem azt, amit beírok). Szóval ini, időzítés, érintkezési hiba biztosan nincs. Mindent adatlap szerint csináltam.
Sziasztok!
Idézet: „Hogy aztán hol fog folytatódni a program, az néha csak a szerencse kérdése.” Pontosan lehet tudni előre: Az utasítás számláló hosszabb, mint 8 bit - a programtár kapacitása nagyobb, mint 256 szó. A program számláló regiszter alsó 8 bitje érhető el a kontroller PLC regisztereként. A további bitek közvetlenül nem érhetől el, de az értéküket a PCLATH regiszter segítségével elő lehet készíteni. 14 bit core típusoknál (a 16F sorozat zöme): Ha a PCL regiszert írjuk, a PCLATH regiszter tartalma kerül a programszámláló 8 ... bitjeibe (hogy hány bit van, az típustól függ). Ha az írás egy művelet eredmény (általában addwf PCL,f), akkor azt kell figyelembe venni, hogy az előkészített biteket nem módosítja a kontroller az esetleges túlcsorduláskor. Az ilyen túlcsordulást már a PCLATH feltöltésekor le kell kezelni. Ugrásnál, vagy rutin hívásánál a 8..10. bit az utasítás kódjából veszi a kontroller, a 11. és 12. bitet (ha van) a PCLATH regiszterből. Macro -ba nem célszerű "computed goto" részletet tenni, mert annyi helyre másolódik be a macro törzse, ahányszor alkalmazzák. Ekkor könnyen előfordul, hogy a fent említett módosítás átvitelt okoz és a program nem jó helyre fog ugrani.
Idézet: „A PCL a PIC programszámlálója.” Nem egeszen! A PC a PIC program szamlaloja (Program Counter), amihez nincs kozvetlen hozzaferes. A PCL az egy regiszter ahol az 'L' a Low nevre utal, ugyanis a PC also 8 bithez ad hozzaferest. A felsot csak kozvetve lehet allitani, ezert nincs PCH, csak PCLATH. Ebbe kell betolteni a felso erteket, es az akkor kerul at a PC felso reszebe mikor a PCL-be irunk.
Sikerült!
Hogy másnak ne kelljen napokat szórakozni vele leírom pontosan, hogy hogy kell a CGRAM-ot feltölteni és előhívni onnan a felhasználó által definiált karaktereket:
Talán eddigre már rá is jöttél, hogy az eljárás lépésről lépésre ugyanaz, mintha a kijelzőre küldtél volna egy szöveget. Az egyetlen különbség, hogy a kijelző pozícionálásánál nem a 0x80-at hanem a 0x40-et adod meg.
Jelzem előre, hogy a dolog szépsége azután fog jönni, ahogy a programod elkezd nőni és az adattáblázatod szépen átlóg az első memória lapról a második lapra. Már most lehet rá készülni. Ahogy az előbb helyesbítették is a hozzászólásomat a PCL módosítása csak az alsó nyolc bitet változtatja a programszámlálóban. Tehát ha a programod nagyobb lesz, mint 255 utasítás, jön a meglepi. A sok sok retlw -t el lehet hagyni, ha a dt után írod a számokat, úgy, mint a mintámnál. A fordító a dt utáni számokat úgy fogja befordítani, mint ahogyan te is írtad:
Csak a soronkénti címzésről nem írtak sehol semmit...
Illetve, egy helyen olvastam, de ott is helytelenül címezték. Hát igen, most jön a java.
Köszönöm. Kicsit szebb és átláthatóbb lett a kód
Még egy kérdés. Létezik olyan, hogy így ki lehet iratni, hogy
Valami olyasmi kóddal, mint pl más programnyelvekben, hogy:
Vagy ne legyek ilyen nagyravágyó assemblyben? Vagy nincs más lehetőség, mint hogy külön betűnként iratom ki? Csak mert ez kicsit fárasztó egy-egy hosszabb szónál. |
Bejelentkezés
Hirdetés |