Fórum témák
» Több friss téma |
Meg tudná valaki mondani hogy lehet egy pic(16F877) assembly-ben irt programjaban egy bejövő megszakítási jel után szoftveresen tiltaniezen jel ujboli feldolgozasat egy adott ideig? Mindezt ugy kellene, hogy az egyeb bejovo jelek feldolgozasa tovabbra is menjen.
Kosz.
Ez így nem teljesen egyértelmű, de a korábbi, időzítős kérdésedre a válasz: létre kell hozni egy időzített megszakítást Timer vagy CCP modulok használatával, ami ismert hosszúságú. Ennek a bekövetkezéseit számolod, adott számnál megvan a várt időtartam. Pl. 1 sec időzítésnél kétbyte-os számlálásnál 18 órát is tudsz időzíteni. Persze elegánsabb volna egy olyan külső tag pl. 555-tel, ami hosszabb időtartamokra van beállítva, és akár SLEEP-ből is ébrsztheti a procit.
A megszakítást okozó jelet úgy tiltod, hogy nem engedélyezel neki további megszakítást (pl. INT tiltott ha INTE=0). Az adott ideig tartó tiltást nem egészen értem, alapból ilyet nem tud a proci, neked kell időzített ciklust létrehozni, és abban tiltani vagy engedélyezni a feldolgozást.
Az INTE=0 azert nem jo az en esetemben, mert az ontozo vezerlonek egyeb funkcioi is vannak(pl kezi bekapcsolas) amire mondjuk napkozben is szukseg van(amikor a fenyerzekelo jelfeldolgozasa tiltva van).
Ezek is RB0/INT megszakitas reven hagyatjak abba a PIC-el a vegtelen ciklust(amiben alapallapotaban van), tehat a megszakitast nem tilthatom. Azt fogom megprobalni amit javasoltal, hogy Timerrel kétbyte-os számlálással idozitek, ami ha tulcsordult atallit mondjuk egy bitet es ettol kezdve ha bejon egy jel a fenyerzekelotol akkor engedi feldolgozni, addig meg nem. Meg nem csinaltam Timerrel eddig semmit, de feltetelezem ez a programtol fuggetlen idozito, mint pl a WDT, azaz a PIC lehet sleepben, vegtelen ciklusban, vagy eppen a program valamelyik resze futhat rajta, ez attol fuggetlenul szamol. Illetve mivel a 2 byte-os szamlalot leptetgeti, ez nem zavar be az amugy futo programba? Biztos amator a kerdes de tenyleg nem idozitettem meg semmit. Kosz
Böngészd át az adatlapot, 3 időzítőt is találsz a prociban. A Timer0 programozható előosztóval rendelkező 8 bites, a Timer1 szintén előosztható 16 bites, a Timer2 pedig elő- és utóosztóval felvértezett 8 bites időzítő. Mindegyik túlcsordulása tud megszakítást generálni, az ezt lekezelő rutinban pedig állítgathatsz biteket, vagy regiszterek tartalmának inkrementálásával / dekrementálásával, és összehasonlítással tovább ki tudod terjeszteni az időzítést.
A programba való belezavarás elkerülése érdekében különösen ajánlott az adatlap átnézése, mivel az egyes modulok több más modul működésétől, engedélyezésétől is függenek (pl. a Timer0 és a Watchdog ugyanazt az előosztót használják, de egyszerre csak egyikük használhatja; Timer2 adja a PWM-kimenet órajelét). A konkrét megvalósításhoz abból kell kiindulni, hogy mely erőforrásokat foglalja le a jelenlegi program, és mit lehet elérni a szabadon maradt modulokkal.
Szenvedek tovabb ezzel a napi 1x-i bekapcsolassal. Nezegettem a timer0-t, novelgettem regisztereket stb. Megy a dolog, de az a problemam, ha a programban mondjuk tortent egy RB0/INT megszakitas, ami mondjuk percekig tart lekezelni (mondjuk kezi vezerlessel annyi idore bekepcsolom az ontozorendszert) akkor ez ugy tunik felfuggeszti a timeres megszakitast ill. annak szamlalasat (5 perccel kitolodik a kovetkezo timeres megszakitas ideje). Hogyan tudom igy a timert egy fix idotartam meresere hasznalni? Csak emlekeztetonek az alap problema: pirkadatkor egy jel erkezik (PIC elinditja a napi ontozest) - ezutan meg szeretnem tiltani az ismetelt jelfeldolgozast kb 20 orara(ujbol ejszaka lesz addigra). Igy csak napi 1x hajnalban ontozne.
Kosz.
5 perccel nem tolódhat ki a Timer0 periódusa, max. programhiba miatt.
Nem egészen értettem, minek kap a proci megszakítást, ha kézzel öntözöl, de végül is mindegy. A Timer0 "szabadonfutásának", azaz a folyamatos időzítésnek a menete: - OPTION_REG regiszterben PS2S0 bitekkel beállítani az előosztót - ugyanitt PSA bit törlése, hogy az előosztót a Timer0 használhassa - INTCON regiszterben T0IE beállítása, interrupt engedély - ugyanitt GIE beállítása, globális interrupt-engedély Gondolom, ezek neked is ugyanígy vannak, és csak egyszer, az inicializálás során kell végrehajtani. Ezután a Timer0 már bármikor indítható az OPTION_REG T0CS bitjének törlésével, és folyamatosan működni is fog. Minden túlcsorduláskor bebillenti az INTCON T0IF bitjét, erre jön a megszakítás, ahol számolgatsz, és a RETFIE utasítás előtt törlöd a T0IF bitet. Ha ez nálad is így van, és mégsem jó, akkor már többet kellene látni az eszközből meg a progiból.
Igy van minden sztem. Melléklem a programot (nem a bonyolult öntöző progi, hanem a timer + RB0/INT interrupt együttes használatának szimulálására irt tesztprogramom). Timerre 'XOR-olja' a ledeket (kb 16sec-ként), RB0/INT megszakitasra egy 5 sec idotartamu (bocs most látom 5 percet irtam) másik programrészlet indul el és ilyenkor 16+5=21 sec utan valtanak a ledek a timer megszakitasra. A baj ezzel az, hogy egy tobb funkcios öntözőről van szó, azaz azon tulmenoen, hogy napi egyszer vegig ontozi a kulonbozo agakat(magnesszelepek nyitnak egymas utan), kézzel is be tudok kapcsolni egy tetszőleges ágat (radios tavkapcsolo gombjat annyiszor nyomom le ahanyadik ag magnesszelepet akarom kinyittatni a pic-cel, majd bekapcsolja a motort stb.) Nem akarlak a reszletekkel untatni, csak hogy miért kell a pic a kezi ontozeshez is. Szoval teszem azt egy adott nap tobbszor csinaltatok vmit a pic-cel RB0/INT megszakitassal, aminek az idotartama kitolja a timer idoziteset, igy pl kovetkezo napfelkeltekor hiaba jelezne a fenyerzekelo, a timet meg mindig tiltja a jelfeldolgozast. Udv.
Pár dolgot mondanék így elsőre, írásban kicsit nehéz ezeket vesézni, így tárgyilagos leszek:
Megvizsgálod RA3 állapotát, ha 1, nyugtázod az RB0 interruptot; miért nem INTF bitet vizsgálod? Nagyon illetlen dolog megszakítás-kezelőben jó hosszú késleltetést megírni, értelmét veszti az egész megszakítás, ráadásul a verem is túlcsordulhat. Inkább be kellene állítani egy bitet, aztán a főprogramban ennek hatására megcsinálni a késleltetést, és törölni a bitet, hogy a következő megszakítás megint beírhassa.
Nagyon koszonom a segitseged, atirtam, hogy a megszakitsi lapon csak 1 bitet allitson at(RB0 eseten) illetve leptesse a Timeres szamlalot(Timer megsz. eseten). Megy, bar egy 5%-al lassul a timeres megszakitas ha kozben sok RB0 interrupt kovetkezik be. Ez gondolom normalis (az en alkalmazasomban mindenesetre nem zavaro). Azert nem INTF bitet vizsgálom, mert az ontozo vezerlo programban sok minden tud RB0 megszakitast okozni(ezek egymastol egyeniranyitoval el vannak szeparalva mielott az RB0/INT labra is ra lennenek kotve.
Lehet ez igy vadul hangzik, nem tudom egy hozzaerto ezt hogy oldana meg, en igy tudtam megoldani szereny tudasommal. De igazabol rajottem a valaszod alapjan, felesleges az RB0 interrupt, mikor alap allapotban a program egy NOP-ot "csinalo" vegtelen ciklusban van. Ebben a ciklusban kellene vizsgalgatni az egyes bemeneti labakat es a megszakitasi lapot csak a timer hasznalna. Nem is ertem mire hasznaljak altalaban az RB0 vagy a PORTB4:7 megszakitast (esetleg ha SLEEP-ben van a PIC alapbol, akkor ez felebreszti gondolom). Bocs az egesz biztos amator megkozelitesi modomert, kerdeseimert, de 2 honapja foglalkozok PIC-cel egyaltalan(viszont ezalatt teljesen mukodokepesre "farigcsaltam" az ontozo vezerlo progim, ami mindent csinal amit szerettem volna, ugyhogy teljes a sikerelmeny). Kosz megegyszer.
Igazán nincs mit, örülök, hogy sikerült
Kötözködhetek még egy picit? Ha sok olyan vonal van, ami RB0 megszakítást okoz, úgy írnám a rutint, hogy az INTF vizsgálata meghatározza, RB0 volt vagy sem, utána pedig a bemenetek lekérdezésével eldönteném azt, hogy konkrétan melyik periféria jelentkezett. A végeredmény gyakorlatilag ugyanaz, csak a kódot teszi szebbé, olvashatóbbá. Egyébként teljesen jogos az RB0 interrupt száműzése, és helyette a bemenetek pollingozása, ha nem küldöd el SLEEP-be a procit. Mivel semmi más dolga nincs, vizsgálódhat folyamatosan. Sőt, még az is lehet, hogy gyorsabb lesz a polling, bár ez nem determinálható így. A megszakítás ugyanis csak a nevében jelent azonnali megszakítást, a valóságban eltelhet pár usec, mire a végrehajtás a vektorra ugrik. Ráadásul polling előtt és után nem kell regisztereket sem menteni, megint spóroltál egy kis időt. Nem nevezném amatőrnek a megközelítést, szerintem büszke lehetsz, ha két hónap alatt a semmiből ennyire jutottál. Gratulálok hozzá, és további kitartást kívánok a jövőbeni projektjeidhez
Üdv érdeklődni szeretnék hogy hogyan lehetne megoldani az alábbi 220V éjjelilámpa működtetését 12V-ról.
Lehetséges ?Itt a rajz.
Hali!
Ha arra gondolsz, hogy a glimm helyére 12V-os izzót teszel, és 12V-ról használod, akkor megoldható, de szerintem inkább használd fel a foto-ellenállást, és komolyabb tranyót használj, mint ami ebben van.
Tudnál rajzot hozzá
Bővebben: Link
Nyugodtan használhatod 12V-ról. Ha izzót szeretnél hajtani, a második tranyó helyett használj "komolyabb" tranyót, vagy a LED helyére tégy relét, és azzal kapcsold. (Utóbbi esetben természetesen a LED-el sorbakötött ellenállás nem kell.)
Bővebben: Link
ezt a kapcsolást megépiteted a 330-500ohm os ellenálas te hány ohm osat raktá bele Link javítva. -- kobold
Helló!
Ezt a kapcsolást akarom elkészíteni, már minden megvan hozzá kivéve a fotoellenállásokat amik kék, zöld és piros színre reagálnak. Ezeknek kellene a típusa és boltban megtudnám rendelni. Segítene ebben valaki?
Hali
Ezek normal fotoellenallasok, es az optikaban vannak a szinszurok. Tehet 3 egyforma fotoellenallast kell vasarolni. Udv Vili
Köszönöm a választ.
Akkor azok a ovális alakzatok a színszűrűt jelölik? Tehát veszek 3 egyforma ellenállást és bemegy egy optikába és kérek színszűrőt? Azok mekkorák? Vagy van különböző méretben? Mennyibe kerülnek?
Hali
A rajz szerint van harom tubus, amiknek az eleje lencse, utana a szinszuro, majd a LDR. A szinszuroket esetleg diszkos boltokban lehetne kerni. Sok nem kell, mert a tubus atmeroje 1-2 cm (lencsetol fugg). Udv Vili
Hogy-hogy nem kell sok?
Az nem egy kör alakú műanyag, amiből egyet veszek? Veszek 3 féle színt, 3 lencsét és készítek egy tubust, összerakom az LDR elé teszem. Ugye?
Hali
Gondolom harom erzekelo, harom tubus. Mivel a LDR nem nagy, igy a tubusok sem nagyok. Tehat ha 2 cm atmeroju lencsed van, akkor szuro is kb ekkora kell. Ilyen szuroket hasznalnak a diszkos lampak ele, de ha tudsz szerezni szines cellofant az is megteszi (papirbolt). Nem tudom mire akarod hasznalni ezt a kapcsolast, de ha nem kell preciz atvaltas akkor barmilyen szines folia megteszi. Udv Vili
Nem fontos, hogy precíz legyen, csak hobbiból csinálnám. Megpróbálom a fóliát.
Köszönöm.
Már majdnem leírtam, hogy készen lehet ilyen érzékelőt venni....
Ha gondolod belinkelheted kíváncsi vagyok rá.
És 2cm átmérőjű lencsét, optikában tudok venni?
Hali
Nem tudom hol lehet venni de esetleg a kereso megmondhatja. Udv Vili
Hali en megepittettem ezt a kapcsolast: Bővebben: Link es nem tudom hany Ohm os ellenallast tegyek esteleg helyette vagy mivel van a gond mert allandoan eg a led
Legyél szíves használd a LINK gombot! --vicsys
Bocs hogy nem értem, mi helyett szeretnél ellenálást tenni?
|
Bejelentkezés
Hirdetés |