Fórum témák

» Több friss téma
Fórum » PIC-es időzítő
Lapozás: OK   1 / 3
(#) csaba7575 hozzászólása Ápr 23, 2008 /
 
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
(#) proba válasza csaba7575 hozzászólására (») Ápr 23, 2008 /
 
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.
(#) szilva válasza csaba7575 hozzászólására (») Ápr 23, 2008 /
 
Ú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.
(#) watt hozzászólása Ápr 23, 2008 /
 
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!
(#) csaba7575 válasza szilva hozzászólására (») Ápr 23, 2008 /
 
Í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.
(#) trudnai válasza csaba7575 hozzászólására (») Ápr 23, 2008 / 4
 
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:

  1. Dim a as Word
  2. kezd:
  3. If PORTA,4 = 0 then Goto kezd
  4. High PORTB,2
  5. For a = 0 To 10000
  6. WaitMs 1
  7. If PORTA,4 = 1 Then a = 0
  8. Next a
  9. Low PORTB,2
  10. Goto kezd

UI: Hehe ez a sorszamozas epp jo a Basic-nek
(#) szilva válasza csaba7575 hozzászólására (») Ápr 23, 2008 /
 
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?
(#) csaba7575 válasza trudnai hozzászólására (») Ápr 23, 2008 /
 
Köszönöm a segítséget jó a megoldás trudnai . Kapod a pontot.
(#) potyo hozzászólása Ápr 23, 2008 /
 
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.
(#) Mcsiv válasza potyo hozzászólására (») Ápr 23, 2008 /
 
csak kicsit igénytelen
(#) potyo válasza Mcsiv hozzászólására (») Ápr 23, 2008 /
 
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)
(#) trudnai válasza potyo hozzászólására (») Ápr 23, 2008 /
 
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.
(#) potyo válasza trudnai hozzászólására (») Ápr 23, 2008 /
 
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.
(#) trudnai válasza potyo hozzászólására (») Ápr 23, 2008 /
 
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.
(#) aroxol hozzászólása Júl 20, 2009 /
 
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.
(#) trudnai válasza aroxol hozzászólására (») Júl 20, 2009 /
 
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...
(#) proba válasza aroxol hozzászólására (») Júl 20, 2009 /
 
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)
(#) aroxol válasza trudnai hozzászólására (») Júl 20, 2009 /
 
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.
(#) proba válasza aroxol hozzászólására (») Júl 20, 2009 /
 
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.
(#) icserny válasza aroxol hozzászólására (») Júl 20, 2009 /
 
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...
(#) icserny válasza trudnai hozzászólására (») Júl 20, 2009 /
 
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.
(#) trudnai válasza aroxol hozzászólására (») Júl 20, 2009 /
 
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.
(#) aroxol hozzászólása Júl 21, 2009 /
 
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.
(#) icserny válasza aroxol hozzászólására (») Júl 21, 2009 /
 
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!
(#) aroxol válasza icserny hozzászólására (») Júl 21, 2009 /
 
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.
(#) icserny válasza aroxol hozzászólására (») Júl 21, 2009 /
 
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.
(#) trudnai válasza aroxol hozzászólására (») Júl 21, 2009 /
 
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?
(#) kaqkk válasza aroxol hozzászólására (») Júl 21, 2009 /
 
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 .
(#) aroxol válasza trudnai hozzászólására (») Júl 22, 2009 /
 
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.
(#) aroxol válasza kaqkk hozzászólására (») Júl 22, 2009 /
 
Köszönöm, de nem ilyen "bonyolult" progit keresek.
Következő: »»   1 / 3
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