Fórum témák
» Több friss téma |
Nincs baj a programoddal, de vedd figyelembe, hogy ilyen alacsony sebesség mellett lassú lesz az utasítások végrehajtási ideje. Ha másképp nem megy vedd kisebbre a Delay_us értékeit. Fordítsd le, mérd meg a futásidőt és korrigálj. A mikroC tud debuggolni érdemes lenne megpróbálni,sokat segít a futásidő kiszámításában. De még jobb lenne, ha végre megoldódna az oszcillátor konfigurálásod, elvégre ez egy 64Mhz-es PIC.
Idézet: „eddig még a zener-es megoldás is bevált” Nálam nem volt zéner, csak kb 8-9 volt váltó, utólag derült ki nem is tudtam róla. Természetesen a PIC ma is fut.
A pontosság, a felbontás és a stabilitás az (legalább) három különböző dolog. A tápfeszültség jelentősen eltérhet a névleges értéktől (pl. 5 V helyett 4.7 V), s nincs különösebb igénye a hőfokstabilitásra, vagy hosszú idejű stabilitásra nézve. Ezek indokolhatják egy feszültségreferencia alkalmazását akkor is, ha rövid távon vagy egyedi kalibrációval a tápfeszültség is megfelelne.
próbáld így:
SetBit(OSCCON,6); SetBit(OSCTUNE,6); Az IDE legyen 64MHz, a configban HFINTOSC legyen kiválasztva
Szerintem a belső oszcillátor nem tud többet 8 MHz nél. Külső kvarcot kell használni.
pll4 el nem lehet????
A PIC18FxxK22 belső oszcillátora - HFINTOSC - mindig 16MHz. Adatlap 450. oldal
amúgy a MikroElektronika fórumán találtam: void Init_Osc() { OSCCON.IRCF0=1;///Internal Oscillator Frequency Select bits, 16MHz OSCCON.IRCF1=1; OSCCON.IRCF2=1; OSCTUNE.PLLEN=1; // 4x PLL }
Üdv!Itt az alábbi program részlet:
Egy 16F628A-ra rá van kötve egy hét szegmenses kijelző és annyit szeretnék csak , hogy ha megnyomok egy gombot , ami az RB0-ra van kötve , akkor léptesse a kijelzőn a számot.Megszakítással szeretném megoldani , de valamiért van olyan , amikor 2-t léptet illetve olyan is előfordul , hogy megnyomom gombot és nem reagál.Tudna valaki segíteni , hogy mitől lehet ez?
Üdv!
A megszakításban megvizsgálod az INTF-et, majd törlöd és vársz, aztán újra megvizsgálod és végrehajtod a műveleteket és a legvégén megint törlöd az INTF-et. Gondold át még egyszer, kicsit sok itt a vizsgálás és törlés (Törölni csak egyszer a végén, ha már nincs rá szükség).
Én nem ismerem ezt a programnyelvet, de amit írsz az inkább a nyomógomb pergése miatt szokott lenni. Vagy szoftveresen vagy hardveresen kellene megoldani a pergésmentesítést.
A hozzászólás módosítva: Jún 26, 2016
Egy ellenállás nem pergésmentesít! Inkább a működéshez van köze. Gondolom az felhúzza a bemenetet Vdd-re és gomb lehúzza GND-re. A pergésmentesítéshez legalább kondi kellene, de méginkább egy 74LS00 vagy ilyesmi.
Így működne jól, hagyd így. A többszöri lépés a pergésmentesítés hiánya miatt van. Azt viszont, hogy néha nem lép, nem tudom mire fogni, mert nem vizsgálod a gomb állapotát.
Valóban így van pergesmentesitve.Kondibol egy 100nf parhuzamosan a nyomogombbal?
Akkor még egyszer elmondom, hogy az nem pergésmentesítés! Ha az ellenállás nem lenne, nem működne az egész. A 100nF a gombbal párhuzamosan jó lehet, de nem egy atombizos megoldás. A legjobb a NAND kapu alkalmazása.
Szerintem ez lenne a legegyszerűbb pergésmentesítésre:
De ezt persze timerral is meg lehet csinálni, hogy ne időzzön 10ms-ot a megszakításban, INTIF == 1 elindul a timer vár körülbelül 10ms újra megszakítás és, ha még mindig nyomva van a gomb akkor növeled a segment_0-át. És amit használsz megszakításban használsz változó az volatile legyen.
Kedves ha1drp
Ezt nekem írtad? ![]() Idézet: „A PIC18FxxK22 belső oszcillátora - HFINTOSC - mindig 16MHz. Adatlap 450. oldal amúgy a MikroElektronika fórumán találtam: void Init_Osc() { OSCCON.IRCF0=1;///Internal Oscillator Frequency Select bits, 16MHz OSCCON.IRCF1=1; OSCCON.IRCF2=1; OSCTUNE.PLLEN=1; // 4x PLL }”
Azt hittem " Elektro.on" Elnézést......
szerk: ha program futása közbe melyikkel nullázzak TRIS al vagy LATal???? A hozzászólás módosítva: Jún 26, 2016
Már mondtuk/mondtam ... TRIS az I/O irány LAT-al (vagy PORT-al) írod, hogy 1 vagy 0-a LAT-al a latch-t olvasod a PORT-al a láb-on lévő állapotot.
Akkor a gomb ellenörzést POST al fogom ellenörizni??
A hozzászólás módosítva: Jún 26, 2016
Igazából lehet timerrel kene , mert nem akarom , hogy a gomb nyomvatartasanal vegig leptessen.Egy szivattyut akarok ezzel vizsgalni , hogy hanyszor kapcsol be egy nap alatt.
De a PIC doksija sok mindenre jó ám... például az I/O leírásban mindent megtalálsz amit írtam és amit kérdezel.
Mivel INT lábat használsz és a 628-asnál még csak az INT elvezérelt, tehát nem a nyomva tartással kell foglalkozni hanem az átfutó élekkel, hogy ne érzékelje a PIC pl.: 3 gombnyomásnak az egy gombnyomást.
Én valami ilyesmit képzelek el lehet letesztelni most nem tudom, de működnie kell. És ez úgy lett megírva, hogy a gomb megnyomva '0'-a. Idézet: „Esetleg ha vannak hozzá szerelési anyagaid kéznél, hogy rárakj egy soros portot a pic kimenetére, viszonylag könnyű írni egy ciklust, ami hideg starton csak kiküldi soros portra a teljes általános célú memória állományt. Talán érdekes tapasztalat lesz, ha jellemzően csak egy kicsike területen fordulnak elő random bitek, vagy talán valami mintát is sikerül felfedezni benne.” Valamiért ez ma eszembe jutott és megcsináltam. A hardver egy PIC16F628A, az első 4 memóriahelyet egy késleltető ciklus használja, mert másképp most nem tudtam megoldani a dolgot. Az eredmény több be-ki kapcsolás után minimális eltéréssel ugyan az:
Látható, hogy a legtöbb regiszter értéke FF, de van néhány ettől eltérő is, az érdekesség, hogy mindig ugyan azokon a területeken és mindig ugyanarra az értékre állnak be.
Megszakításba nem szoktunk késleltetést tenni, de ha már minden szakad és így oldottad meg akkor tegyél bele szoftveres pergés mentesítést.
Ezzel azt éred el, hogy ameddig gomb nyomva marad, addig while() ciklus pörög és nem enged tovább. Ha a gombot felengeded, akkor program tovább tud lépni. Jelen esetben RB0 pin alacsony szintje jelenti azt, ha gomb nyomva van. Ha viszont van lehetőség, akkor az egész programot újra gondolnám, mert arra amire neked kell nem feltétlen kellene megszakítást használni.
Van lehetőség újra gondolni.Nyitott vagyok mindenre ha tudsz benne segíteni..
Ha aszinkron állapotgépekkel építesz fel mindent, és van főciklusod, ami emberi időn belül lefut, csinálhatsz állapotgépet arra is.
Tedd a prellezést külön szoftveres részbe, kelleni fog neked két függvény (vagy külön szoftveres részek a főciklusban), meg két változó. Az egyik 1 bites, érték 0-1 az aktuális "virtuális állapot", a másik legalább 3 bit-nyi számláló, értéke 0..7. Ha nincsenek bites mezőid, használhatsz egy byte-ot egészben, és magad szeded szét bitekre, aztán újra egybe gyúrod. A két függvény egyikét a gomb aktuális állapotát lekérdezni hívod be, a másikat a főciklusból frissíteni, az kezeli majd a prellezést. Amikor éppen a főciklus ráfut az ellenőrzésre, megnézed a gomb régi állapotát, a számlálódat, és beolvasod azt, amit éppen a port bemenet mutat. Ha a régi állapottal azonos beolvasásod van, a számlálót lenullázod. Ha nem, lépteted a számlálót 1-el, és amikor elért ilyen 5-6 értékig, kinullázod, és átírod az érték bitet is. Ha éppen gyakorolni is kedved van, összerakni a fenti kis szösszenetet nem tudhat problémába ütközni, forráskódot egészben most nem írok. |
Bejelentkezés
Hirdetés |