Fórum témák
» Több friss téma |
Ebben tudnátok segíteni?
Hogy állítsam be az időzítőt és számoljam a megszakításokat?
Bemásolom az egész programot.
A problémám az, hogyan oldjam meg, hogy ha hosszan nyomom a gombot, akkor egyszerre világítson(pwm vezérléssel) a két LED amik a CCP1 és CCP2 kimenetein vannak? A LATC értékét is módosítanám ilyenkor, lényegében úgy, mintha egyszerre futna PORT1 és PORT2 függvény. Jelenleg szépen működik, tudom váltogatni pont ahogy szeretném. Tudom vannak benne hibák bőven, de ez életem 2. programja!
A hozzászólás módosítva: Máj 31, 2017
A programodban van egy 16ms-os várakozás, ezt ki lehet kerülni, ha az egészet megszakításba helyezed. Ha jól látom 1kHz a PWM frekvencia, így ha a TMR2-re beállítod a 16-os utóosztót pont egy 16ms-os megszakítást kapsz. Minden megszakításban növeled/csökkented a PWM értékét, a főprogram közben bármit csinálhat. Mivel ez az IT rendszeresen jön, itt mérheted a gombnyomás hosszát is.
Értem. Köszönöm a tanácsod!
Megpróbálkozok vele! Bár a Timer rész még eléggé új nekem Bele kell még jönni..
Sajnos még mindig nem tudom mileheta baj már mindent probáltam (
Ugyan azt megy az animáció egy idei azt minden elsötétül sé az elsö while után nem hajtvégre semmitse...(
Izzítsd be a szimulátort (Debug / Start debugger), tegyél a kritikus utasításra (vagy elé) egy töréspontot, futtasd a programot a töréspontig. Amikor megáll, a változók tartalma vizsgálható, sőt átállítható. Lépésenként is lehet utasításokat végrehajtani és vizsgálni milyen értékeket ír a változókba, ill. merre megy tovább (if, while,..).
Meg kell barátkozni ezzel a lehetőséggel, sokkal hatékonyabb, mint feltenni ide a kérdést. Mi is ezt a módszert használnánk a hiba felderítésére, de csak akkor lehet, ha az egész program forrása rendelkezésre áll.
Debug-old ki a kritikus sorokat.
Tegyél bele egy ideiglenes feltételt, amelynél elhelyezel egy töréspontot.
Ha minden igaz ez a probléma)
Ugye ranadom generátorral generálok egy x,y változót. Szépen generálom azt újra ha kell és amikor már 120 dbnál járunk akkor már nagyon neheze tud olyat generálni pontosan ami üres és ez nagyon hosszú idő. 123db kb 2 percig nyomtam a gombot hogy db változom váltson Ötlet??
Ha igazi random számok kellenek, valami olyasmit kellene csinálnod, mint egy ellenirányban előfeszített diódáról (kvázi fehérzaj generátor) levett jelet tovább erősíteni, és azt küldeni be a/d-be.
Ha a teljes 8 bites skálára van szükséged random sorrendben, és feltétel, hogy minden számnak 1x kell szerepelnie a végig futás során, akkor neked nem véletlen számok, hanem véletlenszerűen sorbarendezett számok kellenek. Fogod a random generátort, bepakolod tömbbe a 8 bites számokat 0..255, és a kapott véletlen értékekkel pozíciókat cserélgetsz benne mondjuk 10ezerszer. Kikapcsolásig már úgy hagyod. Kb jó lesz. Ha ugyan az kell még kezelhetőbben folyamatos hatékony változtatással működés közben, akkor sajnos még több memória kell. Logikai láncot kell felépítened az értékekből, és tudnod kell előre-hátra mozogni az elemek között. Minden értékhez kell pointer_prev és pointer_next is. 256 elemű tömbnél az összesen 1024 byte memóriát jelent (+indexxel együtt). Csinálsz egy 0..255 sorbarendezett láncot, és a véletlen szám generátorral mindig kiveszed a láncból azt az egy elemet, amit a logikai lánc elejére raksz. Ahonnét kivetted, ott az előző / következő elemeket egymáshoz láncolod. Ha végeztél a keveréssel, egyszer végig futsz a láncon, és csinálsz egy indexet, ahova feljegyzed, hogy melyik slotban van a logikai első, második, stb elem. Anélkül az elemek kikeresése lassú lesz. Ha kell a 128. elem a láncból, akár elölről keresed, akár hátulról, jó sok művelet lesz kikeresni. Hogy mit használhatsz az adott áramkörnél, azt a véges erőforrásaid döntik el. Ilyesmikre gondoltál?
Ha jól értelmezem, mit szeretnél, akkor a célod az, hogy van egy 1-től 125-ig terjedő számsorod, amit össze akarsz keverni.
Én ezt úgy oldanám meg, hogy először feltöltenék 125 byte-nyi memóriát növekményesen 1-125-ig számokkal. Ezután elindítanám a véletlen generátort, ami 1 és 125 közötti számokból válogathat. kigenerálnék két számot, majd a kigenerált számoknak megfelelő ramok között adatot cserélnék. Ezután újabb kettőt generáltatnék, újra cserélnék. Ezt kb 1000-szer. Ez elég gyorsan megvan, és jó alaposan összekutyulja. A számok ismétlődése, vagy hogy kimaradjon bármi is, kizárt. A hozzászólás módosítva: Jún 1, 2017
Na akkor remélem értelmesen eltudom magyarázni) (nem erősségem.)
A fényjáték lényege random elkeztem a ledeket egyesével kigyujtani szépen 100ms enként rajzolom is ki. Addig amig az összes led nem villágit . az 125 led összesen 5db oszlop és 25 dbrab szint . És én ugy csinálta random elkeztem generálni a szintet(x) és az oszlopot(y) És amikor már a 120 lednél jártam akkor pici esélye volt azt a kombinációt kapja ami üres és igy "pörgöt" a while ciklusom.
Na, stimmel. Akkor jól írtam. Összekevered a számokat a tároló memóriában, majd egyesével, sorrendben kiolvasod a RAM-ok tartalmát, és azt a LED-et kapcsolod fel, aminek a sorszámát épp megkapod. Ebből pedig úgy kapsz szinteket és oszlopokat, hogy a kiolvasott értéket osztod 25-el. Ha az eredmény 0, az az első szint, ha 4, az az 5. szint. A maradék pedig az oszlopszám.
Sikerült megoldanom amit szerettem volna. Most tökéletesen működik.
Az egészet még nem ültettem át megszakítás alapúra. De a gomb hosszan nyomás érzékelését megoldottam a Timer0 időzítő segítségével. Így:
Mert az én progim azt csinálta([color=red],[/color]) hogy<>gen(e)rált kiiratatat? aztán amikor 120 nál járt mondjuk tegyük fel az üres mezök poziciói
y=5 x=20 y=4 x=1 y=4 x=18 y=3 x=11 Ebben az esetbe nagyon kicsi volt a valoszinusége(,) hogy a generá(l)t szám pl(.) x=20 y=4 legyen(,) ezért mindi(g) arra az ágra futott(,) ahol volt már generálva szám(,) vagy az tömb helyén 1 volt és ez hosszúúú idöt vett igénybe igy kifutott az időből... Remélem amikor "Össze >< kutyulom" a dolgokat(,) akkor ilyen jelenség nem lesz(.) A hozzászólás módosítva: Jún 1, 2017
Így a helyes, de ha belegondolsz már fut a TMR2 (hiszen ez csinálja a PWM-et), ami 1ms (1kHz). Ehhez lehet utóosztót rendelni (T2OUTPS) ami IT-t generálhat. Ugyanezt ott is megoldhatod, és még a kitöltést is megváltoztathatod a beállított időközönként.
Máshogy:
Mindig lehet tudni, hány hely üres. Elég egy véletlen számot generálni (0 .. (üres_hely-1)) közötti tartományba, aztán az annyiadik üres helyen bekapcsolni a LED -et, az üres helyek számát csökkenteni. Ha már csak 1 led marad kikapcsolva, nem kell véletlen számos sem generálni.
EZ teljesen rendben van, csak az az algoritmus elég bonyolult, ami úgy számol el mondjuk 47-ig, hogy közben megnézi egyesével az összes kimenetet, és csak azoknál von le az induló számból, ahol nincs bekapcsolt LED, majd 0-ra érve a soron következőt bekapcsolja. Arról nem beszélve, hogy ahhoz is kell egy háttértár, ami rögzíti a pozíciókat, mert a multiplexelésből kifolyólag a kimenetek közvetlenül nem ellenőrizhetőek.
Sikerült meg minden CSAK
Ha 300 írok for ciklusba kiakad a pic és nem értem miért....... itt:
Nem értem miért ötlet?? A hozzászólás módosítva: Jún 1, 2017
Köszi milyen figyelmetlen voltam istenem......
Teljesen jogos.
Megírom a programot úgy is. Fő a gyakorlás Köszönöm!
A véletlenszám generátorodnak programozhatónak kell lennie korlátokra.
Csinálsz egy jelző bit memóriát, amiben kezdetben még törölve van az összes bit. Első alkalommal keresel véletlen számot 0..124 között, mondjuk kaptad a 3-ast. Megkeresed a 3. üres bitet, megnézed, melyik pozíciót találtad meg, mint érvényeset (első alkalommal tuti a 3-as lesz az), töltöd azt a flaget, bekapcsolod azt a ledet. Következő alkalommal generálsz 0..123 között. Mondjuk újra a 3-ast kaptad. Számolod újra a még üres flageket, ezúttal a 4-est fogod megtalálni, mint 3. üreset (ugye indexelés 0-tól..). Bekapsolod a 4. ledet, töltöd a 4. flaget. Generálod a következő véletlen számot 0..122 között. És úgy tovább. Csak egy tipp.
Ez se rosssz.... Most mennyire megnyilvánul hogy egy programot hány féleképpen meglehet írni és hányféleképpen gondolkozunk vagy is eltért a gondolkozásunk.
Idézet: És mekkora memóriafoglalás, működési sebesség eltérések lehetnek különböző variációknál, amik ugyanazt a végeredményt adják. „egy programot hány féleképpen meglehet írni”
Akkor itt is felteszem a kérdést mert picit PIC téma is.
Elözmények: Idézet: „Sziasztok Egy természetfeletti dolgot megtudnátok nekem magyarázni hogy miért?? Pic-el vezérlek egy 74hc595-t és azt akartam elérni hogy programozásközbe ne villogjon a led . Megszakítottam a VDD-t semmi ugyan úgy működik a shift. Megszakítottam a Resetlábat semmi rendesen működik úgy is (élesbe is teszteltem nem csak be programozásakor) Clock lábat megszakítottam akkor már nem ment ..... Ezt nem értem hogy miért működik VDD,RESET nélkül.” Válasz: Idézet: „ Parazita tápot kap az adatvonalakon, azért működik. Reset lebeg, de inkább táp felé hajlik azért működik. Adatvonalakra rakj áramkorlátozó ellenállást, hogy a jel átmenjen, de táplálni már ne tudja az IC-t. Resetet pedig húzd földre, ha resetben akarod tartani. Simán lehet benne belül egy gyenge felhúzó ellenállás, ami miatt lebegéskor inkább a táp felé billen a reset. >Clock lábat megszakítottam akkor már nem ment ..... Ott kapta a parazita tápot... ” Na 100k val próbáltam úgy müködik (lehet túl löttem a 100k-val) . Na de még egy próblémába ütköztem Shiftregiszter kimenő lábain PNP tranziztorok vannak vagy is ha kivan kapccsolva a shiftregiszter akkor mindegyik villágit gondolom pár k felhuzó ellenállás kell a bázisra de mekkora kell?? Amit elszeretnék érni hogy amikor a Picket programozom akkor a shiftteljesen kilegyen kapcsolva és a PNP ne legyenek nyitva. Mert amikor programozom mindig egy két led villágit(Előző status) és nem szeretném hogy a ledek megsüljenek.
Amikor nem kell 74hc595, akkor helyezd magas impedanciába.
Vagy is MR és OE lábakat állítsd magas szintre. Bázisra tegyél 1-10K-oig felhúzót.. A hozzászólás módosítva: Jún 5, 2017
OE fixen testen van az OE(RESET) pedig pic lábába megy .
Húzzam fölöket VDDre ellenálláson keresztül????
Itt egy kép, erről be tudod azonosítani azt a két lábat.
PIC-el kellene vezérelned, mert ha nincs használatban akkor mind két lábat magasba kell húznod. Ekkor teljesen kikapcsol a 74HC595 és nem terhel be semmit.., olyan mint ha bemenetek lennének a lábai.. MR és OE lábakról van szó.. Ha fix valamelyik, akkor azt javítsd és kösd be PIC egyik feles lábára.. A hozzászólás módosítva: Jún 5, 2017
Idézet: „olyan mint ha bemenetek lennének a lábai” De ilyenkor a pnp tranziztorok kinyotnak nem???
Nem, ha bázisukat felhúzod.. Olvasd el amit írok..
|
Bejelentkezés
Hirdetés |