Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1156 / 1207
(#) Bakman válasza Peet19 hozzászólására (») Ápr 4, 2021 / 2
 
Nevezett kontrollerben a szokásosnál ügyesebb, differenciális ADC van. Minden analóg bemenet a Vcc és Vdd közötti feszültséget kaphat, nem összekeverendő a negatív bemenet a negatív feszültséggel. Ha a negatív bemeneti feszültség magasabb mint a pozitív, akkor az ADC mérés eredménye negatív lesz. Így egy méréssel össze lehet hasonlítani két feszültséget.

Pl. jobbra rendezett eredménynél az ADRESH felső négy bitje 1, ha a negtív bemeneten magasabb feszültség van, mint a pozitív bemeneten. Tulajdonképpen kettes komplemens számot kapsz eredményül.

Ha normál módon akarod használni az ADC-t, akkor válaszd az AVss opciót (CHSN=000).
(#) Peet19 válasza Bakman hozzászólására (») Ápr 4, 2021 /
 
Értem már, ez nagyon jó, köszi.
(#) Peet19 hozzászólása Ápr 5, 2021 /
 
Sziasztok!
Kellemes Húsvéti Ünnepeket mindenkinek!
Gyorsba kérdeznék valamit két locsolás között .
Nincs véletlenül assembly-ben olyan lehetőség mint C-ben a tömb?
Szeretnék egy olyat csinálni, hogy W-be berakok egy számot 0....9-ig, utána meg egy olyan megoldás kellene, hogy ez az érték egy tömb n. eleme lenne és ezt az értéket felvenné W.
Pl: W = 4, és van egy 10 elemű tömböm. Minden tömbelem egy 8 bites bináris érték, és egy olyan utasítás kellene, hogy a tömb 4. elemén található értéket vegye fel W-be. Ezután már tudok vele operálni, de ezt nem tudom hogy csináljam. Azt sem tudom hogy van-e egyáltalán ilyen lehetőség.
Eddig úgy oldottam meg, hogy 0...9-ig beírok egy számot W-be és azt hasonlítom össze egy regiszter értékével. Ha = akkor az értéknek megfelelően lépek tovább. Ez így rendben működik, de marha hosszú lesz így a kód ezért gondoltam hogy ha lenne egy ilyen tömbös lehetőség akkor sokkal gyorsabb és egyszerűbb lenne minden.
(#) nedudgi válasza Peet19 hozzászólására (») Ápr 5, 2021 /
 
Közel végtelen számú megoldás lehetséges.
  1. ; ugras
  2. szam:   movwf   y
  3.         movlw   high(szam)
  4.         movwf   PCLATH
  5.         rlncf   y,f
  6.         rlncf   y,w
  7.         andlw   0xFC
  8.         addwf   PCL,f
  9.         goto    szam0
  10.         goto    szam1
  11.         goto    szam2
  12.         goto    szam3
  13.         goto    szam4
  14.         goto    szam5
  15.         goto    szam6
  16.         goto    szam7
  17.         goto    szam8
  18.         goto    szam9
  19.         goto    szamA
  20.         goto    szamB
  21.         goto    szamC
  22.         goto    szamD
  23.         goto    szamE
  24.         goto    szamF   ; 0x0F
  25.         goto    szamx   ; 0x10

Ez akadt a kezembe. meghivod a "szam" szubrutint, és elágazol a WREG értéke alapján. a GOTO után valamikor végrehajtott RETURN a "szam" hívása utáni címre tér vissza. Itt például arra kell ügyelni, hogy a programrészlet minden utasítása azonos PCH tartományba essen.
A hozzászólás módosítva: Ápr 5, 2021
(#) Hp41C válasza Peet19 hozzászólására (») Ápr 5, 2021 / 1
 
Több információ kellene:
Milyen adatábrázolásúak a tömb elemei?
Változhat-e a tartalmuk?
Hol vannak tárolva?

Van lehetőség, de a fenti kérdésektől és a választott kontroller típustól függ a megoldás.

Tegyük fel, hogy RAM -ban tárolt byte-os adatokról van szó hagyományos 16F kontrollerenél a tömb egy memórialapon helyezkedik el :
Ismerni kell a tömb kezdőcímét (Byte_Array).
W -ben van az elem indexe.

  1. addlw low(Byte_Array)
  2. movwf FSR
  3. bcf STATUS,IRP
  4. movlw high(Byte_Array)
  5. andlw 1
  6. btfss STATUS,Z
  7. bsf STATUS,IRP


Most az FSR az indexel kiválasztott tömb elemre mutat.

  1. movf  INDF,w

utasítással kiolvashatjuk, a
  1. movwf INDF

utasítással módosíthatjuk értékét.
A hozzászólás módosítva: Ápr 5, 2021
(#) Zsora válasza Peet19 hozzászólására (») Ápr 5, 2021 /
 
Üdv!
Nem írtad, hogy milyen mikrovezérlőhöz kellene, de feltételezem, hogy 18LF26K80-hoz.
Ha a táblázatod a program memóriában (ROM) van, akkor kalkulált ugrással a táblázat egyik RETLW elemére ugrasz. Doksi 101. oldal.
Ha az adatmemóriában, akkor indirekt címzést használsz.(FSRx és INDFx regiszterek) Doksi 119. oldal.
(#) gyoran válasza Peet19 hozzászólására (») Ápr 5, 2021 /
 
Szia

erre gondolsz? (kivonat a 16f628 leírásból)
CALL TABLE ;W contains table offset value

TABLE:
ADDWF PC ;W = offset
RETLW k1 ;Begin table
RETLW k2
.
.
RETLW kn

Page-váltásra vigyázz
(#) Zsora válasza Zsora hozzászólására (») Ápr 5, 2021 / 2
 
Az indirekt címzés használata:
A W regiszterhez (ami az elem sorszámát tartalmazza) hozzáadod a táblázat kezdőcímét (16-bitesen), majd az eredményt betöltöd az FSRLx és FSRHx regiszterekbe. Az IND regiszterből pedig kiolvashatod a táblázat elemének értékét. (pl. MOVF INDFx,W) (x=0...2)
(#) Peet19 válasza Zsora hozzászólására (») Ápr 5, 2021 /
 
Köszi mindenkinek a sok infót, szemezgetek, átírom a progit hogy lássam a működését úgy jobban megértem.
Ha jutottam valamire még jövök. Ha elakadtam akkor is
(#) Zsora válasza Peet19 hozzászólására (») Ápr 5, 2021 / 3
 
Még egy tipp a ROM-ban tárolt tömbbel kapcsolatban:
PIC18-on a RETLW helyett inkább a TBLRD utasítást érdemes használni, mert sokoldalúbb és helytakarékosabb. Az tömb elemének kiszámolt címét beírod a TBLPTRL, TBLPTH és TBLPTU regiszterekbe, kiadod a megfelelő TBLRD utasítást, majd a TABLAT regiszterből kiolvasod az elem értékét. Az utasítás előnye, hogy a számláló automatikusan növelhető/csökkenthető (ami táblázatok, vagy több byte-os adatok olvasásához jó), ill. a programszó mindkét byte-ja felhasználható. (A programmemória byte címzésű. Egy utasítás két címet foglal el.)
További infó a doksi 125. oldalán.
A hozzászólás módosítva: Ápr 5, 2021
(#) Peet19 válasza Zsora hozzászólására (») Ápr 5, 2021 /
 
Utána olvasgatok az adatlapon, köszi. Valamit szerintem nem jól értelmezek mert eddig nem nagyon akar összejönni. Próbáltam a programmemóriába is rakni a DT-vel, de nem tudtam a megfelelő helyre ugrani. Átraktam az adatmemóriába mindent, de ott sem sikerül oda ugrani.
Megpróbálom amit írtál csak egy kicsit még nehéz, soha nem csináltam még táblázatot.
Most már a sokadik próbálkozás után itt tartok:
  1. ; 16 bites BCD konverzió
  2.         INCLUDE "bcd.inc"
  3. BCD_VEGE:
  4.     NOP
  5.         MOVF    TIZES, 0        ; 0...9-ig betöltöm a W-be
  6.         CALL    TABLE
  7.         NOP             ; IDE UGRIK VISSZA
  8.        
  9. TABLE:
  10.  
  11.         RETLW   NULLA_  ; cím: 0x008
  12.         RETLW   EGY_    ; cím: 0x009
  13.         RETLW   KETTO_  ; cím: 0x00A
  14.         RETLW   HAROM_  ; cím: 0x00B
  15.         RETLW   NEGY_   ; cím: 0x00C
  16.         RETLW   OT_             ; cím: 0x00D
  17.         RETLW   HAT_    ; cím: 0x00E
  18.         RETLW   HET_    ; cím: 0x00F
  19.         RETLW   NYOLC_  ; cím: 0x010
  20.         RETLW   KILENC_ ; cím: 0x011

Már kitöröltem mindent amivel eddig próbálkoztam, csak ez maradt. A NULLA_......KILENC_ regiszterek értékei a LED kijelző 8 bites bitmintáit tartalmazzák, és mellé írtam a címeit. Meghívom a TABLE rutint de már nem tudom hogyan tovább.
(#) gyoran válasza Peet19 hozzászólására (») Ápr 5, 2021 /
 
Az én példámban a TABLE: utáni első sor a PCL (hibás az eredeti példa) programszámlálóhoz hozzáadja a W értékét, ezzel tulajdonképpen oda ugrik, ami a kívánt sor. A RETLW pedig a CALL TABLE párja és visszaadja a kívánt számot a W-ben.
Ez az ADDWF PCL hiányzik.
A RETLW csak konkrét számot tud visszaadni, amit persze deklarálhatsz máshol. RETLW 29h pl. 29h-t ad vissza a W-ben.

Ha persze utána csak nop lesz, akkor ez csak a szimulátorban jó, mert azután jön a RETLW NULLA_ azt is végrehajtja és már el is szállt a holdba.
A hozzászólás módosítva: Ápr 5, 2021
(#) Peet19 válasza gyoran hozzászólására (») Ápr 5, 2021 /
 
Hát ezt most már tényleg nem vágom. Beraktam az ADDWF PCL, 1 -et de vagy semmit nem csinál, vagy teljesen máshová ugrik. Átírtam számokra a RETLW utáni részt, az úgy jó ha lefut az első sor akkor bekerül az érték W-be és visszaugrik a CALL utáni sorra. Ez idáig oké, de egyszerűen nem akar odaugrani ahol a tömb elem indexe van.
(#) Zsora válasza Peet19 hozzászólására (») Ápr 5, 2021 / 2
 
Egy példa TBLRD utasítással (PIC Assemblerre):
  1. ;
  2.         PROCESSOR 18LF26K80
  3.         #include "xc.inc"
  4. ;---------------------------- reset belépési pont
  5.         PSECT   code,abs
  6.         ORG     0x0000
  7. ResVec: goto    kezd
  8. ;---------------------------- 10 byte elemű tömb
  9.         PSECT   data
  10. tomb:   DB           0,1,2,3,4,5,6,7,8,9
  11. ;----------------------------
  12.         PSECT   code
  13. kezd:   addlw   low(tomb)       ; W-ben a tömb indexe
  14.         movwf   TBLPTRL,a
  15.         clrf    TBLPTRH,a
  16.         movlw   high(tomb)
  17.         addwfc  TBLPTRH,a
  18.         clrf    TBLPTRU,a
  19.         tblrd*
  20.         movf    TABLAT,w,a      ; W-ben az elem értéke
  21. vege:   goto    vege
  22. ;----------------------------
  23.         END     ResVec
(#) gyoran válasza Peet19 hozzászólására (») Ápr 5, 2021 / 2
 
Tegyél egy breakpointot az addwf-re
Nézd meg, ott mennyi van W-ben
Nekem tökéletesen működik.
W=0-val az első sorból ugrik vissza.
w=5-tel a hatodikból.
Mennie kell.

Vissza is adja amit kell:
Jók a definícióid (TIZES?)

movlw 5
call table
xx:
goto xx (Macen nehéz megtalálni a dollár jelet
table:
addwf PCL

retlw 'A'
retlw 'B'
retlw 'C'
retlw 'D'
retlw 'E'
retlw 'F'
retlw 'G'
retlw 'H'
A hozzászólás módosítva: Ápr 5, 2021
(#) Peet19 válasza gyoran hozzászólására (») Ápr 5, 2021 /
 
Köszi még próbálkozom, de inkább újra kezdem egy új lapon hogy lássam már egyáltalán a működését.
A lényegét már azért kezdem érteni csak még nem akar összejönni.

Zsora: köszi, ez tetszik csak van egy két új dolog amit még nem ismerek.
pl: mit jelent a PSECT? Nem akarok hülyeséget mondani de ez valami memóriafoglalás féle, de lehet rosszul tudom. Nem értem a PSECT code,abs sort.
(#) Pali79 hozzászólása Ápr 5, 2021 /
 
Egy PIC12F675 programozása közben a következő hibaüzenetet kapom: PK2Error0027: Failed verify (Address = 0x0 - Expected Value 0x2818 - Value Read 0x0)
Ettől még használható ez a példány?
(#) Zsora válasza Peet19 hozzászólására (») Ápr 5, 2021 / 3
 
A PSECT direktíva azt mondja meg az assemblernek, hogy a következő programrészeket melyik memóriaterületre kell tenni (fordítani). Példák:

PSECT code - futtatható kód a programmemóriában
PSECT code,abs - futtatható kód a programmemóriában, abszolút címen
PSECT data - inicializált adatok (konstansok) a programmemóriában
PSECT udata - nem inicializált adatok (változók) az adatmemóriában

Nem tudom hogy te melyik assembly fordítót használod, de az MPLAB X IDE v5.valahány verziójától már nincs benne alapból az MPASM, hanem az XC8 tartalmazza a PIC Assemblert, ami némileg eltér tőle. (A v5.15-ben még az MPASM volt.)
Az a gond, hogy az MPASM-ra írt programok nem működnek (változtatás nélkül) PIC Assemblerrel.
(#) Zsora válasza Peet19 hozzászólására (») Ápr 5, 2021 / 2
 
Egy példa a RETLW használatára:
  1. ;
  2.         PROCESSOR 18LF26K80
  3.         #include "xc.inc"
  4. ;---------------------------- reset belépési pont
  5.         PSECT   code,abs
  6.         ORG     0x0000
  7. ResVec: goto    kezd
  8. ;----------------------------
  9.         PSECT   code
  10. kezd:   movlw   5                              ; W-ben a tömb indexe
  11.         rcall   rutin
  12. vege:   goto    vege
  13. ;----------------------------
  14.         ORG     0x0100-8        ; az első RETLW utasítás a 0x0100 címre kerül
  15. rutin:  clrf    PCLATH,a
  16.         incf    PCLATH,a
  17.         addwf   WREG,w,a                ; W*2
  18.         addwf   PCL,a
  19.         IRP     szam,'0','1','2','3','4','5','6','7','8','9'
  20.         retlw   szam       ; W-ben az elem értéke
  21.         ENDM
  22. ;----------------------------
  23.         END     ResVec

Fontos, hogy a PCL módosítása előtt a PCLATH regisztert is megfelelően beállítsuk, mivel az (és a PCLATU) is betöltődik a programszámlálóba. A példában ezért a rutint fix címre tettem úgy, hogy az első RETLW laphatárra kerül (0x0100 cím). Ennek megfelelően a PCLATH értéke 0x01 (1-es lap). A PCLATU marad 0, mert ez a mikrovezérlő 64kB-os.
A hozzászólás módosítva: Ápr 5, 2021
(#) jefflynn hozzászólása Ápr 6, 2021 /
 
Sziasztok,
a Pickit4-el van valakinek tapasztalata? Mennyire gyors a 3-hoz és az ICD3-hoz képest? Van egy ICD3-am, de nagyon utálom szegényt a lassúsága, nehézkessége miatt. Esetleg vennék egy Pickit4-est, ha az sokkal jobb ilyen téren.
(#) Zsolt2 válasza jefflynn hozzászólására (») Ápr 6, 2021 /
 
Nekem nem tünt gyorsabbnak a Pickit3-hoz képest, RealIce-hosz viszonyitva meg lassubb. ICD3-hoz nem tudtam hasonlítani, de az ICD4-hez képest korlátozotabb a debug lehetőség is.
(#) Hp41C válasza Pali79 hozzászólására (») Ápr 6, 2021 /
 
Beprogramoztad, végigment hibátlanul, majd egy külön végrehajtott ellenőrzés (Verify) hasalt el?

Meglehet, hogy a beírt program kiolvasás védett. Nézd meg a konfigurációs regiszter tartalmát.
A PGC és/vagy PGD láb kimenetre kapcsolva közvetlenül a program indulása után? Egy késleltetés kellene a kimenetre állítás előtt.

Látom, PICkit2 -vel programozol. Válaszd a "Vpp first Programming Entry" módot.
(#) Peet19 válasza Zsora hozzászólására (») Ápr 6, 2021 /
 
Köszi az infót, mindig nagyon örülök ha tanulhatok valami újat. Köszi a példa progit is átrágom magam rajta este. Bocsi hogy tegnap már nem válaszoltam de este egy kicsit már belazultam. Ha siker van, azért jelzem
(#) Zsora válasza Peet19 hozzászólására (») Ápr 6, 2021 / 1
 
Szívesen! De... ahhoz hogy megfelelő segítséget kapj, azért nem ártana elmondanod, hogy:
- melyik mikrovezérlőre kell a program (nem mindenki olvas vissza)
- melyik fejlesztőkörnyezet (fordító) melyik verzióját használod

Ahhoz hogy programozni tudj, ismerned kell:
- az adott mikrovezérlőt
- az adott mikrovezérlő assembly utasításait
- a fordítóprogramot
A hozzászólás módosítva: Ápr 6, 2021
(#) Pali79 válasza Hp41C hozzászólására (») Ápr 6, 2021 /
 
Törlés után is hibát dobott és egy sima LED villogtató sem indult el rajta, úgyhogy szerintem kuka.
(#) Peet19 válasza Zsora hozzászólására (») Ápr 6, 2021 /
 
OK. Igazad van, elnézést.
18F26K80 a jelenlegi áldozat, most épp ezzel harcolok, de később meg akarom írni a progit esetleg egy soklábú tesójára, vagy egy 18F25J10-re. Van más PIC-is ami nagyon szimpi, de sajna azt nem ismeri az IDE. MPLABX-el nem foglalkozom. Küzdöttem vele pár hétig-hónapig, brutál bonyolult(-nak néz ki) úgyhogy azt feladtam. MPLAB 8.92-öt használok és MPASM a fordító. Ez nagyon jó.
Folyamatosan az adatlapokat böngészem, azt hittem már ismerem az adott PIC-et, de furcsa, mindig találok valami újat. Az utasításaival is ismerkedem, tesztelgetem, és tök jó mikor sikerül valami.
(#) Zsora válasza Peet19 hozzászólására (») Ápr 6, 2021 / 1
 
A TBLRD-s példát átírtam MPASM-ra. Csak MPLAB X IDE v5.15 alatt teszteltem, mert MPLAB v8-at már régóta nem használok. W-be 5-öt töltve, az 5-ös szám ASCII kódja (0x35) kerül vissza eredményül a W-be.
  1. ;
  2.         PROCESSOR 18LF26K80
  3.         #include "p18lf26k80.inc"
  4.         CONFIG  XINST = OFF    
  5. ;---------------------------- reset belépési pont
  6. RST     CODE       0x0000
  7. ResVec: goto    kezd
  8. ;---------------------------- 10 byte elemű tömb
  9. DAT     CODE_PACK      
  10. tomb:   DB           '0','1','2','3','4','5','6','7','8','9'
  11. ;----------------------------
  12. PRG     CODE
  13. kezd:   movlw   5                      ; W-ben a tömb indexe
  14.         addlw   low(tomb)
  15.         movwf   TBLPTRL,0
  16.         clrf    TBLPTRH,0
  17.         movlw   high(tomb)
  18.         addwfc  TBLPTRH,0
  19.         clrf    TBLPTRU,0
  20.         tblrd*
  21.         movf    TABLAT,w,0      ; W-ben az elem értéke
  22. vege:   goto    vege
  23. ;----------------------------
  24.         END

Ajánlom figyelmedbe a mellékelt olvasnivalót.
A hozzászólás módosítva: Ápr 6, 2021

MPASM.pdf
    
(#) Zsora válasza Zsora hozzászólására (») Ápr 8, 2021 / 1
 
Egy korábbi hozzászólásomban azon értetlenkedtem, hogy miért változtatták meg a PIC Assemblerben a bithivatkozásokat. Miután alaposabban megnéztem az .inc állomány végén található definíciókat, leesett a tantusz:
  1. #define RB7     BANKMASK(PORTB), 7
  2. #define RBIE    BANKMASK(INTCON), 3

Bitek kezelése MPASM-ban:
  1. teszt:  btfsc   STATUS,C
  2.         bsf     PORTB,RB7

Bitek kezetése PIC Assemblerben:
  1. teszt:  btfsc   CARRY
  2.         bsf     RB7

Ez az XC8-ban (is) használt megoldásra emlékeztet.
Tehát mégsem olyan agyatlan módon változtatták meg. Visszaszívtam.
A hozzászólás módosítva: Ápr 8, 2021
(#) Hp41C válasza Zsora hozzászólására (») Ápr 9, 2021 /
 
#define CARRY STATUS, 7
Bitek kezelése MPASM-ban:
  1. teszt:  btfsc   CARRY

Ez így működött az MpAsm -ben is.

Egy program verzióban:
  1. #define LED     PORTB,7


Egy másik verzióban:
  1. #define LED     GPIO,3


A közös forrásban
  1. bsf LED

Működött ugyan, de nem tudtad a szimulátorban közvetlenül megnézni a LED értékét.
(#) kissi válasza Hp41C hozzászólására (») Ápr 9, 2021 /
 
Szia!
Idézet:
„Működött ugyan, de nem tudtad a szimulátorban közvetlenül megnézni a LED értékét.”

Akkor ez most már megy a pic-as alatt ?! Pont a múltkor említettem az egyik ismerősömnek, hogy ezt nem lehet a 8.92-nél és "logikátlannak tartottam" !Örülnék neki, ha megoldották volna, mennyivel egyszerűbb lenne, mint az adott bitet "skubizni" ! Majd kipróbálom, köszi az infót!
Következő: »»   1156 / 1207
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