Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Szia Watt
Igen, erősen nézegettem azt az oldalt, szinte meg is tanultam Hogy milyen nyelven? Háát, c# és társait nem nagyon szeretem, kivéve PHP- ami ugye C# nyelven van, de ez nem ide tartozik... Sima Assembler, vagy pontosan nem tudom hogy nevezik, felraktam egy példa progit, ezt én írtam, nem sok mindent csinál, sőőt még nem is próbáltam ki (nem volt mivel) Tehát, ha jól tudom, és jól értem, előbb a Break-ot kell figyelni?
Hello!
Elérkeztem a tanulás során a megszakításokhoz, és írkáltam egy-két kis ledvillogtató progit, ami különböző egyszerű effekteket csinál interrouptok hatására. Az egyik megszakítást a Timer0, a másikat pedig az Int0 adja. Mikrokapcsolót használok az Int0-án, de sajnos előjött a pergés problémája. Potyo egy régebbi hozzászólását idézném, és ehhez lenne egy kérdésem. Idézet: . „Egyet szögezzünk le: a külső megszakítás nem a pergésre hajlamos jelek számára van kitalálva!” A kérdésem az lenne ezzel kapcsolatban, hogy alapvetően egy eszköz használata során, ha különbötő funkciógombok lenyomására szeretnénk reagálni, akkor az érdemesebb megszakításként kezelni, mint állandóan ciklikusan ellenőrízgetni, hogy vajon lenyomták e már, nem? Tehát, hiába nem kapcsolókhoz van kitalálva, ha egyszer szükség van rá, akkor nem kell elzárkózni a használatától. Gondolkodtam azon, hogy hardveresen hogyan lehetne lekezelni a dolgokat, és aztán a PIC-et a megszakításkor már csak kész tények elé állítani, találtam is egy kapcsolást Topi egyik cikkében, de ez egy logikai áramkörös megoldás (ha jól értelmeztem). Egyszerűbb alkatrészelből nem lehet megoldani ezt hardverszinten? Elnézést kérek azoktól, akiknek már nagyon elege van ebből a témából, de erre még nem találtam mintát itt a fórumon. üdv! Idézet: „Hogy milyen nyelven? Háát, c# és társait nem nagyon szeretem, kivéve PHP- ami ugye C# nyelven van, de ez nem ide tartozik...” ??? C# ? Hogy jon ez a PIC Miertekbe? Idézet: „#include Heh??? Na jo, lehet ma nagyon negativ vagyok...
Szerintem nem okoz jelentős terhelést a kontroller számára egy Timerrel figyelni a bemeneteket és szoftveresen pergésmentesíteni, ráadásul nemis időkritikus a gombra reagálás. Vagy ha már ez a kis terhelés probléma, akkor ott már nem biztos, hogy a kontroller alkalmas a feladatra, vagy esetleg valamivel magasabb órajelen kellene járatni. Szóval én nem használnék külső megszakítást nyomógombokhoz, kivéve ha a nyomógombnak fel kell ébresztenie a kontrollert alvó állapotból. De ott is csak a felébresztés az, amit arra bíznék, magát a gomb lekezelését már nem.
Értem, és köszi a választ. Csak a kíváncsiság dolgozott már megint bennem.
Potyo megelőzött, egy másik számlálóval bizonyos ideig letiltod a külső megszakítást, majd ha letelt az idő, törlöd a jelzőbitet és engedélyezed újból a megszakítást. Gombok vizsgálatára inkább használd a portB változását jelző megszakítást. A megszakítás, csak a változást jelzi, a megszakításban pedig lekezeled az adott gomb funkcióját. Emberi kézzel történő gombnyomás ideje jóval hosszabb mint a megszakítás bekövetkezése és a port vizsgálata. A segédszemlálós pergésmentesítés itt is használható.
Elnézést, a választ olala-nak szántam.
A programodhoz nem sokat tudok hozzá fűzni. Javaslom, hogy próbáld meg az MPLAB szimulátorát kiismerni, használni, megérteni mi mit okoz.
Sok esetben az az érzésem, hogy csak felületes és vélt következtetéseid vannak, és erre akarsz légvárat építeni. Azt mondod megtanultad az oldalt, de még mindig azt kérded, hogy hogyan kell lekezelni a folyamatot. Az oldalon tökéletesen le van írva, mit hogyan kellene tenned. Jó nincs lekódolva, de ha magad akarod írni a kódot, akkor nem csak az assembler nyelvet kell megismerned, hanem az eszközt, a kommunikációt, és az elektromos hátteret is. Én azt saccolom, hogy neked ez néhány hónapos meló lesz, akkor is, ha hajlandó leszel végre lépésről lépésre haladni, és megérteni a folyamatokat. Egyébként jól mondod, először a Break-ot kell figyelni, de ez csak az elmélet. Azon is töpprengj el, hogy ezt hogy kódolod le! Nagyon elvi síkon vagy, semmi konkrétum, sok szöveg! Azért nehogy feladd!
Sejtettem hogy nekem szólt az üzeneted.
Ezen a számlálós, letiltós eljáráson már korábban gondolkodtam, meg is csináltam azt, hogy az esemény lekezelésének első sorában kikapcsoltam a külső megszakítás, meg töröltem a flagbitet, majd elintéztem a teendőket, aztán interrouptokat újra engedélyeztem. De az volt a baj, hogy a PIC ettől függetlenül számolja a beérkező megszakításikérelmeket (ami máskor nem lenne baj, csak most a pergés miatt), és kétszer csinálta meg az eljárást, de olyan is volt hogy sikerült csak egyszer (biztos baromi gyorsan nyomtam a gombot ). PortB4:7 megszakítás meg az Int0 között nem érzem a különbséget. Az rendben van, hogy felfutó él és lefutó él, ezt értem, de a végeredmény mindenféleképpen egy megszakító flag lesz, ami beléptet a megszakításba. Vagy a különbséget abban kellene látnom, hogy a PortB4:7 esetén egy kalap alá vesz 4 legetséges portot, az Int0 meg egy kitüntetett és egyértelműen meghatározott flagot ad?
Éppen ezért ne a megszakítás kiszolgálása végén engedélyezd újra a megszakítást, hanem amikor lefut a számláló. Ha a számláló késleltetése sem elég, akkor egy regiszterrel tovább többszörözheted az időt.
Azon túl, hogy a külső megszakítás korlátozódik a portB0-ra, ez a megszakítás felfutó, vagy lefutó élre aktivizálódik. A portB4:7 pedig állípotváltozásra, mindegy milyen az él iránya, ha akármelyik láb értéke változik jön a megszakítás, és neked kell vizsgálni mi történt.
Üdv!
Valami olyasmit szeretnék PIC -el megvalósítani, hogy az egyik porton négyszögjelet kiadni fokozatmentes állítási lehetőséggel. Kb. 1Hz - 1KHz között Tudna valaki felvilágosítást adni hogyan lehet ezt programozástechnikailag megvalósítani.
Igen, ez igy hülyeség ahogy fogalmaztam, kis lépésekben gondoltam 1 Hz körül.
Azt PWM modullal lehet. Egy kis szoftveres ügyködés is kell hozzá, de simán megoldható az 1Hz-1kHz táv.
Ki tudnád fejteni egy kicsit bővebben? Nem foglalkoztam még a PWM modullal. Az elv érdekel hogyan lehet kivitelezni.
Nem régen írtam megszakításból működő, blokkolást nem tartalmazó szoftveres soros vevő rutint Pic18 RB1 lábra, de idő hiányában még csak a szimulátorban volt letesztelve. Ha gondolod teszteld le és ha működik akkor használd fel egészséggel.
Ha csak az adást kell kapcsolgatni akkor biztos hogy semmi beérkező adatról nem fogsz lemaradni.
Első körben az adatlapban megnézed, hogy működik a PWM modul. Ezután ha kisebb frekvencia kell, akkor szoftveresen mindig akkora kitöltési tényezőt adagolsz be a PWM modulnak, amilyen jelet vársz a kimenetén. Tehát ha neked a PWM modulod mondjuk 1kHz-es jellel dolgozik, de egymásután négyszer 0%-os, majd négyszer 100%-os kitöltési tényezőt adsz neki, akkor a kimenő jeled valójában egy 125Hz-es négyszög lesz. Így gyakorlatilag mixeled a hardveres és szoftveres előállítást. A szotveressel csökkented a frekvenciát, míg a hardver a pontosságért felel.
CCP modul compare üzemmódja is jó erre a feladatra, és így minden a hardware-ra van bízva. Csupán Timer1 osztó(i)val kell számolni, hogy mekkora frekvenciáig akarsz elmenni, és hogy mekkora felbontást akarsz.
Háh, már most kicikizik a forrásfájlom tartalmát Igen, ezt én írtam, és ha valami gond van vele, szólj
Egyébként így könyebb nekem, ha odaírom, mi mit csinál... Igazából nekem az elméletet gyakorlattá való fordítás nem nagyon szokott menni! Tehát az USART igazi működését elképzelni még nem tudtam... Nah, valahogyan csak sikerül kitalálni, viszont én használom az MPLAB-ot a 7.50-es az, ami most fenn van, viszont nekem 2 dolog nem megy igazán, az egyik a Megszakítás(Interrupt), hogyan is működik, tehát van egy végtelen ciklusú rész a programban, ez most lehet egy LED villogtatás, és ha egyik bemeneten van egy szintváltozás, akkor hova ugrik a program, és mi az, ami ugrassza A másik az USART! Köszönöm az eddigi segítségeket, neked is Watt, majd megmutatom, mit sikerült alkotni
ITT olvashatsz egy pár szót a témáról. Érdemes még figyelmesen elolvasni potyo és trudnai válaszait is cpumaster ezen irányú kérdéseire.
Idézet: „a Megszakítás(Interrupt), hogyan is működik, tehát van egy végtelen ciklusú rész a programban, ez most lehet egy LED villogtatás, és ha egyik bemeneten van egy szintváltozás, akkor hova ugrik a program, és mi az, ami ugrassza” Ami ugrasztja a programot, azok a különböző perifériák, ami a PIC-ben a processzor mellett vannak. A megszakítást fel lehet fogni egy olyan eljárásnak, amibe a "perifériák lépnek be" egy eseményre reagálva - jelen esetben akkor, ha a PORTB 4..7 bitjein változott valami - megszakítva ezzel a főprogram menetét. Miután az eljárás befejezte a tevékenységét, folytatódik a főprogram. A megszakításkor az "Interrupt Vectorra" (16F-en a 4. programmemória cím) ugrik a processzor, itt kell feldolgozni a perifériától kapott adatokat. 18F-el még nem volt dolgom, nem tudom mi hogy van. Át kell tanulmányozni az adatlap ide vonatkozó részét (Interrupt Logic vagy valami hasonló a fejezet címe) már az ábrák is sokat segítenek!
Par napja is irtam epp errol itt ezen a forumon valakinek. Ha kicsit vissza olvasgatnal meg is talalnad... De javasolnam, hogy olvasgasd a neten vagy a Konya fele konyvben pl hogy mi az a megszakitas, hogy mukodik, nezd meg a mid-range manualt is es a PIC-ed adatlapjat is. Azert irkaljak ezeket hogy el is olvassak oket...
Idézet: „Egyébként így könyebb nekem, ha odaírom, mi mit csinál...” Mi is így szoktuk, csak mi azt írjuk oda amit tényleg csinál. Nem lehet fórum keretein belül megtanítani valakit egy digitális számítógép működésére. Mi hiába olvassuk el helyetted a megszakításokról szóló részeket, nem beszélve a többiről, amit szerintem szintén nem olvastál még el! Ezt abból gondolom, hogy a válaszaid gyakorlatilag offok, mivel a saját problémáidról írsz, a helyett, hogy egy értelmes kérdést feltennél. Azért nem tudsz értelmeset kérdezni, mert fogalmad sincs az alapokról. Ezt pótold be, és utána nagyon szívesen segítünk megírni a programot. Jó kérdéseket tegyél fel, mert a hogyan kell megoldani a megszakítás kezelését nem jó kérdés. Azok pl. hogy hogyan és miért kell menteni a szükséges regisztereket, milyen címen kezdődik a megszakítás lekezelése, mivel kell visszatérni megszakításból, miért nem kell a megszakításban tiltani a megszakítást, miért kell törölni a megszakításjelzőket és egyeseket miért nem, hogyan tudom hogy mi szakított meg, hogyan kell elágazásokat feltételek szerint megoldani... Végtelen jó kérdés van.(sokra a legjobb válasz, hogy az adat5lap még példákat is ad ezekre, ezért ne vedd rossz néven, ha ezt ajánlja valaki!) A "hogyan építsek atomreaktort házilag" jellegűek nem megválaszolhatóak, csak cseszegetést fogsz kapni, ha ilyet felteszel! Sok sikert!
Hello
Valaki tudna segíteni? Elektromos kapumhoz készítettem egy PIC elektronikát de nem tudom megírni a programot. Nem olyan bonyolult de nem tudom megírni. A elképzelés az lenne, hogy van egy impulzus, ami a távirányítótól jön, a két végén lenne egy-egy végállás kapcsoló és a pic eldöntené hogy merre induljon el, még ellnem éri a következő végállás kapcsolót addig mégse állna, még a távirányítóra se reagálna. Idézet: „Elektromos kapumhoz készítettem egy PIC elektronikát de nem tudom megírni a programot. Nem olyan bonyolult de nem tudom megírni.” Persze, szivesen segitunk, meddig jutottal el, vagy hol akadtal el?
Túl azon, hogy nem sok vállakozót fogsz találni egy komplett program megírására (vagy mégis, mert ez nem túl bonyolult feladat), a kapcsolás sem tökéletes. A PIC körül alapvető dolgok hiányoznak (csak hívószónak: tápszűró kondi, kvarc/rezonátor, MCLR, persze, döntés kérdése, de minden mégse hiányozzon). A Távirányító bemenetet én biztos, hogy az RB0-ra tenném, így lehetne a PIC-et altatásból ébreszteni.
Ezt a feladatot PIC nélkül is meglehet oldani és akkor a programozás sem okozna gondot...
Igazából nem ragaszkodom a pic-hez de ezek voltak itthon és úgy gondoltam nekivágok. De ha valaki tud más megoldást szívesen fogadom. A programot saját magam szeretném megírni, csak segítség kell hogy hogyan vágjak neki. Télég a rajból hiányzik a kvarc!
Hát a kvarc az épp nem muszáj, mert van belső oszcillátor, de a tápszűrő az bizony tényleg kell. Az MCLR-t ki lehet kapcsolni, de akkor meg nem jó lebegni hagyni a lábat, tehát ígyis-úgyis kell rá valami fel vagy lehúzó - ezért én kikapcsolnám, és oda tenném az egyik nyomógombot/kapcsolót
Oszcillátor ha kivan kapcsolva akkor nem kell semmit rákötni? Kikapcsolás a __config _INTRC_OSC_NOCLKOUT bűvös szóra megy? MCLR hogyan kapcsolom ki? A nyomógombot csak úgy testhez vagy valami ellenállással?
|
Bejelentkezés
Hirdetés |