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   62 / 1214
(#) szitko válasza icserny hozzászólására (») Ápr 10, 2010 /
 
Köszönöm válaszod. Rövid tömör leírásban, azt kéne a proginak csinálni, hogy: villog két led, kis idő után bekapcsol egy másik ami folyamatossan világít, de a két led villog tovább. Ha megnyomok egy gombot egy másik porton egy led kezd villogni és ugyanúgy egy kis idő után bekapcsol egy folyamatossan világító led. A progit töbször átírtam és az MPLAB sim-el próbálgattam, azért van benne olyan összevisszaság a kommenteknél. Próbálok párhuzammossan tanulni és programozni egyszerre, de a tanulás csak autodidakta megy és nagyon lassan. Ezért kértem a segítséget.
(#) icserny válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Idézet:
„villog két led, kis idő után bekapcsol egy másik ami folyamatosan világít”
Maradjunk annyiban, hogy kapcsolási rajz hiányában fogalmam sincs, hogy hova milyen LED van kötve. A program elemzése szempontjából ennek nincs is jelentősége. Azt mondd meg, hogy a két LED az egy vagy két külön kimenetet jelent-e, s hogy a két LED együtt villog, vagy ellenütemben? Mennyi idő telik el az állapotváltások között? A "kis idő után" számszerűen mennyit jelent?
Idézet:
„Ha megnyomok egy gombot egy másik porton egy led kezd villogni és ugyanúgy egy kis idő után bekapcsol egy folyamatosan világító led.”
Gondolom, erre szolgálna az SP-hez való ugrás... Nos, ennek a nyomógombot kezelő része szerintem teljesen elhibázott, mert SF-ből lenyomáskor átugratsz SP-be, de ott ismét gombvizsgálat következik, s mivel a gomb még mindig le van nyomva, visszaugratsz SF-be és onnan megint vissza SP-be...

Ezt úgy kellene csinálni, hogy a második gombnyomást addig nem várod, amíg az első gomblenyomást a gomb felengedése nem követte. Súlyosbító körülmény, hogy a nyomógomb pergését is "kezelni kell" valahogy.

Szerintem előbb a részfeladatokkal próbálj megbírkózni, s a mostani felaldatra csak akkor térjünk vissza, ha már meg tudod oldani, hogy egy LED folyamatosan villog, s közben egy nyomógombbal egy másik LED-et ki-be kapcsolgatsz mellette (a nyomógomb pergésmentesítését is megoldva!).
(#) szitko válasza icserny hozzászólására (») Ápr 10, 2010 /
 
Ez elég kemény diónak tünik. Amúgy minden LED külön porton van. A piros LED-ek felváltva villognak, mint egy astabil multinál, a villogás 1s-os. A folyamatosan világító LED 5s-után kapcsol be. Ezt azért nem írtam le mert az elmélethez nem tartottam fontosnak. A kisérleteim folyamán már észrevettem a gombok hibás működését, de a neten külömböző példákat nézve sem találtam jobb megoldást. Marad a kemény tanulás tovább. Köszönöm a felvilágosítást.
(#) icserny válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Idézet:
„Ez elég kemény diónak tünik.”
Bizony, nagy fába vágtad a fejszét, tehát ne csodálkozz, ha nem megy egyszerre! Ezért javasoltam, hogy bontsuk lépésekre!
Idézet:
„Amúgy minden LED külön porton van.”
Ez képtelenség, mert összesen két portod van: PORTA és PORTB. A LED-ek legfeljebb külön portlábon (a program szempontjából külön biten) lehetnek.
Idézet:
„A piros LED-ek felváltva villognak”
OK, ez akkor világos.
Idézet:
„A kisérleteim folyamán már észrevettem a gombok hibás működését, de a neten különböző példákat nézve sem találtam jobb megoldást.”
Nézzükk azt a feladatot, hogy egy nyomógombbal ki/bekapcsolunk egy LED-et! Az egyik legegyszerűbb megoldás az, hogy:
Az inicializáslás után egy végtelen ciklusban
1. Megvárjuk a gomb lenyomását
2. Várunk valameddig (10-30 ms)
3. Megvárjuk a gomb felengedését
4. Várunk valameddig (10-30 ms)
5. Ellenkezőjére váltjuk a LED állapotát
6. Visszaugrunk az 1. ponthoz

Erre tudsz írni egy programot?
Az 5. pontot ízlés szerint áthelyezheted bárhová, pl. a 2-3 közé, hogy ne felengedéskor, hanem lenyomáskor váltson a LED.

A LED állapotváltásához az XORWF utasítást ajánlom. Pl.
MOVLW 0x06
XORWF PORTB,F
SP1 és SP2 állalpotát ellenkezőjére váltja.
(#) szitko válasza icserny hozzászólására (») Ápr 10, 2010 /
 
Azthiszem valahogy igy oldanám meg az felső feladatot. Nem vagyok benne biztos, hogy jó is, a MPLAB SIM nem írt hibát, de magamtól csináltam. Ez már haladás

gomb.asm
    
(#) icserny válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Nagyjából így gondoltam, csak néhány javítás kell:
1. A felengedésre váráskor nem az elejére kell visszaugrani, hanem a mostani BTFSC utasítás elé kell egy címkét tenni, és oda kell visszaugratni.
2. A nyomógomb egy portlábat szokott lehúzni földre, amelyet a nyomógomb elengedett állapotában egy ~10 kohmos ellenállás húz fel. Lenyomott állapotban tehát a bemeneten alacsony szintet érzékelünk. A lenyomást tehát az alábbi ciklusban várhatjuk meg:
  1. GOMB
  2.     BTFSC    PORTA,0
  3.     GOTO    GOMB

A programod pont a fordítottját csinálja, tehát a BTFSS és BTFSC utasításokat meg kell cserélni!

Az oszcillátor milyen frekvencián jár? (Ehhez kell igazítani a késleltetést).
(#) szitko válasza icserny hozzászólására (») Ápr 10, 2010 /
 
4 mhz-en megy, de az igazat megvalva nem számoltam ki pontossan csak megsaccoltam. Legközelebb pontos leszek. Egy kicsit összekever a sok infó. Pláne az, hogy mindenki aki ilyesmivel foglalkozik máshogy írja le ugyanazt a megoldást. Gondolok it pl. a számokra. Bináris, decimális, hexa ez sajnos engem megkever egy pillanat alatt.... A próbapanelen a BTFSS el működött a gomb, hogy miért azt nem tudom. Igaz csak 4,7k használok.
(#) icserny válasza icserny hozzászólására (») Ápr 10, 2010 /
 
Az előző programban megoldottuk a pergésmentesítést, de ez teljesen lefoglalta a CPU-t, tehát tovább kell lépni, jobb módszert kell találni.

Most tervezzünk olyan programot, ami az inicializálás után csak időnként néz rá a nyomógombra - olyan időközzel, ami a pergési szakaszt garantáltan átlépi, de nem túl ritkán, hogy ne kelljen félóráig nyomni a gombot, hogy a lenyomás érvényesüljön. Legyen mondjuk az időköz 25 ms!

Inicializálásnál beállítunk egy számlálót 20 értékre
Ciklus:
1. Várunk 25 ms-ot
2. Megnézzük a gomb állapotát és intézkedünk (CALL GOMB)
3. Csökkentjük a számálót
Ha nulla lett, akkor átbillentjül LED1 állapotát és
újra 20-at írunk a számlálóba.
4. Visszaugrunk az 1. ponthoz

A CALL GOMB eljárás nyilván kell hogy tartsa az állapotot, és a gomb állapotának megváltozásakor mondjuk ki/bekapcsol egy másik LED-et.

Így már két feladatot párhuzamosíthatunk: az állandóan villogó LED és a nyomógombbal kapcsolt másik LED.
(#) szitko válasza icserny hozzászólására (») Ápr 10, 2010 /
 
Ez így nehéz lesz, mert a megszakításokkal nem vagyok tisztába. Mindig belekeveredek, de azért megpróbálom.
(#) szitko válasza icserny hozzászólására (») Ápr 10, 2010 /
 
Lehet, hogy orjási hülyeséget írtam, de jelenleg a megtanult parancsokból ennyi tudok. Tudástáram viszont folyamatosan bővül. Persze ha a 2,5 éves kislányom hagyna tanulni. Ezért érek rá éjszaka. Egy timer megszakítási parancsal nem lenne egyszerübb?

gomb.asm
    
(#) brato válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Ment egy privát üzenet.
(#) trudnai válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Nincs "Timer megszakitasi parancs", sot semmilyen megszakitasi parancs nincs. Tovabb megyek: Meg csak parancsok sem leteznek assembly nyelven.

Szerintem egyszerubb lenne teljesen az alapoktol kezdeni, legalabbis ha meg akarod erteni ill tenyleg meg akarod tanulni a PIC-ezest. Tehat asm-ben utasitasok vannak, makrok, meg cimkek, konstansok es direktivak.

A programodban amit mellekeltel a 'CBLOCK' pl. egy direktiva, a 'GOMB' egy cimke, a 'SZAM egy konstans, a 'BANKSEL' egy makro (meg akkor is ha nem te definialtad), a 'MOVLW' egy utasitas... Csak amiatt fontos ez, mert ha meg szeretned ezeket talalni dokumentacioban, akkor fogod tudni hol keresd egyiket vagy masikat.

Amit meg szeretnel valositani azt erdemes program folyamatokba szervezni es atgondolni mi hova megy, ki mit csinal. Ezt erdemes is lerajzolni papirra vagy gepen teljesen mindegy, de ugy konyebben megerted mi tortenik es hogyan kellene megvalositani az adott feladatot.

Ha jol ertem tulajdonkepp parhuzamos funkciokat szeretnel megvalositani -- LED villogas, ez egy feladat + gomb figyeles es perges mentesites, ez egy masik fuggetlen feladat. Ezt interrupt nelkul un. status geppel lehet legegyszerubben megvalositani. Most anelkul, hogy bele mennenk a reszleteibe, hogy miert, nem veletlen irtam, hogy legegyszerubben. Azonban meg ugy is bonyolultabb, mint megtanulni az interrupt kezelest...
(#) szitko válasza brato hozzászólására (») Ápr 10, 2010 /
 
Köszönöm szépen. A megszakításokat még tanultam és nem vagyok tisztában ezekkel a rutinokkal, de sokat segített. Az elektronikával nincs baj, de a progizásban nagyon kezdő vagyok. Icserny rengeteget segített amit nem tudom, hogyan tudnám meghálálni, mert nem megíratni hanem magírni akarom a progit. A progi amit küldtél abban segít sokat, hogy a kommentek magyarul vannak leírva, mert az angol tudásom =0,5-el. A programomat illetően nagy fába vágtam a kisbaltám, de majd veszek egy láncfűrészt.
(#) brato válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Nem is azért kaptad a mintát, hogy más írja meg.
Én is hasonló módszerrel tanulom a programozást és tudom, hogy néha sokat segít egy működő program tanulmányozása.
A kapcsolási rajzot azért küldtem, hogy egészben lásd a program megoldásait(megszakítás a gombkezelésnél).
(#) szitko válasza trudnai hozzászólására (») Ápr 10, 2010 /
 
Ezekkel mind tisztába vagyok. Elnézés kérek, legközelebb ezeket a szavakat fogom használni, csak Én konyhanyelven sokkal könnyebben meg tudok tanulni mindent.
(#) szitko válasza brato hozzászólására (») Ápr 10, 2010 /
 
Mint elítettem nagyon köszi és elnézést a sértő "hangnemért".
(#) brato válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Nem volt sértő!
Ha kell akkor segítek a programozásban.
(#) szitko válasza brato hozzászólására (») Ápr 10, 2010 /
 
Köszi, a felajánlást. Elég nehéz csupán villanyszerelői szakmunkás végzetséggel az internetről megtanulni mindent. Pedig próbáltam tanárt keresni a pic témában, de Tolna megyében kihalt magántanítás.
(#) brato válasza szitko hozzászólására (») Ápr 10, 2010 /
 
Neked legalább villamos szakmád van, nekem meg vasas.
(#) Bell válasza szitko hozzászólására (») Ápr 10, 2010 /
 
PIC témában sok remek könyvet találsz, akár magyarul is. Itt a lehetőség, hogy angolul is megtanulj pár dolgot. Van egy használható fejlesztői környezeted, ott a net, minden a lábaid előtt hever, csak rajtad áll milyen tempóban tanulsz.
Régen ez lényegesen nehezebb, drágább volt. Tanulj meg élni ezzel a lehetőséggel.
Önmagadnál jobb, olcsóbb tanárt pedig ne keress. A felfedezés öréméhez egyébként sem tanár kell.
(#) icserny válasza szitko hozzászólására (») Ápr 11, 2010 /
 
Egyelőre sem interrupttal, sem hardveres időzítéssel nem akartam bonyolítani a dolgot, csak arra próbáltalak rábeszélni, hogy egyetlen programhurokba, egy időzítési láncba fűzzünk fel minden tevékenységet. Mivel az egyes tevékenységeket különböző gyakorisággal kell végrehajtani, a leggyakoribb feladathoz kell szabni az időegységet. Ebből adódóan a ritkábban végrehajtandó feladatokhoz számlálni kell az időegységeket.

A led villogtatását jól csináltad, de a nyomógombbal egy másik LED kapcsolgatására szerettelek volna rábeszélni!

Az alábbi viszont kifejezetten tilos, mivel megszakítja az időzítési láncot!
  1. BTFSS   PORTA,0
  2.         GOTO    $-1

Ahhoz, hogy az időzítési lánc ne akadjon el, csak pillanatszerű tevékenységeket szabad beiktatni. Például: Rápillantunk a nyomógomb állapotára, s ha le van nyomva, akkor bekapcsoljuk LED2-t, ha pedig fel van engedve, akkor kikapcsoljuk LED2-t. Így LED2 addig világít, amíg a gomb le van nyomva. Ez így egyszerű, csak sok haszna nincs.

Bonyolulabb feladat: Ha eltároljuk a nyomógomb állapotát, akkor a nyomógomb állapotának beolvasásakor összehasonlíthatjuk az előző állapottal, s ha mondjuk a korábbi felengedett állapotból alacsony állapotba váltott, akkor ki- vagy bekapcsoljuk a LED2-t (úgy, mint az első feladatban).

Természetesen, a nyomógombbal nemcsak LED2 állapotát kapcsolgathatjuk, hanem egy változó állapotát, ami majd egyéb tevékenységek feltétele lehet.

Fentiek fényében próbált újragondolni a korábbi feladatot!
(#) Bell válasza szitko hozzászólására (») Ápr 11, 2010 /
 
Szia!
Egy-két oldallal korábban javasolták Neked, hogy készíts folyamatábrát. Ez szemléletesebbé, áttekinthetővé teszi a programod működését, nem fogsz könnyen "belekeveredni".
Ha megpróbálod, nem tudsz majd meglenni nélküle.
(#) szitko válasza icserny hozzászólására (») Ápr 11, 2010 /
 
Tudom, hogy rosszul csináltam meg a feladatot, de már közel vagyok a megoldáshoz. Próbáltam szimulálni a hülyeségem, de hiba, hiba hátán. Igazából próbáltam csak arra az 1 LED-re koncentrálni, hogy minden probléma nélkül, jól müködjön.
(#) szitko válasza Bell hozzászólására (») Ápr 11, 2010 /
 
Készítettem folyamat ábrát. Igaz, hogy kezdetleges, de én megértem.

vábra.pdf
    
(#) icserny válasza szitko hozzászólására (») Ápr 11, 2010 /
 
Elég zsúfolt a hétvégém, ezért most csak sebtében ötlöttem ki az alábbi algoritmust (remélem, hogy nem néztem el!). Még mindig az http://www.hobbielektronika.hu/forum/topic_hsz_684138.html?highligh... leírt feladatról van szó. A főprogram gyakorlatilag ugyanaz, csak a gom figyelést részleteztem.

Inicializálás: (benne szamlalo <- 20 és G_STATE <- 0)
Ciklus:
1. Várakozás (25 ms)
2. GOMB_FIGYELO eljárás hívása
3. SZAMLALO csökkentése. Ha nulla lett, akkor LED1 állapotváltás és SZAMLALO <- 20
4. Visszaugrás a ciklus elejére

A GOMB_FIGYELO eljárás:
1. Ha a GOMB-hoz tartozó bemenet magas állapotban van, akkor: G_STATE <- 0 és ugrás 3. ponthoz.
2. Egyébként pedig:
Ha G_STATE = 0, akkor G_STATE <- 1 és LED2 állapotváltás.
3. Visszatérés a főprogramhoz (RETURN)

Magyarul: LED2 akkor vált állapotot, amikor a gombot lenyomva találjuk ÉS az előző állapot a felengedett állapot volt.

Jelmagyarázat:
<- értékadás
= összehasonlítás>>>>
(#) Bell válasza szitko hozzászólására (») Ápr 11, 2010 /
 
Kezdetnek jó!
Hasonló kellene a programról. Ott kétféle dobozt használj. A téglalap alakú legyen a műveleteket, másik legyen trapéz a feltételt tartalmazó blokk.
A műveletnek 1 ki, 1 bemenete lesz, az összehasonlításnak 1 be, 1 IGEN kimenete és egy NEM kimenete.
Több ilyennel leírhatod, nyomonkövetheted az egész program működését, sőt akár meg is tervezheted így.
Ha működik folyamatábra alapján, azt leprogramozva is nagy esély van rá.
Ez nem csodaszer, de segít abban, hogy átlásd, ne vessz el a részletekben.
(#) Pez666 hozzászólása Ápr 11, 2010 /
 
Üdv!
Valaki tudna nekem küldeni egy maximálisan leegyszerűsített perifériamegszakításos programot 16f690-hez?
Előre is köszönöm!
(#) vilmosd válasza Pez666 hozzászólására (») Ápr 11, 2010 /
 
Hali
A gepeden a ..\Microchip\mpasm suite\template\code alkonyvtarban vannak a kiindulo mintak minden tipusu PIC-hez. Benne van az IT pelda. Csak a hianyzo reszbe be kell irni a Te altalad kivant muveleteket. Azert azt is hozzafuzhetted volna, hogy milyen nyelven kivansz programot irni.
Udv Vili
(#) icserny válasza Pez666 hozzászólására (») Ápr 11, 2010 /
 
Én CCS C-ben műveltem ilyet, de föltételezem, hogy nem arra vágysz. Assembly-ben a MICROCHIP fórumán láttam egy példát. Ez a RA2/INT lbemenetet használja, s minden állapotváltozásra bekövetkező programmegszakításnál inkrementálja azt a vátozót, amit a főprogram megjelenít a PORTC-re kötött LED-eken.

Sajnos, ebben nincs semmiféle állapotmentés és helyreállítás, tehát példának nem a legszerencsésebb...
(#) Pez666 válasza vilmosd hozzászólására (») Ápr 12, 2010 /
 
Köszönöm!
És elnézést, assembly nyelven gondoltam.
Következő: »»   62 / 1214
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