Fórum témák
» Több friss téma |
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.
Idézet: 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?„villog két led, kis idő után bekapcsol egy másik ami folyamatosan világít” Idézet: 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...„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.” 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!).
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.
Idézet: 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!„Ez elég kemény diónak tünik.” Idézet: 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.„Amúgy minden LED külön porton van.” Idézet: OK, ez akkor világos. „A piros LED-ek felváltva villognak” Idézet: Nézzükk azt a feladatot, hogy egy nyomógombbal ki/bekapcsolunk egy LED-et! Az egyik legegyszerűbb megoldás az, hogy:„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.” 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.
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
![]()
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:
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).
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.
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.
Ez így nehéz lesz, mert a megszakításokkal nem vagyok tisztába. Mindig belekeveredek, de azért megpróbálom.
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?
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...
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.
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).
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.
Mint elítettem nagyon köszi és elnézést a sértő "hangnemért".
![]()
Nem volt sértő!
Ha kell akkor segítek a programozásban.
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.
Neked legalább villamos szakmád van, nekem meg vasas.
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.
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!
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!
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.
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.
Készítettem folyamat ábrát. Igaz, hogy kezdetleges, de én megértem.
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>>>>
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.
Ü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! ![]() ![]()
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
É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...
Köszönöm!
És elnézést, assembly nyelven gondoltam. |
Bejelentkezés
Hirdetés |