Fórum témák
» Több friss téma |
Csak a SWITCH(0) makró és az utána lévő elágazásból kell annyi lekezelés, ahány gomb van.
A gombok lekezelésében is saját kezelés kell. Megjegyzem, hogy ez a folyamat csak menük léptetésére, értékek változtatására jók. Ha pl. valaminek folyamatosan működnie kell addig, amíg nyomod a gombot, más eljárás kell, de az sokkal egyzserűbb.
Nem követtem azt a topicot, de átnézek. Túl sok lesz-ez nekem. Közben írom a vezérlőm programját is...
Nyugodtan kérdezz, ha tudok szívesen válaszolok!
Ki lehet választani, hogy hagyományos, vagy prioritásos megszakítás szerint működjön a PIC(18F-eknél csak). A Flowcode nem tudom hogyan kezeli ezt, de van egy sejtésem, hogy csak hagyományosan.
A prioritásos megszakítás kiválasztása után be lehet állítani, hogy a periféria(Timer, CCP, stb.) alacsony, vagy magas megszakításban kezelődjön le. Az alacsony megszakítást a magas meg tudja szakítani, így meg lehet oldani, hogy a kevésbé fontos megszakítások, mint pl. egy gombkezelés, háttérbe szoruljon és pl egy CCP meg tudja szakítani. A prioritásos megszakítást a RCON.IPEN bittel lehet engedélyezni. A CCP1 megszakítás prioritását az IPR1.CCP1IP bittel. Az adatlapok interrupt részénél lehet ezeket megtalálni. Azt nem tudom, hogy a flowcode ezt hogyan tudja lekezelni, még C-ben sincs jelenleg ötletem, mert még nem foglalkoztam ezzel a résszel. Ha ilyen komoly programra lenne szükség, lehet, hogy nem Flowcode-ba kellene megoldani.
Pedig tök egyszerű. A Timer1 számlál magában folyamatosan olyan frekivel, amilyet beállítottál neki. Ha a CCP1 lábra felfutó él kerül(a beállításod szerint) akkor a PIC CCP1 hardveres perifériája(milyen érdekes, hogy periféria, pedig benne van ), beleteszi a CCP1 regisztereibe a Timer1 regisztereinek megszakításkori értékét. A következő megszakításkor megint. A két érték különbsége arányos lesz a két megszakítás közötti eltel idővel.
Tehát a SWITCH(0) makrót és az utána lévő elágazást és lekezelést másolom annyiszor ahány gomb van.
SWITCH(0) SWITCH(1) SWITCH(2) SWITCH(3) Pont menük léptetésére, értékek változtatására kell. Szobatermosztát lesz.
Szia!
A timer1 (előosztón keresztül) a mérendő frekvenciát kapja. A kapujel felfutó élére a CCP1 tárolja a Timer1 értékét, amit mindig kiolvasunk és eltárolunk. Az újabb felfutó él (mondjuk 1 sec múlva) újra tárolja a Timer1 értékét. Ezt kiolvassuk és az előzőt kivonjuk belőle. A különbség a bemenőjelen a kapujel egy periódusa alatt befutott felfutó élek száma. Ez pedig a bemenő jel frekvenciája / átlag frekvenciája. A kapujelet a a Timer2 -vel és a másik CCP modullal (PWM) állítjuk elő. 16 bites mért értékig minden rendben van, de ez csak 4 és 3/4 digit felbontás. A felbontás növeléséhez kell egy kis ötlet... Ha az előosztó nem 10 hatványával oszt, az sem gond, a PWM kapuidő számítás módosításával korrigálható. Ha a frekvencia túl alacsony, a pontosság növeléséhez több periódusidőnek megfelelő kapuidőt lehet felhasználni. Ha még alacsonyabb a frekvencia, a periódus idő mérése ad pontosabb eredményt...
A C megoldás:
A hozzászólás módosítva: Nov 25, 2012
Félreérthető voltam, a topic miatt. C-ben tudom hogyan kell lekezelni, hanem Flowcode alatt C-blokkban jelentene kicsi fejtörést.
Eddig nem teljesen értettem mi a feladat, most már étem, hogy a mérendő menne a Timer1 bemenetére és a kalibrált mérőimpulzus szakítná meg a CCP1 bemenetét. Ez működhet. A Timer1 megszakításait még számolgatni kell, ahogy a periódusidőmérőmben is van.
Az más kérdés, hogy hogyan kell ezt megoldani, miután nincs CCP1 Capture lekezelési mód. A megodlás szinte ugyanaz, mint a priódusidő mérőben, csak a Timer1 nem belső oszciról jár, hanem a mérendő jelről, így kell beállítani.
Ma reggel mértem. 19 fokról 21,5 fokra melegítettem a levegőt. 55 percig ment a kazán 60 fokos vízzel 1,5m3 gáz fogyott. ezt naponta egyszer eljátsza az ember az havi 45 m3. Ma éjjel nem kapcsolom vissza 19 fokra. kíváncsi vagyok mennyi gáz fogy el reggelig.
Az a kérdésem ezt hogyan lehet összehozni a DS kiolvasó rutinnal? Bővebben: Link Ugyanis mindkettő a Timer0-át használja.
Nálam a nap 24 órájában 23..24,5 fok van, és egy csepp gáz se fogy, de ezt ne itt beszéljük meg!
Elférnek egymás mellett, mert ha jól emlékszem a DS rutin is 183Hz megszakítással fut. Egymás után kell tenni a két lekezelést. Ugye beállítottad a Timer0-t? Mert a jelenlegi freki csak a szimuláció miatt van ilyen magasra állítva.
Igen! Azt láttam, hogy az előosztót 256-ra kell állítani.
Egyenlőre azt nem értem, hogyan látja a Timer0 megszakítása a portA0-n lévő nyomógombot.
Nem is látja. A timer csak bután megszakít. A benne lévő program látja a porton lévő változást.
Nem a ccpr1x regiszterekbe kell menteni, hanem azokat kell egy változóba menteni. A timer1x regiszterekkel semmit nem kell csinálni, azok maguktól betöltődnek a ccpr1x regekbe. Hogy miért nem történik megszakítás nem tudom megmondani, ha nem látom a programot. Szimuláció nem működik, ezt tudod.
Ha jól van beállítva a ccp1 capture mód, akkor meg kell történjen a megszakítás, ha a lábra felfutó él kerül. Honnan származik a mérőjel, milyen periódusidővel?
Ez rendben van. A kód engedélyezése ablakban mi van? Gondolom ott is ugyanaz, mint a kódomban? Egyéni megszakítást készítettél, amiben beállítottál egy makrót, amit meghív ugye?
640KHz megy be a CCP1 lábra? Nem sok ez kicsit? Miért kell ekkora freki?
A timert beállítottad külső forrásra?
Nem tudom miért nem szakít meg, kézzel is meg kéne nyílván...
Olyan nincs, hogy nem menti, ez harveres!
Ja értem....
A timer túlcsordul és megszakít. Akkor a megszakítás rutinja megnézi, hogy van e gomb megnyomva. Ha van lekezeli és/ vagy ha nincs kilép a megszakításból.
Pontosan. A lekezelés nagyon gyorsan megvan, a fő program észre sem veszi, hogy félbeszakították, még is mindent tudunk a gombról...
Ez kell ott legyen. Mi az hogy nem jó? Nem lehet, hogy a timer áll és te azt hiszed, hogy nem mentődik el, pedig csak 0-kat ment? Beállítottad a Timer1-et külső forrásra? Jó lábra kötötted a mérendő jelet?
A hozzászólás módosítva: Nov 25, 2012
Nem bírtam ki, hogy ne rágjam át magam a megszakításos DS kezelő és a nyomógomb kezelő programodon. Nagyon logikus programok. Megértettem és kissé bele is nyúltam a magam igénye szerint. Két gomb (fel és le) valamint LEDekkel kijelezve a választott hőmérséklet. Ez eltárolva az EEpromba. Közben tervezve a HW-t. Azon tűnődöm hogy a mért hőfokot is LEDdel jelzem ki. Kétszínű LED jó lesz hozzá. A beállított érték zöld, a tényleges piros, ha fedik egymást narancs. Esetleg, ha megy a kazán akkor a mért érték villog.
Közben figyelem, hogyan dolgozik a jelenlegi "kínai, programozható, digitális" termosztát. +-0,5 fok hiszterézis van beállítva. Így 3 óránként megy 20 percet.
Az EEPROM-al vigyázz, nem lehet végtelenszer írni. Ha úgy csináltad, hogy a beállítás után egy OK gombbal eltároltad a beállított értéket, akkor jól csinálod. Ha úgy, hogy minden plusz-minusz gombnyomásra eltárolsz, akkor nem.
A LED-es megoldás megfelelő, de én akkor tenném zöldre, ha megvan a hőfok. A hozzászólás módosítva: Nov 26, 2012
|
Bejelentkezés
Hirdetés |