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   1120 / 1203
(#) menyus válasza Hp41C hozzászólására (») Ápr 22, 2020 /
 
Köszi, nem a beszerzésével van a gond. Volt ott is ahonnét a többi cuccot rendeltem (RET) . Csak egy ilyen kis tételt külön nagyon drága kiszállíttatni. Majd nézek valami kétkapus rf FET et valami itthon elheverő tunerben.
(#) menyus válasza Hp41C hozzászólására (») Ápr 22, 2020 /
 
No, meg is van. BF996 om van itthon 20 db, mondjuk ez SMD de amúgy is át kell terveznem a panelját mert az IC- k is SMD kivitelűek amiket rendeltem, utálok furkálni... Köszi.
(#) menyus válasza Hp41C hozzászólására (») Ápr 22, 2020 /
 
Szia! Próbálom az általad ajánlott LCD adatbeviteli módszert, de fordításkor hiányolja a fordító a 14. sorban meghívott "CharToLcd" rutint. A CIM és Index regiszereket lefoglaltam. Le is fordulna a kód csak az a rutin hiányzik. Annak hogyan kéne kinéznie?
(#) menyus válasza menyus hozzászólására (») Ápr 22, 2020 /
 
Próbálom proli007 adat kiíró rutinjával (átneveztem a rutint), de sajnos nem igazán megy. Illetve működik csak éppen a helyes karakterek helyett #2 jelenik meg ki karaktrenként. Tehát a szöveg4 ("stb") így néz ki az LCD re kiírva: #2#2#2 Mi lehet a gond?
(#) Hp41C válasza menyus hozzászólására (») Ápr 22, 2020 / 1
 
Valahogy így. Magyarázat a mellékletben.
  1. list    p=16f877
  2.                 #include <p16f877.inc>            ; processor specific variable definitions
  3. ;PORTB0 - LCD_D7
  4. ;PORTB1 - LCD_D6
  5. ;PORTB2 - LCD_D5
  6. ;PORTB3 - LCD_D4
  7.  
  8. ;PORTB4 - LCD_E
  9. ;PORTB5 - LCD_CD
  10.  
  11.         cblock  0x020
  12. CIM:            2
  13. Index
  14. temp
  15. temp1
  16.         endc
  17.  
  18.         cblock  0x070
  19. W_SAVE
  20. STATUS_SAVE
  21. PCLATH_SAVE
  22.         endc
  23.  
  24.         org     0x0
  25.         goto    Kiir
  26.  
  27.         org     0x04
  28. Interrupt:
  29.         movwf   W_SAVE
  30.         movf            STATUS,w
  31.         movwf   STATUS_SAVE
  32.         movf            PCLATH,w
  33.         movwf   PCLATH_SAVE
  34.  
  35. ;.....
  36.  
  37.         movf            PCLATH_SAVE,w
  38.         movwf   PCLATH
  39.         movf            STATUS_SAVE,w
  40.         movwf   STATUS
  41.         swapf   W_SAVE,f
  42.         swapf   W_SAVE,w
  43.         retfie
  44.  
  45.  
  46. Init:
  47.  
  48. ;.....
  49.  
  50.  
  51.  
  52. Kiir:
  53.         movlw   high(Szoveg2)
  54.         movwf   CIM+1
  55.         movlw   low(Szoveg2)
  56.         movwf   CIM
  57.         call            SzovegToLcd
  58.         goto            Kiir
  59. ;.....
  60.  
  61. SzovegToLcd:
  62.         clrf    Index
  63. Loop:
  64.         call            GetNextChar
  65.         movwf   temp
  66.         movlw   high(Loop)
  67.         movwf   PCLATH
  68.         movf            temp,w                  ; 0x00 kódú karakter a végjel
  69.         btfsc           STATUS,Z                ; vége
  70.         return
  71.         call            CharToLcd
  72.         incf            Index,f
  73.         goto            Loop
  74.      
  75. GetNextChar:
  76.         movf            CIM+1,w
  77.         movwf   PCLATH
  78.         movf            CIM,w
  79.         addwf   Index,w
  80.         btfsc           STATUS,C        ; Laphatár ellenőrzése
  81.         incf            PCLATH,f
  82.         movwf   PCL                     ; Nem kell return, hiszen a szövegelemek retlw utasítások
  83.  
  84. PrepareToLcd:
  85.         clrf            temp1
  86.         bsf             temp1,3
  87. P_loop:
  88.         rrf             temp,f
  89.         rlf             temp1,f
  90.         btfss           temp1,7
  91.         goto            P_loop
  92.         movf            temp1,w
  93.         return
  94.  
  95. CharToLcd:
  96.         movwf   temp
  97.         swapf   temp,f
  98.         call            PrepareToLcd
  99.         xorwf   PORTB,w
  100.         andlw   0x0F
  101.         xorwf   PORTB,f
  102.         call            Enable
  103.         call            PrepareToLcd
  104.         xorwf   PORTB,w
  105.         andlw   0x0F
  106.         xorwf   PORTB,f
  107.  
  108. Enable:
  109.         bsf             PORTB,4
  110.         nop
  111.         nop
  112.         bcf             PORTB,4
  113.         return
  114.  
  115.         org 0x1800
  116.  
  117. Szoveg1:  DT "Szoveg1",0
  118. Szoveg2:  DT "Szoveg 2",0
  119. Szoveg3:  DT "Valami más",0
  120. Szoveg4:  DT "Stb",0
  121.         end
A hozzászólás módosítva: Ápr 22, 2020

LCD.asm
    
(#) menyus válasza Hp41C hozzászólására (») Ápr 22, 2020 /
 
Nagyon köszönöm!
(#) menyus válasza Hp41C hozzászólására (») Ápr 25, 2020 /
 
Szia! Még egyszer köszönöm a segítséget! Gyakorlatilag megírtad helyettem a kódot, gondolom látva hogy nem igazán vágom a dolgokat. Viszont mire a kódot megrtad én átkábeleztem a panelt hogy azt az "anomáliát" áthidaljam hogy a PORTB alsó bitjei vezéreljék az LCD felső bitjeit (nibbles cross) Most a PORTD 4-7 vezérli az LCD data 4-7 et. De nem probléma mert így legalább használni kellett a fejemet is a megoldáshoz.

Mivel kaptam több megoldást és rávezetést másoktól is példakódok vagy ajánlások formájában, + a netről is csipegettem példakódokat, ezek kombinációiból varrtam össze a kódomat. Jó volt ez így mert bár annak szántad, mégsem kész megoldást kaptam! Gondolkodni is kellett, nem is keveset. "Folyt is a víz a hátamon" ahogy ítt egy fórumtársunk megjósolta, bár ez még mindig csak a 16 os széria és nem a 18 as. ...

Szoszo, a Te kódodnál kicsit elakadtam mert a táblázatot (szövegX..stb) a negyedik memórialapra tetted, org 0x1800, a program többi része viszont első ránézésre a Page0 án van hiszen org 0x00 nál kezdődik a program. Nem láttam hogy hol vannak a lapváltások, nem találtam pagesel t..stb. Egyeszerően nem értettem hogy a program lapok között hogyan oldottad meg az átjárásokat. Aztán megtaláltam a cikkedet a memórialapok kezelésről és kezdett kitisztulni a kép. Nem mondom hogy minden világos de majd belejövök...

Még egyszer köszönöm Neked és Mindenkinek a segítséget, jó kis lecke volt!
A hozzászólás módosítva: Ápr 25, 2020
(#) Hp41C válasza menyus hozzászólására (») Ápr 25, 2020 /
 
Program lapot váltani a PCLATH megfelelő bitjeinek állításával lehet. A kódban két helyen történik:
  1. GetNextChar:
  2.         movf        CIM+1,w
  3.         movwf   PCLATH
  4.         movf        CIM,w
  5.         addwf   Index,w
  6.         btfsc      STATUS,C   ; Laphatár ellenőrzése
  7.         incf        PCLATH,f
  8.         movwf   PCL                        ; Nem kell return, hiszen a szövegelemek retlw utasítások

Ebben a részletben a szöveg kezdőcíme és az index alapján. A C bit ellenőrzése oldja meg a 256 utasításos laphatár kezelését.

A rutin hívása után van a második részlet:
movlw high(Loop) ; Az ugrás cél címének felső byte-ja.
movwf PCLATH

Az első goto vagy call előtt be kell állítani azt a memórialapot, amire az ugrás cél címe került a fordításkor.

A pagesel macro a PCLATH 4. és 3. bitjét állítja a hagyományos PIC16 -ok esetén. Annyival elegánsabb, hogy más PIC család esetén az azokon szükséges módon állítja a be a kívánt lapot.

Még egy adalék:
A probléma mentes használathoz a megszakítási rutin elején a PCLATH értékét menteni kell, a 0. lapra kell állítani és a visszatérés előtt a mentett értéket vissza kell állítani.
A hozzászólás módosítva: Ápr 25, 2020
(#) menyus válasza Hp41C hozzászólására (») Ápr 25, 2020 /
 
Köszönöm az újabb fejtágítót, jól jött mert a kódom még nem tökéletes. Néha megbolondul és végtelen ciklusba kerül (újra és újra ugyan azt a szöveget írja ki a kijelzőre) vagy éppen ismeretlen karaktereket ír ki az LCD re. Gyanítom hogy a rutinhívások ból vagy egy GOTO ból visszatérve nem arra a lapra érkezik vissza amelyikre kéne, vagy a laphatárt lépi túl. Ennek ellenőrzését én kihagytam mert e nélkül is működik a dolog, de csak egy ideig... Előbb utóbb megbolondul. De az instrukcióid alapján szerintem ezt már megoldom.

Köszönöm a segítségedet! Hagyom had follyon a víz a hátamon, ha fogytam 3 kilót és még mindíg nem megy, akkor esetleg még kérdeznék...
(#) Hp41C válasza menyus hozzászólására (») Ápr 25, 2020 /
 
Használd az MpLab beépített szimulátorát!
(#) menyus válasza Hp41C hozzászólására (») Ápr 25, 2020 /
 
Most lehet nagy butaságot kérdezek... De mitól esik be a megszakításba a program? A portb globális interruptjától? Vagy a C bit átbillenésétől? Ez csak annyiban lényeges hogy ahogy írtam én már megcseréltem a PORTB t a PORTD vel. Tehát PORTB vagy PORTB0 megszakítás nem keletkezhet mert ezeket a portokat nem használom. Illetve csak az E és a RS lábakat vezérlem velük Portb4, 5. A megszakításban pedig nem kell a többi esetleges megszakítást lekezelni? Tehát ha számunkra lényegtelen vagy nem releváns dolog miatt keletkezik megszakítás akkor retfie val kilép. Én ezt anno ha jól emlékszem úgy oldottam meg hogy a megszakítás rutinban a mentések után lechekkoltam hogy valóban az generálta e a megszakítást amit én vártam? Ha nem akkor kilépett a megszakításból. Ha igen akkor lekezeltem ahogy akartam. Az inicializálást rám bíztad, nyilván nem tudhatod hogy én mit használok mire... De melyik megszakítást kéne engedélyeznem hogy a kód múködjön? Mert jelenleg nálam a globális interrupt is tiltva van tehát nem is működhet a kód. Amivel eddig szenvedtem az nem használt megszakítást, de már látom nem fogom megúszni...
(#) Hp41C válasza menyus hozzászólására (») Ápr 26, 2020 / 1
 
Nem értem a kérdésedet.
- Ha eddig a programodban nem volt engedélyezve a megszakítás, továbbra sem kell engedélyezni semelyiket sem. INTCON.GIE = 0.
- Ha volt engedélyezett megszakításod, a szöveg elővétele megváltoztatja (ha csak átmenetileg is) a PCLATH értékét. A megszakítás kiszolgáló rutinnak mentenie kell a PCLATH értékét, önmagára kell állítania, hogy benne levő ugrások jó helyre történjenek és a kilépés előtt vissza kell állítania a mentett PCLATH értéket.
(#) menyus válasza Hp41C hozzászólására (») Ápr 26, 2020 /
 
Ne haragudj hogy értetlenkedem, mint említettem több kódból varrtam össze a mostani kódot. De már sikerült úgy belenyúlnom hogy egyáltalán nem működik tehát vissza a kályhához. Nem volt engedélyezve a megszakítás, pont ez zavart össze mert a tiedben van megszakítás rutin. A kérdésem arra vonatkozott hogy mi az az esemény amitől megszakításba kerül a programod? Maga a laphatár átlépése megszakítást generál pl? Ezt nem hiszem mert akkor nem kéne a laphatár elérését külön figyelned. Nálam addig működött (megszakítás nélkül) míg nem lépte át a laphatárt. De mivel betettem a programba vagy 5 + szöveget így már átlépi a laphatárt. Ezért van hogy az első 3 szöveget kiírja normálisan utána megbolondul a program. Amíg a rutinok, a táblázat is egy lapon vannak a főprogrammal addig vissza tud térni a program oda ahonnét ugrott. A Te programodban már más a helyzet mert a főprogram a page0 án van de a táblázatot 0x1800 ra azaz eleve a page3 ra tetted. Ha a page0 ról hivja meg a program a táblázatot lapváltás nélkül, ez nem is fog menni. Ha jól értelmezem...


Szégyenlem az értetlenkedésemet, és gondolom sokan fejet csóválva unnak is már itt a fórumon. De sajna úgy hozta az élet hogy most sok mindent újra kell tanulnom ami régebben már ment, rengeteg minden "kiesett" a fejemből. Anno használtam én már megszakítást, lapváltást is. Igaz csak F648 as esetében egy project kapcsán, ami eredetileg F628 ra íródott de aztán "kinőttem" és ki lett cserélve a lábkompatibilis (csak 2+ 2k s) F648 asra. Tehát sorry, de bizonyos okokból kicsit nehezebben mennek a dolgok most egy ideje, igyekszem de nem megy valami gyorsan ez az újra tanulás.
A hozzászólás módosítva: Ápr 26, 2020
(#) bbalazs_ válasza menyus hozzászólására (») Ápr 26, 2020 /
 
Menyus, szerintem ne érezd magad rosszul emiatt, azért ez a PIC kezdőknek fórum.
Mindenki elkezdte valahogy és öröm, ha a magyarázat sikeresen megvilágít egy problemát.
(#) menyus válasza bbalazs_ hozzászólására (») Ápr 26, 2020 /
 
Köszi, nehéz ez nekem most. Azért gáz ez mert nem voltam ennyire láma régebben, no nem voltam még közép szinten sem egy nagy koponya programozásban, de hobbiszinten ezek a dolgok már mentek! Engem főleg zavar mert tudom hogy tudtam régebben, most meg az istennek se megy, mint még sok minden ezen kívül. Nem mennék bele a részletekbe mi miért van most így ahogy mert ez itt senkit nem érdekel, és én sem vagyok rá büszke. De tetszik vagy nem (már nekem), ezt dobta az élet... De mindenesetre köszönöm a megértésedet.
(#) kissi válasza menyus hozzászólására (») Ápr 27, 2020 / 1
 
Szia!

HP41C kolléga nem használt benne megszakítást ( nincs engedélyezve a programjában, ill. nem foglalkozott vele!), csak azt próbálta megmutatni Neked, hogy ha megszakítást használtál esetleg, akkor így tedd a PCLATH miatt !
A hozzászólás módosítva: Ápr 27, 2020
(#) menyus válasza kissi hozzászólására (») Ápr 27, 2020 /
 
Értem, köszönöm. De Ő a teljes inicializálást kihagyta a példakódból, mert nyílván nem tudta nálam mi hogyan van beállítva, mit mire használok így ezért nem foglalkozott vele. Én így viszont nem láttam az INTCON regisztert sem amiből kiderül hogy használ megszakítást vagy sem, ha igen milyet? Ezért kérdeztem milyen esemény váltja ki a megszakítást? Én csak a megszakítás rutinban lévő mentéseket és visszaállításokat láttam. Ebből feltételeztem hogy megszakítást használ. Mert a megszakítás területén (0x004 -> ) volt tartalom, majd egy retfie. Ez zavart meg. Számodra miből derül ki hogy nem is használ megszakítást? Nem értem hogy ha az inicializálás nem látszik mert nincs is (és nyílván a nélkül nem is működhetne a program) akkor miből derül ki hogy használ e megszakítást vagy sem? Lehet "ránézésre látszik" hogy ez csak egy lehetséges megoldás, én viszont (hibásan) egy kész megoldásnak vettem mert a deklarációktól az end - ig ott volt előttem a "majdnem kész" program.

Akkor ismét vissza a kályhához mert most a megszakításos verziót írtam meg (ami nem működik így) , holott nem is kell megszakítás csak a a lapváltásokra kell odafigyelnem. Ha jól értelmezem. Nem könnyú kenyér ez.
A hozzászólás módosítva: Ápr 27, 2020
(#) ktamas66 válasza menyus hozzászólására (») Ápr 27, 2020 /
 
Ha megnézed, az IT-ben nem történik semmi, csak az adatok mentése és visszatöltése. A pontok jelentenék a feladatokat.
(#) menyus válasza ktamas66 hozzászólására (») Ápr 27, 2020 /
 
Igen, de gondoltam ezen kívül nem is kell más mert Hp41C a PCLATH mnetését visszaállítását említette és azt tartalmazza is a mentés visszaállítás.
(#) Szemmy hozzászólása Ápr 27, 2020 /
 
Sziasztok
Segítségre van szükségem.
Mivel a 18f-es pic-ben nem lehet a movfw utasítást használni, utána olvastam de nemjött össze.
pl.
MOVFW BILLI
MOVWF PORTB
ez működik a 16-ba
a 18-asra ezt a megoldást találtam
MOVF BILLI,W
MOVWF PORTB
De ez a megoldás nem működik. A w regiszterből a f-be szeretném tölteni.
A hozzászólás módosítva: Ápr 27, 2020
(#) Pali79 válasza Szemmy hozzászólására (») Ápr 27, 2020 /
 
Miért nem próbálod egyből a BILLI-ből a PORTB-be? MOVFF BILLI, PORTB
Egyébként a második megoldásodnak működnie kéne.
A hozzászólás módosítva: Ápr 27, 2020
(#) Szemmy válasza Pali79 hozzászólására (») Ápr 27, 2020 /
 
Sajnos nem müködik, de szerintem ezzel is baj lehet
movf KESLTET,W
andlw b'00001111'
movwf Time
incf Time,1
bcf STATUS,C, ACCESS
RLCF Time,1
bcf STATUS,C, ACCESS
RLCF Time,1
bcf STATUS,C, ACCESS
RLCF Time,1
bcf STATUS,C, ACCESS
RLCF Time,1
(#) Pali79 válasza Szemmy hozzászólására (») Ápr 27, 2020 /
 
Szimulátorban nézted, hogy mi nem működik pontosan?
(#) Szemmy válasza Pali79 hozzászólására (») Ápr 27, 2020 /
 
Most nézem benne

itt megál
goto $+1
ez a delay része, lehet itt ál meg?

Delay
;4993 cycles
movlw 0xE6
movwf d1
movlw 0x04
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
A hozzászólás módosítva: Ápr 27, 2020
(#) Hp41C válasza Szemmy hozzászólására (») Ápr 27, 2020 /
 
Idézet:
„Mivel a 18f-es pic-ben nem lehet a movfw utasítást használni, utána olvastam de nemjött össze.”

Már miért ne lehetne használni?
Ugyan van még egy paramétere, ami azt állítja be, hogy a BSR -ral kiválasztott bankot vagy az access bankot használja.

  1. banksel BILLI
  2. movf BILLI, w, BANKED
  3. movwf PORTB, ACCESS

vagy, ha a BILLI a 0x00 .. 0x5F és a 0xF60 .. 0xFFF közötti címeken van,
  1. movf BILLI, w, ACCESS
  2. movwf PORTB, ACCESS

működik.
(#) Hp41C válasza Szemmy hozzászólására (») Ápr 27, 2020 /
 
A 18F -eken egy utasítás 2 (nop, stb.), 4 (goto, call, movff) ill. 6 byte (movffl).
A goto $+1 kerülendő, hiszen páratlan címre hivatkozik. goto $+2 kell helyette.
(#) Szemmy válasza Hp41C hozzászólására (») Ápr 27, 2020 /
 
Sajnos nem működik
ha át írom 2-re akkor meg a ledek halványabbak lesznek
Valami kimaradt az biztos
A
A hozzászólás módosítva: Ápr 27, 2020
(#) Hp41C válasza Szemmy hozzászólására (») Ápr 27, 2020 /
 
Van benne még egy helyen.
(#) Szemmy válasza Hp41C hozzászólására (») Ápr 27, 2020 /
 
Annyit elértem hogy már működik, de a ledek fényereje halványabb. töröltem a goto $+1-et
így már valamennyire működik, de a ledek haloványabbak
(#) kissi válasza menyus hozzászólására (») Ápr 27, 2020 /
 
Idézet:
„Igen, de gondoltam ezen kívül nem is kell más”

Akkor nem érne semmit a megszakítás, ha csak annyit tenne, hogy belép, elmenti, majd visszatölti a W-t, a STATUS és a PCLATH regisztereket, úgy csak felesleges időhúzás lenne ( amit kerülni kell!) ! !
Idézet:
„Számodra miből derül ki hogy nem is használ megszakítást?”

A fenti részből, ill. ha megnézed, akkor látod, hogy vannak benne "beírandó" részek, azaz Ő csak egy sablont, egy követendő programkialakítást akart sugallni ( nekem ebből látszott...).
HP41C csak azt akarta mutatni ezzel a résszel, hogy, ha Te használsz megszakítást olyan programban, ahol a méret miatt a PCLATH-ot is használod, akkor azt így kell kialakítani, hiyzen a megszakításhívás olyan, mint a szubrutinhívás, csak nem tudjuk "mikor üt be a ménkő", azaz pl. nem tudjuk, melyik lapon járunk akkor éppen !
Következő: »»   1120 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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