Fórum témák
» Több friss téma |
Sziasztok.
Segítséget szeretnék kérni, van egy pic programom (pic16F84A), amit Basicben írtam (1 program) ennek az a lényege, ha lenyomsz egy gombot, ezt ő figyeli és bekapcsolja az egyik ledet majd x-y idő múlva lekapcsolja. Tulajdonképpen ez még nem is gond ennek itt a forráskódja. A lényeg az, hogy ez mellet nekem figyelni kéne a gombot, hogy jött-e jel be és, ha igen akkor megszakítja ezt a számlálást és újra kezdi. A bejelentkezés 10000ms időn belül kerül, sor akkor is visszaugorjon. . Én írtam rá egyet, de az iszonyú hosszú addig ismétlem a sort amig elnem érrem az 10000ms (2 program) Van a 2-es programnál rövidebb megoldás. Lehet hülyén gondoltam ki az egészet? 1 program. Dim a As Bit kezd: If PORTA.4 = 0 Then Goto kezd If a = 1 Then Goto be be: High PORTB.2 If PORTA.4 = 0 Then WaitMs 10000 If PORTA.4 = 1 Then Goto be Low PORTB.2 Goto kezd 2 program Dim a As Bit kezd: If PORTA.4 = 0 Then Goto kezd If a = 1 Then Goto be be: High PORTB.2 If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be If PORTA.4 = 0 Then WaitMs 130 If PORTA.4 = 1 Then Goto be . . . . . . Low PORTB.2 Goto kezd
Gondolom ha így akarod megoldani,akkor valami ciklust kellene rá írni.
Késleltetés - gomb ell -ha igen kilép -ciklus léptetése .... Vagy if ciklussal (feltétel nyomás van?) növelsz egy számlálót addíg míg el nem ér egy bizonyos számot, ha elérte kilép és töröl egy bitet,vagy a kezdő értékre állítja a számlálódat. Kilépés után a bit eldönti hogy határidő előtt történt e a gombnyomás.
Úgy gondolom, hogy ez nem is PIC-es kérdés, hanem inkább programozáselméleti probléma.
A dolog ott kezdődik, hogy jó lenne egészen pontosan definiálni, hogy mi a feladat. Pl.: Mit jelent a gomb lenyomása? Mit jelent az, hogy a várakozás közben "jött-e be jel" (elengedték a gombot, majd megint lenyomták?)? Mit jelent, hogy "megszakítja a számlálást"? Ha ezeket tisztáttuk, akkor sokkal közelebb jutunk a megoldáshoz. Az, hogy egy PIC-en vagy bármilyen más, programvezérelt eszközön fut-e, a problémamegoldás szempontjából egyelőre lényegtelen. A leírásodból amúgy én valami olyasmit sejtek, hogy egy gomb lenyomása után kellene egy fényt kigyújtani, ami egy idő után elalszik. Ez az időzítés viszont minden gombnyomásnál újraindul, azaz ha világítás közben nyomogatjuk, akkor mindig a legutolsó megnyomástól számtva még a beállított ideig ég a fény.
Már nem zavar, hogy ennyi felesleges topicot nyitnak, mikor van erre egy kiemelt PIC Miértek topic, mert én úgy is csak azokat a topicokat látogatom, amiket kiemeltem kedvencként megfigyelésre. Pont az ilyen szétszórt áttekinthetetlen topic dömping miatt. Elnézést az offért!
Így van, jól látod a pic a gomb lenyomásakor, ami lehet akár 140ms idő is bejelentkezik és kigyújtja a ledet.
A Led világit, amíg el nem éri pl.: 10000ms időt. De, ha közben a gombot lenyomják újra akkor a számolást is újra kezdi, de a Led égve marad. Majd, ha letelt az 10000ms és nincs bejelentkezés, akkor kikapcsolja a ledet és figyeli a gombot, hogy van-e újabb bejelentkezés és kezdi, előröl. Remélem így érthetőbb. Bocsánat, ha egy kicsit érthetetlen volt az ellőbb. Az eddigi hozzászólásokat köszönöm. Remélem, tudtok segíteni.
Kb 20 eve irtam Basicban programot utoljara, ha nem tobb, de kiserletezek az uj es modern basiccel amiben ugy tunik minden maskepp megy, ami eddig A volt a hagyomanyos Basicben az a modern Basicben B, de fordito es minden mas nelkul ime egy kiserlet:
UI: Hehe ez a sorszamozas epp jo a Basic-nek
Ok, akkor már sejtem a feladatot - de pl. mi van akkor, ha lenyomom a gombot és nyomva tartom? Az utolsó elengedéstől kell számolni az időt, vagy foglalkozni kell azzal, hogy a lenyomás pillanata számít és a nyomva tartott gomb mellett is lecsorogjon az időzítés?
Köszönöm a segítséget jó a megoldás trudnai . Kapod a pontot.
Ez megint tipikusan az a feladat, amit Timer segítségével célszerű megoldani, bár trudnai megoldása is szellemes a for változójának törlésével.
Idézet: „csak kicsit igénytelen” Na igen, nem egy jó példa egy kezdő számára a ciklusváltozó birizgálása. Ezt még C-ben sem szokás csinálni, nemhogy basic-ben. (én egyébként úgy emlékeztem, a basic nemis engedi a ciklusváltozó módosítását, de ez lehet, hogy csak a C64-en volt így)
Tudom, igenyes az mindig az interruptos megoldas Megszakitas gombnyomaskor ami felprogramozza a timert, majd a timer megszakitas lekapcsolja a led-et es nem torli a TMRIF-et igy nem jon tobb interrupt amig gombot nem nyomtak.
Nem tudom amugy a timer regiszterbe torteno firkalas miert szamit igenyes megoldasnak Meg hat ez aztan mar tenyleg nem kezdoknek valo, bar valoszinuleg Basic-ben egyszeru az interrupt kezeles is, a fene tudja. Ja, amugy a ciklusbol torteno kiugras volt bajos ezeknel a regi gepeknel, legalabbis Apple ][ eseten mindenkepp.
Nem muszáj megszakítást használni. Lehet figyelni a Timer flag-jét is. Nekem alapvetően a wait és delay tipusú megoldások a nem szimpatikusak, mert amíg ezek a rutinok futnak, addig a kontroller nem tud mást csinálni (kivéve persze a megszakítási rutinokat). Ez feladattól függ, hogy problémát jelent-e vagy sem, de nem kellene rászokni. Többször láttam már itt is és Microchip fórumon is olyan témát, hogy valami kód nem úgy működött, mint ahogy a készítője elvárta, és az ok egyszerű volt: valahol a kódban (rosszabb esetben a megszakítási rutinban) volt egy jó nagy Delay hívás, egyszerűen megfogta a processzort, és nem tudta feldolgozna az időközben pl. soros porton befutott adatot. Ezzel szemben a Timer hardverből működik, elég csak néha ránézni, hogy túlcsordult-e már, nem fogja a kontrollert.
A ciklusváltozó módosításával igazából nagy bajom nincs, csak valahogy nem a for-hoz valónak érzem. Inkább a while illetve do-while (nemtudom ezeknek mi a basic-es megfelelője, valami while-wend rémlik) ciklusokat tartom ilyenre célszerűnek.
Ertem az ervelesed. A Delay/Wait vagy nevezzuk aminek akarjuk, szoval a varakozasos modszer a CPU-t valoban megfogja, de ettol meg a soros porti vagy mas megszakitas bejohet, hisz a periferiak ettol meg tovabb dolgoznak (tehat az MCU-t nem fogja meg csak a CPU reszet).
Delay kozben meg amugy lehet mast is csinalni, nyilvan nehezebb veglegesre beloni a szoftvert, ill ha a fw-t modositani kell a kesobbiekben akkor problemak lephetnek fel, igy nyilvan a megszakitasos modszerek, vagy akar a timer flag pollozasos varakozasok szerencsesebbek. Ha megnezed ezt a vacaksagot amit firkantottam, abban is a for ciklus tulajdonkepp egy delay ami egybe van kotve egy pollozassal. Neha ranez hogy a gombot nyomjak-e, es ha igen akkor csinal valamit - ez esetben a ciklusvaltozot torli, azaz a for gyakorlatilag egy timeout, aminek a lejarati idejet lenullazza (olyan mint egy clrwdt). Timer pollozas detto ugyanez lenne azzal a kulonbseggel, hogy az idozites allando, ha mas pollozast is a ciklusmagba rakok akkor attol meg a varakozas ideje nem no, vagy nem jelentosen no. Azonkivul talan hamarabb elkapja a gombnyomast, ill ha bouncing tortenik akkor egy kis ideig eleg sokszor inicializalgatna a timer regiszteret. A for vagy mas ciklussal amugy nekem nincs bajom, a for is egy elol tesztelo meg a while is - persze meg kellene nezni a generalt kodot, hogy hogyan implementaltak az adott forditoban. Amivel bajom van, hogy nem birtak bele tenni Perl-hez hasonloan 'redo' -t ill meg egy 'rewind' vagy 'restart' is kellene, hogy ilyeneket kenyelmesen es nyelvileg tamogatottan meg lehessen oldani.
Sziasztok!
Segitségre lenne szükségem. Olyan programot keresek pl. 12f508-ra, hogy egy lábra kb. 24 oránként egy 5mp. jelet ad és kész. Semmi több extra. 555-el nem igazán lehet megoldani, gondoltam egy picnek ez nem lehet gond. Néztem több villogo programot, de fogalmam sincs hogy mit állitsak át rajta.Pl. itt Segitséget elöre is köszönöm.
Ez egyszeru: Van egy idozitod ami ad 2 mp-es megszakitasokat, es ebbol ossze szamlalsz 60*60*24/2-ot (43200). A szambol lathato, hogy egy 16 bites szammal meg lehet valositani a szamlalast. A 2mp pedig nem veletlen: Ha egy 32768Hz-es kristalyt hasznalsz egy 16 bites timeren akkor epp ekkora megszakitasokat fogsz kapni.
Namost hogy hogyan valositod meg ezt 12F508-cal: Igazandibol ez az eszkoz nem jo valasztas, de ha mar igy szeretned, akkor a 32768 kristalyt kell hasznalni oranak, ugye a TIMER0 igy FOSC/4-el lesz meghajtva, tehat egy 64-es prescalert kell a TIMER0-nak beallitani, es mar kesz is a 2mp-es idozites. Van azonban meg egy bibi, hogy a 12F508-nak nincs overflow bitje a Timer0-hoz rendelve, es mivel baseline eszkozrol van szo, interruptrol meg csak almodni sem szabad. Van par trukk a problema kikerulesere, pl a prescalert erdemesebb inkabb 128-ra allitani es a legfelso bitet figyelni. Masik lehetoseg, hogy a tulcsordulas figyelest ket reszre venni es eloszor a felso bit beallasat, majd a kovetkezo ciklusban annak torleset kell figyelni. harmadik megoldas, hogy a szamlalot INCFSZ-szel kell tesztelni, tehat az eredmenyt a W-be iranyitva a szamlalo erteke nem valtozik, es a kovetkezo utasitas ugye egy GOTO vissza a ciklus elejere, tehat ha a szamlalo 255-os erteket eler akkor lejart a szamlalas -- de sajnos ekkor sem usszuk meg, hogy megvarjuk amig a szamlalo a 255-os ertekrol elmozdul mielott ujra tesztelgetnenk. Varakozas 5 mp-ig hasonlo szellemben tortenik... Amugy halkan jegyeznem meg 555-tel is meg lehet termeszetesen ezt valositani, csak az 555 kimenetere megfelelo szamlalo regisztereket kell raaggatni...
Esetleg egy számlálós oszcillátor (cd 4060,cd4541 ) indításhoz meg egy 555 .Esetleg elég a cd 4060 is (a számláló felső bitje bebillenése utáni első órajel reseteli)
Tehát akkor ez igy nem egyszerü, föleg hogy nem értek a programozáshoz. Vagyis azt hittem hogy elég egy "számsort" megváltoztatni és kész. 555-el valoban meg lehetne oldani, de az egyébb kiegészitökkel már tul nagy lenne egy már meglévö helyre. Ezért gondoltam hogy egy ilyen kis pic, akár SMD-ben, el tudja végezni a feladatot. A 12F508-at csak példának hoztam mivel elég kicsi a mérete.
Ha ezeket a leckéket végigolvasod megérted tuti meg tudod csinálni.Ha nem kell pontos időzítés csak annyit kell csinálni, mint itt is,ciklusokat egymásba ágyazni amíg a kívánt késleltetés nincs meg.
Nem kell semmi mást figyelni. Idézet: „A 12F508-at csak példának hoztam mivel elég kicsi a mérete.” PIC12F629/675/683 lényegesen barátságosabbak... Idézet: „Van azonban meg egy bibi, hogy a 12F508-nak nincs overflow bitje a Timer0-hoz rendelve, es mivel baseline eszkozrol van szo, interruptrol meg csak almodni sem szabad.” Ha nincs interrupt, akkor SLEEP és WDT ébresztéssel nem oldható meg? Lényegesen egyszerűbbnek tűnik, mint a timer bitátfordulásainak figyelgetése.
Ha nem kell nagy pontossag akkor lehet meg trukkozni es akar egy SOT23-6 tokozasu 10F200 is elegendo egy ilyen feladatra: WDT-t hasznalod fel, hogy idokozonkent felebressze a PIC-edet es szamolgasson. Prescalert maximalisra veszed es kiszamolod hogy kb hany megszakitas (felebredes) kell hogy 24 orat kapj. Ezt probalgatasos modszerrel finomitod, mivel a WDT-hez hasznalt RC oszci nem tul pontos.
Köszönöm mindenkinek a segitö hozzáállást, de ez nekem nem sokat mond, mivel nem tudok programozni. A mellékekelt Link programját ezek szerint nem lehet modositani hogy nekem megfeleljen? A pontosság nem lenne fontos, mint a pic tipusa sem, csak kis méretü legyen külsö alkatrészek nélkül.
A balinkelt programban én nem láttam időzítést. Ha a 2. leckét vennéd elő, annak több haszna volna. De akárhogy csűrjük-csavarjuk, a program módosítása valójában egy új program megtervezését és megírását fogja jelenteni. Nem nagy kunszt, hamar bele lehet jönni, s a feladat sem tűnik túl komplikáltnak.
A pontosság iránti igényt számszerűsíteni kellen, nehogy az derüljön ki, hogy még az ajánlott órakvarc sem elég pontos néhány hét vagy hónap távlatában! Az időnkénti (újra)beállítás módjáról is érdemes volna gondolkodni, mert nincs az a pontos óra, amit időnként újra be ne kellene állítani!
Köszönöm!
Lehet hogy nem nagy kunszt neked. Te biztos értesz hozzá, de nekem fogalmam sincs az egészröl. "Prescaler, interrupt, SLEEP, WDT" nekem ez teljesem kinai. A pontosság nem lenne lényeg, egy jelet ad ki kb. 24 oránként, ha ez 23, vagy 25, lényegtelen.
A prescaler, interrupt, WDT, sleep nem annyira a programozásról, hanem a PIC felépítéséről és működéséről szól. Az adatlapban elég jól le vannak írva. Első körben ne izgasd velük magad, hanem nézd meg a 2. leckét az általad fellelt tananyagból. Abban a LED villogtatásához már kell egy primitív időzítés, ami esetleg átszabható a feladatodhoz.
A tegnap felvetett ötletek arra irányultak, hogy pontosabb legyen az időmérés, s hogy csak a másodperceket kelljen számlálni, ne a mikroszekundumokat. Idézet: „Lehet hogy nem nagy kunszt neked. Te biztos értesz hozzá, de nekem fogalmam sincs az egészröl. "Prescaler, interrupt, SLEEP, WDT" nekem ez teljesem kinai.” En sem igy szulettem, hogy ezeket tudtam, meg szerintem icserny sem. De most akkor meg sem szeretned tanulni? Idézet: „A pontosság nem lenne lényeg, egy jelet ad ki kb. 24 oránként, ha ez 23, vagy 25, lényegtelen.” Akkor tenyleg a WDT (Watch-Dog-Timer -- orkutya idozito, nem tudom magyarul hogy mondjak ezt) lenne a legegyszerubb neked. Adatlapbol nezd ki, de gyakorlatilag arrol van szo, hogy kb 18ms-enkent ad resetet a PIC-nek, illetve alvo allapotbol felebreszti. Ezt 128-as prescalerrel (eloosztoval) 2.3masodpercre lehet kitolni. Azaz 86400 masodpercet elosztjuk 2.3-al, kapunk kb 37565-ot. Ennyit kell elszamlalni minden egyes WDT eseteben. Magyaran van egy ciklusod, ami 37565-ig szamlal. Minden egyes ciklus elejen SLEEP-el elaltatod a PIC-et es ha felebredt 2.3 maspdperc mulva akkor csak eggyel noveled a szamlalot majd ellenorzod a szamlalas elerte-e a buvos szamot, es ha igen akkor kilepsz. Ha nem akkor ugras a ciklus elejere ertelem szeruen, ismet alvas stb stb stb. 5mp varakozas hasonloan egy masik ciklussal, csak ott elegendo ketszer aludni... elotte magasra allitasz egy port labat, utana meg kikapcsolod es kezded a szamlalast elolrol. Kb ilyen egyszeru egy ilyet megcsinalni -- innentol kezdve tenyleg mar csak az a kerdes meg akarod-e tanulni es megcsinalni ezt a feladatot, vagy nem erdekel es csak egy fekete doboz kell neked ami ezt szamodra megvalositja?
Terveztem egy óra programot , van benne ébresztés
funkció is . Ha érdekel szívesen felteszem a hex et és az asm -et 16f628 picre és lcd kijelzőre készült .
Szia!
Köszönöm, de amit leirtál nekem elég bonyolult. Tudom hogy te sem igy születtél, nekem meg ezt a nyelvet megtanulni, megérteni, pláne használni biztos hogy sose fog menni. Nem is ez a célom, sem időm, energiám nem lenne hozzá. Amit irtál, nekem valoban a "doboz" kell ami ezt megcsinálja. Ezért is "keresek" ilyen programot mégha egy villogobol is kell átalakitani ugy hogy "fogják" a kezem mit hol miért kell átalakitani. Ebböl elöbb rájönnék a fortélyra mint hogy adatlapot bujjak, angol nyelvtudás nélkül. Ne érsd félre ezzel nem megbántani akarlak, minden tiszteletem az olyan embereké aki ilyen nyelven a legprofibb cuccokat meg tudják csinálni.
Köszönöm, de nem ilyen "bonyolult" progit keresek.
|
Bejelentkezés
Hirdetés |