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   1114 / 1203
(#) Peet19 válasza szucsistvan123 hozzászólására (») Ápr 2, 2020 /
 
Köszi, átmegyek.
(#) Szemmy hozzászólása Ápr 4, 2020 /
 
Sziasztok. Hogy lehet megoldani Assembly-ben hogy 1 Pic 2 portjának bizonyos pin-jei legyenek csak használva. Gondolok arra hogy pl. Bport 0,1,2 ÉS Cport 5,6-os pinjeit egy ként kezelje, úgy hogy ha ezekre adatot küldök a nem használt többi pineket békén hagyja, mivel azoknak más szerepe lenne.
Gondolom itt tömbökbe kellene szervezni, vagy definiálni, de nem igazán sikerül.
Példa. (1) tömb PORTB 1,2,3,4,5 PORTC 0,4,5. (2)tömb PORTC 1,2,3 PORTD 1,2,3,4,5. tehát ezekre ha kiküldöm az infót csak ezek a pinek kapják meg. Probálkoztam a PORC,1 PORTC,2 PORTD,3 PORTD,4
stb. de ezek eléggé hosszúak lennének és eléggé macerásak. 1 definiálásnál meglehet azt oldani hogy
több pin-t kezeljen? thx
(#) menyus válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Vagy bináris módban adod meg melyik bit legyen aktív és inaktív, vagy a BSF, BCF utasításokkal tudod egyesével kezelni a biteket. pl. a PORTB1 esetében binárisan megadva b'00000010'. (a PORTB1 aktív a többi inaktív azaz a PORTB 8 bitje közül a 0,2,3,4,5,6,7 "L" szinten van, az 1 az H ban.

movlw b'00000010' ;ennél a módszernél megadhatod a 8 bit állapotát egyszerre is
movwf portb

ez pedig csak egy bit állítására szolgál:

clrf portb ; minden bit "L" ben, mert nem tudhatod éppen milyen állapotban vannak.
bsf portb,1 ; PORTB 1 es bit "H" ra állítva a többihez nem nyúltál

De ezt megelőzően be kell állítani a port irányát is a TRIS regiszterben, azaz hogy melyik GPIO t használod be vagy kimenetként. Valamint a bank váltásokra is figyelni kell mert a TRIS a bank1 ben a PORTB a bank0 ban van általában.. Olvasgasd az alább belinkelt oldalt.

több infó
A hozzászólás módosítva: Ápr 4, 2020
(#) Szemmy hozzászólása Ápr 4, 2020 /
 
Ez tiszta, ez az alap amit tudni kell. De én úgy szeretném hogy pl. Cport 0123 Dport0123.
Ez ugye 8 bit. De' ez a két port egy időben csak ezeket a pineket használja. Mivel a többi C4567 D4567 pin éppen adatot vár vagy küld. Egy utasitásban akarom ezeket a Pineket használni. Ha Movlw B'00000000' Movwf Portc, portd , használom akkor lenullázom a c4567 d4567 is. A programomba változni fog a kihagyott pinek iránya hol ki hol bemenet lessz. Makróval esetleg meglehetne oldani ezt a problémát? A Bsf Bcf megoldás son ciklus időt venne igénybe. A lényeg van egy értékem azt akarom kiküldeni a megadott portok Pinjeire, a többi pineket hagyja békén. Ezt viszon 1 utasitással.
(#) Szemmy hozzászólása Ápr 4, 2020 /
 
Leirom egszerübben. Van 2portom a, b. Az a port 5, 6 pinjén van 1-1 érzékelő a b port, mondjuk , 3, 5 pinje slc, sda, tehát egy külső eeprom, mondjuk. Az A és a B port szabad pinjeire akarok egyidőben 1 értéket kiküldeni.
(#) pipi válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Hali!
Vagy 1 bitesen, vagy 8 bitesen tudod írni, olvasni, más lehetőség nincs.
Ha íráskor több bitet akarsz kezelni egyszerre, akkor előbb beolvasod a 8 bitet, módosítod a kivánt bithelyeken, és visszaírod a 8 bitet.
(#) menyus válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Idézet:
„Cport 0123 Dport0123.
Ez ugye 8 bit.”


Ez összesen valóban 8 bit, de én inkább 2x4 bitnek mondanám mivel külön portokról beszélünk, PORTC és PORTD. Ha azok a bitek amikhez nem akar nyúlni egy fél byt on (Nibble) belül vannak akkor ki lehet maszkolni őket és akkor azokat nem írod felül.

Nem igazán látom át mit szretnél, de egyszerre 2 portra nem tudsz írni az általad elképzelt

Idézet:

Movlw B'00000000'
Movwf portc, portd

ezzel módszerrel, ez így tuti nem működik!

Ha ugyan azt akarod mindkét regiszterbe írni akkor :

Movlw B'00000000'
Movwf portc
Movlw B'00000000'
Movwf portd

De fentiekre egyszerűbb a
clrf portc
clrf portd

már ha minden bitet 0 ba akrsz állítani.. Ha nem, akkor portonként kell megadnod az értékeket. De 2 külön portba egyszerre nem tudsz írni egy utasítással. De nem vagyok profi, csak próbálok segíteni.
A hozzászólás módosítva: Ápr 4, 2020
(#) menyus válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Akkor ahogy "pipi" is írta beolvasod az A és B regiszterek tartalmát, megnézed a használt portokon kívül melyik a "szabad pin" ami nem kell. És akkor oda tudsz írni, de egyszerre egy időben csak 1 regiszterbe. De ha ez a kiolvasott érték nem konstans hanem mindig változik akkor változni fog a további feldolgozása is ezeknek a biteknek. Nem lesz egyszerű kézben tartani és bonyolítja a programot. Ha konstans akkor meg nem is kell kiolvasni mert tudod melyik PIN ed a szabad...

pipi
Idézet:
„Ha íráskor több bitet akarsz kezelni egyszerre, akkor előbb beolvasod a 8 bitet, módosítod a kivánt bithelyeken, és visszaírod a 8 bitet.”


Ez ok, de ez is csak akkor működik ha egy PORT on (regiszteren) belül akar írni, da ha jól értem ő azt szeretné hogy egyszerre írjon 2 külön 8 bites regsizterbe egy utasítással. Na ez nem fog menni, szerintem...
A hozzászólás módosítva: Ápr 4, 2020
(#) pipi válasza menyus hozzászólására (») Ápr 4, 2020 /
 
Nem bizony, egyszerre csak 1db 8 bites portot lehet írni/olvasni, különböző portokból nem lehet a biteket egybevarázsolni.
(#) Szemmy hozzászólása Ápr 4, 2020 /
 
Kezdünk dűlőre jutni. természetesen nem tudok egy időben irni 2 portra ez tiszta max 2 ciklussal + az utasitások ciklusai. de egy változóval igen , na az érdekelne. Konkrétan úgy akarnám hogy 3 portot akarok használni amibe az egyik porton lenne egy vagy kettő érzékelő, a két teljes port írása nem gond, de én arra vagyok kiváncsi hogy 1-1 utasításal meglehetne e oldani mondjuk azt hogy
1_ES ( UTASITÁS)
irom a Bport 0,1,2,3,4,5, pinjeit.
2-es (utasitás)
írom ugyancsak a BPORT de 6,7, és a "D"port 0,1,2,3,4 pinjeit
3 utasitás
irom ugyancsak a "D"PORT 5, pinjét itt kihagyom a 6-ost mert másra akarom és irom a d 7-esét.
Tehát ha azt akarnám hogy 1 utasitással csak 3 pint akarok a másikkal a következő 3-at a következővel 2 + a következő port 0-ásást. a következővel kihagyom a másra való pineket, és írom tovább. Lényeg a lényeg lehet e változóba vagy tömbökbe rakni külön portok pinjeit. hogy hány ciklus az most nem számít.
1-es tömb ( vagy akármi) ; portb 0,1,2,3,4
2-es tömb ; portb 5,6,7 portd 0,1
3-as tömb ; portd 2,3 (kimarad 4,5) 6,7
Na talán így érthető vagyok
(#) jdani hozzászólása Ápr 4, 2020 /
 
Üdv. Mi az a feszültség, amin egy 12F629A még működik?
Végülis amit konkrétan tudni akarok, működhet-e stabilan a mellékelt rajz?
(#) nedudgi válasza jdani hozzászólására (») Ápr 4, 2020 /
 
2V, 4MHz frekvencián. Az adatlap szerint. Microchip PIC12F629 a helyes típusszám.
A 47 kΩ túl nagy szerintem, a tranzisztorokat nem tudja telítésbe vezérelni.
(#) ktamas66 válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Ha port többi része bemenet, simán írhatod portként, a bemenetekre nincs hatása. Ha több kimeneted is van előbb be kell olvasni a port állapotát, maszkolni a megfelelő lábakra és úgy visszaírni. Ezt beteheted egy makróba vagy egy rutinba. Esetleg arra kell figyelni, hogy egy megszakítás ne kavarjon bele a portok állapotába a manipulálás közben.
(#) nedudgi válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Menjünk vissza a kályhához. Milyen típusról van szó? Van LATx regisztere?
(#) Szemmy hozzászólása Ápr 4, 2020 /
 
16F877A
(#) Hp41C válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
Kétféle PIC -et használhatunk: Van LATx regiszter és nincs LATx regiszter.

1. Van LATx regiszter. Ha olvassuk, mindig a legutoljára beírt értékek olvashatjuk ki belőle.
Mindig a LATx -et írjuk. Ha egy porthoz tartozó kimenetek közül csak néhányat szeretnénk megváltoztatni akkor használjuk a jó öreg xorwf utasítást:
pl. PORTB 6,5, 3,2,1,0 bitjei kimenetek, de csak a 3,2,1,0 bitet szeretnénk változtatni:

  1. movlw 0x05   ; az érték, amire szeretnénk állítani a kimeneteket
  2. xorwf LATB,w ; vajon hol tér el a legutóbb beállított az újtól ?
  3. andlw 0x0F   ; nem engedjük, hogy változzon a 7..4 bit
  4. xorwf LATB,f ; beállítjuk az engedélyezetteket.


Valamilyen agymenés miatt egyes típuson a bemenetnek állított biteken nem működik megfelelően a LATx. --> 2. pont legvége.

2. Nincs LATx regiszter. Az a baj, hogy a PORTx olvasásakor nem mindig azt az értéket kapjuk, amire számítunk. Ha bemenetnek van állítva egy bit, akkor a bemenet aktuális értékét olvassuk, ha egy láb túl van terhelve statikusan, akkor mindig magas vagy alacsony szintet olvashatunk. Ha dinamikusan van túlterhelve (nagyobb kapacitás), akkor ha elég gyorsan olvassuk ki, még az előző értéket olvassuk ki. Ezek miatt az egymás utáni bsf / bcf utasításon rossz adatot írhatnak be a kimeneti regiszterbe.

A fenti módszer segíthet, hiszen nincs többszörös olvasás (csak egy) és az összes változtatni kívánt bitet egyszerre átállíthatjuk.

Vannak olyan esetek is, amikor ez a módszer kevés. Pl. programozott I2C, ahol az SDA, SCL vonalakat a TRISx regiszterrel vezéreljük, kihasználva, hogy a hozzá tartozó PORT bitet 0 -ra állítottuk. Ezután valamelyik másik bitet bsf / bcf utasítással át kívánjuk állítani. Ha a SDA vagy SCL kimenet épen nagy impedanciás és a szintje magas, a scf / bsf utasítás magas szintet (1) -et ír be a SDA vagy SCL bitjére a PORTx kimeneti regiszterbe.
Ezen probléma úgy küszöbölhető ki, hogy saját magunk tároljuk RAM -ban a PORTx -re legutoljára kiírt értéket. Ezen végezzük el a műveleteket és egyszerűen kimásoljuk (movwf PORTx) a portra.
(#) Hp41C válasza Hp41C hozzászólására (») Ápr 4, 2020 /
 
Idézet:
„Valamilyen agymenés miatt egyes típuson a bemenetnek állított biteken nem működik megfelelően a LATx.”

Helyesbítve:
Valamilyen agymenés miatt egyes típuson az analógnak állított biteken nem működik megfelelően a LATx.
(#) menyus válasza jdani hozzászólására (») Ápr 4, 2020 /
 
Lehet roszul tudom, de úgy emlékszem hogy a bemenetek nem tolerálják a VDD nél nagyobb feszültséget. Márpedig a soros dióda a tápfeszültségen feszültség esést okoz, a PIN2 pedig a dióda elé van kötve direktben, tehát ott a VDD nél nagyobb feszültség van jelen. Javítsatok ki ha tévedek, és sorry. De úgy emlékszem nekem volt már ebből gondom régebben.
A hozzászólás módosítva: Ápr 4, 2020
(#) Szemmy válasza Hp41C hozzászólására (») Ápr 4, 2020 /
 
Na ez így már érthető, és megértetted mit akarok thx
(#) Bakman válasza menyus hozzászólására (») Ápr 4, 2020 /
 
Jól tudod.
(#) Hp41C válasza jdani hozzászólására (») Ápr 4, 2020 /
 
Tegyél a +USB és a 2. láb közé 100k ellenállást.
(#) sonajkniz hozzászólása Ápr 4, 2020 /
 
Sziasztok!

PIC12F1840-el akadt problémám. Most először terveztem analóg bemenetet az RA2-es lábra.
Bármivel is próbálkozom, sehogy sem hajlandó analóg bemenetként működni.
Van valakinek tippje rá, hogy miért?
(#) menyus hozzászólása Ápr 4, 2020 /
 
Sziasztok! Szeretnék kérni egy kis segítséget. Egy LCD s dologgal szenvedek, találtam is nagy nehezen egy asm ben írt kódot (van rengeteg de mind C ben..stb) ami használhatónak látszik. Már átírtam, mert 16F84A ra volt megírva nekem meg 16F877 em van. Eddig ok, le is fordul csak éppen nem működik és tudom is miért. A probléma ott van hogy az eredeti kódban az LCD adat lábait data4 - data7 a portb 4 - 7 vezérli (jobban belegondolva ez így logikus) ami a felső nibble be esik. Én nem figyeltem erre a tervezésnél és nálam az LCD vezérlő lábak a portb 0 - 3 ig (portb0 - D7 portb3 - D4) vannak használva, azaz az alsó nibble ben. Az odáig ok hogy a portb vezérlő lábait is át kell konfigurálnom, de hogyan alakítsam át az eredeti "FOUR_BIT_MODE" és PRINT rutint hogy jól működjön a kód? Tehát gondolom az alsó nibble - t kellene először küldeni aztán a felsőt?

Az LCD EN láb pedig úgy tudom hogy aktív H, tehát alapban L ben kell tartani és csak felhúzni H ba pár ms - ra, aztán vissza. Viszont a kódban pont fordítva van használva, alapban H ba van állítva (55. sor), és a TOGGLE_E rutin is ami az EN lábat billenti, ott is fordítva van ennek a lábnak a vezérlése. Tudnátok segíteni?

Az eredeti kód PIC16F84A val
A hozzászólás módosítva: Ápr 4, 2020
(#) proli007 válasza menyus hozzászólására (») Ápr 4, 2020 /
 
Hello! Ebből láthatod a teendőket.

lcd-4bit.asm
    
(#) menyus válasza proli007 hozzászólására (») Ápr 4, 2020 /
 
Köszönöm szépen, remélem össze tudom rakni a mozaikot. Ez a kód sokkal jobban átlátható mint amivel én szenvedek. A lényeg látszik benne. De ahogy elnézem a kommentezést az "E" lábbal kapcsolatban valóban nem kerek valami az én általam belinkelt kódban, Mert Te is azt írod felfutó élre aktív. Akkor viszont nem lehet alapban H ban. Illetve lehet, akkor ha csak a felfutó él azaz a trigger számít és nem az éppen aktív állapot ami mindegy.(?)

Köszönöm.
(#) pipi válasza Szemmy hozzászólására (») Ápr 4, 2020 /
 
"2-es (utasitás) írom ugyancsak a BPORT de 6,7, és a "D"port 0,1,2,3,4 pinjeit"
ilyen nincs, egy utasítás - egy port művelet, két port művelet az két utasítás, még ha megszakadsz is
(#) proli007 válasza menyus hozzászólására (») Ápr 5, 2020 /
 
Mindig az LCD-t vezérlő IC adatlapja a mérvadó. Azt kell olvasni és a minimális időzítéseket betartani. Ez a kód sorozat nyilván nem a leghatékonyabb, de nem is ebből a célból íródott anno, hanem a megértés miatt. Ezért a rengeteg komment is..
Egy adatátvitel vezérlése mindig élvezérelt, és sosem szintvezérelt. Mert ha az lenne, megváltozhatna az adat a beolvasás alatt. (Mindig józan paraszti ésszel kell gondolkodni!)
A hozzászólás módosítva: Ápr 5, 2020
(#) sonajkniz válasza sonajkniz hozzászólására (») Ápr 5, 2020 /
 
Megette a fene ezeket a bankváltásokat!
4 órám ment rá, mire rájöttem, hogy azért nem mért semmit, mert a mérés UTÁN maradt ki egy bankváltás!
(#) menyus válasza proli007 hozzászólására (») Ápr 5, 2020 /
 
Az LCD adatlapjának az olvasása az bizony kimaradt. HD44780 alapú ez biztos, de ez egy bontott kijelző. Pontos tipust nem tudok. De hogy nem eredeti Hitachi az tuti. De tény hogy eszembe se jutott megnézni az adatlapot. De megnézhettem volna gondolom az eredeti hitachi adatlapját is, azért mert nem ők gyártották még ugyan úgy működik mert a vezérlő IC az utasítás/vezérlés és kezelés valamint a paraméterek tekintetében (elvileg ) teljesen kompatibilis az eredetivel.
Kb. 10 éve voltak gyenge próbálkozásaim LCD vel, de az igazság az hogy ingább analóg projectjeim voltak így nem is volt rá szükségem hogy mélyebben foglalkozzam vele. PIC programozást (bitfaragós asm ben) is épp csak ugatom, alap dolgokat meg tudok csinálni (portok kezelése, időzítések, USART, komparátor, referencia..stb) de pl ez a maszkolás se tiszta nekem mert sosem használtam még. Az ezekhez használatos utasítások működését sem ismerem, így ezeket körül kell járjam hogy ne csak másoljam valaki kódját és átszabjam, hanem meg is értsem mit miért, és hogyan.. Komolyabb perifériákkal se volt dolgom még, pl AD az egy fekete lyuk nekem.

Az Általad írt kód pont azért szimpatikus mert agyon van kommentelve, és nincs "eldugva" a lényeg rutinokban amiket aztán ki kell bogózni külön. Legalábbis a nagyja. Ez amolyan rávezetős "bolondbiztos" oktató jellegű kód, így pont egy olyan kezdőnek való mint amilyen én vagyok.

A Te kódoddal kapcsolatban kérdezhetek itt, vagy inkább privátban?
A hozzászólás módosítva: Ápr 5, 2020
(#) menyus válasza proli007 hozzászólására (») Ápr 5, 2020 /
 
Ma még nem foglalkoztam az LCD vel, de éjjel gondolkodtam a megoldáson. Arra jutottam hogy esetemben a portd ről portb re kell átdefiniálni, a portokat átírni (mivel nem ugyan azokat a portokat és pin eket használom az LCD vezérléséhez) Az hogy nálam a két félbyte fel van cserélve, pedig megoldható a küldés előtt egy swapf utasítással ami a két Nibble -t felcseréli. Fejben kb. eddig jutottam... Aztán meglátom gyakorlatban meg tudom e oldani, azaz jó e a gonolatmenetem.
A hozzászólás módosítva: Ápr 5, 2020
Következő: »»   1114 / 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