Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   821 / 1320
(#) icserny válasza laci222 hozzászólására (») Okt 22, 2010 /
 
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.
(#) laci222 válasza icserny hozzászólására (») Okt 22, 2010 /
 
De az ott megadott program ezen is működni fog?
(#) potyo válasza laci222 hozzászólására (») Okt 22, 2010 /
 
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.
(#) Corp válasza icserny hozzászólására (») Okt 22, 2010 /
 
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.
(#) szaffo555 hozzászólása Okt 23, 2010 /
 
18F sorozatban
  1. cblock 0x60 ..... endc
közé teszek változókat (többet is). A programban hogyan tudom, hogy melyik változót (regisztert) melyik bankban kell keresnem mikor használni akarom őket?
(#) potyo válasza szaffo555 hozzászólására (») Okt 23, 2010 /
 
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.
(#) szaffo555 válasza potyo hozzászólására (») Okt 23, 2010 /
 
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)
(#) icserny válasza szaffo555 hozzászólására (») Okt 23, 2010 / 1
 
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:

  1. blokk1    udata  0x60      
  2. var1    res 1   ;byte
  3. var2    res 4   ;double word
  4. var3    res 2   ;word
  5.  
  6. blokk2    udata 0x100
  7. a       res 1
  8. b       res 2
  9.         ... stb.
(#) Corp válasza Hp41C hozzászólására (») Okt 23, 2010 /
 
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
(#) chriskross hozzászólása Okt 23, 2010 /
 
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ő:
  1. CGRAM_feltolt
  2.         movlw   0x40                    ;CGRAM cím beállítása (0x00-ra)
  3.         call    SEND_COM
  4.         movlw   b'00001110'
  5.         movwf   SEND_DATA
  6.         movlw   b'00010001'
  7.         movwf   SEND_DATA
  8.         movlw   b'00001110'
  9.         movwf   SEND_DATA
  10.         movlw   b'00000100'
  11.         movwf   SEND_DATA
  12.         movlw   b'00011111'
  13.         movwf   SEND_DATA
  14.         movlw   b'00000100'
  15.         movwf   SEND_DATA
  16.         movlw   b'00001010'
  17.         movwf   SEND_DATA
  18.         movlw   b'00010001'
  19.         movwf   SEND_DATA               ;ember

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)
  1. movlw   0x00
  2.         bsf             RW
  3.         call    SEND_DATA

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.
(#) laci222 válasza potyo hozzászólására (») Okt 23, 2010 /
 
Akkor mindent ugyan úgy kössek be és az első fajta égető is jó hozzá?
(#) Ideiglenes válasza chriskross hozzászólására (») Okt 23, 2010 /
 
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.

  1. WriteText       Pontocska
  2.        
  3.         movlw   0x00
  4.         call    SendCHAR
  5.         movlw   'C'
  6.         call    SendCHAR
  7.         ...
  8. OutputText
  9.  
  10.         movwf   PCL
  11.  
  12. Pontocska
  13.  
  14.         dt      0x40,0x06,0x09,0x09,0x06,0x0E0,0x0E0,0x0E0,0x0E0,0x00
(#) icserny válasza chriskross hozzászólására (») Okt 23, 2010 /
 
Idézet:
„Mi lehet a gond?”
Az, hogy kiírás előtt nem állítottad vissza a címet a megjelenítési területre! Így próbáld:
  1. movlw   0x80
  2.     call SEND_COM
  3.     movlw   0x00
  4.     call SEND_DATA



De ez már terítéken volt korábban is, csak a CGRAM kulcsszóra kellett volna rákeresni! Bővebben: Link
(#) Hp41C válasza chriskross hozzászólására (») Okt 23, 2010 /
 
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...
(#) chriskross válasza Ideiglenes hozzászólására (») Okt 23, 2010 /
 
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)
(#) icserny válasza chriskross hozzászólására (») Okt 23, 2010 /
 
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
(#) icserny válasza icserny hozzászólására (») Okt 23, 2010 /
 
Idézet:
„csatoltam, ahol írták, hogy RW-nek is 1-re kell állítani”
Épp ellenkezőleg! Ott azt írják, hogy R/W-t nullába kell állítani CGRAM és DDRAM íráskor is.

CGRAM írása: amikor definiálod a karaktert
DDRAM írása: amikor használod a karaktert
(#) Ideiglenes válasza chriskross hozzászólására (») Okt 23, 2010 /
 
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.
(#) chriskross válasza icserny hozzászólására (») Okt 23, 2010 /
 
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.

  1. CGRAM_feltolt
  2.         movlw   0x40                    ;CGRAM cím beállítása (0x00-ra)
  3.         call    SEND_COM
  4.         movlw   b'00001110'
  5.         movwf   SEND_DATA
  6.         ....
  7.         movwf   SEND_DATA               ;ember
  8.         movlw   0x80
  9.         call    SEND_COM
  10.  
  11.         movlw   0x00
  12.         call    SEND_DATA
(#) Hp41C válasza chriskross hozzászólására (») Okt 23, 2010 /
 
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 ...
(#) Hp41C válasza chriskross hozzászólására (») Okt 23, 2010 /
 
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...
(#) icserny válasza chriskross hozzászólására (») Okt 23, 2010 /
 
Idézet:
„Olvasásnál adtam RW-nek 1-es értéket”
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).

Idézet:
„mi lehet még a probléma? Random össze-vissza karakteret írkál a kijelzőre.”
Változatosak a lehetőségek:
1. Rossz inicializálás
2. Rossz időzítés
3. Érintkezési hiba
(#) chriskross válasza icserny hozzászólására (») Okt 23, 2010 /
 
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.
(#) Hp41C válasza Ideiglenes hozzászólására (») Okt 23, 2010 /
 
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.
(#) trudnai válasza Ideiglenes hozzászólására (») Okt 24, 2010 /
 
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.
(#) chriskross hozzászólása Okt 24, 2010 /
 
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:
  1. movlw   0x40                ;Kurzor CGRAM-ba
  2.         call    SEND_COM
  3.         movlw   d'64'                   ;8 karakter 8 bájtja
  4.         movwf   COUNT
  5.         clrf    FSR
  6. CGRAM_up
  7.         movf    FSR,w                   ;w kezdőcíme
  8.         incf    FSR                         ;soronként címzés
  9.         call    CGRAM
  10.         call    SEND_DATA             ;Kiíratás a kijelzőre
  11.         decfsz  COUNT             ;64x
  12.         goto    CGRAM_up
  13.  
  14.         movlw   0x80                    ;Kurzor vissza DDRAM-ba
  15.         call    SEND_COM
  16.  
  17.         movlw   0x00                    ;1. felhasználó által definiált
  18.         call    SEND_DATA              ;karakter megjelenítése a kijelzőn
  19.  
  20. CGRAM                                                            ;Felhasználó által definiált karakterek
  21.         addwf   PCL
  22.         retlw   0x0E                    ;CGRAM 0x00 karakter, pálcikaember (0.bájt)
  23.         retlw   0x11                    ;(1.bájt)
  24.         retlw   0x0E                    ;(2.bájt)
  25.         retlw   0x04
  26.         retlw   0x1F
  27.         retlw   0x04
  28.         retlw   0x0A
  29.         retlw   0x11
  30.         retlw   0x0E                    ;CGRAM 0x01 karakter (0.bájt)
  31.         retlw   0x0E
  32.         retlw   0x04
  33.         .....                    ;Összesen 8karakter×8bájt=64bájt fér CGRAM-ba
(#) Ideiglenes válasza chriskross hozzászólására (») Okt 24, 2010 /
 
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:

  1. CGRAM
  2.  
  3.     addwf    PCL
  4.  
  5.     dt  0x0E,0x11,0x0E,0x04,0x1F,0x04,0x0A,0x11,0x0E,0x0E,0x04
  6. ...
(#) chriskross válasza Ideiglenes hozzászólására (») Okt 24, 2010 /
 
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.
(#) chriskross válasza Ideiglenes hozzászólására (») Okt 24, 2010 /
 
Köszönöm. Kicsit szebb és átláthatóbb lett a kód
(#) chriskross hozzászólása Okt 24, 2010 /
 
Még egy kérdés. Létezik olyan, hogy így ki lehet iratni, hogy
  1. dt              "Mérő",0

Valami olyasmi kóddal, mint pl más programnyelvekben, hogy:
  1. dt  "M"+0x00+"r"+0x01, 0

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.
Következő: »»   821 / 1320
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem