Fórum témák
» Több friss téma |
Sziasztok!
Meg tudná valaki magyarázni nekem, hogy miért jó még egy egyszerű ledvillogtatást is megszakítási rutinnal elkészíteni? Hiszen még egy több ezer soros program is olyan gyorsan fut le, hogy egy másodperces időzítőt akár századmásodpercenként le tud kérdezni. ugyanakkor egy megszakítás könnyedén kizökkent egy AD beolvasást.
Azért jó a megszakítás, mert pl a ledvillogtatóban a be és kikapcsolás között a pic számolja a késleltetést, tehát elfoglalt. Ha timer és megszakítás kombóval csinálod akkor a pic csinálhat bármi mást közben. A olyan feladat van amibe bezavarhat a megszakítás akkor annak az idejére le kell tiltani és akkor nincs gond.
A hozzászólás módosítva: Jún 14, 2015
Idézet: Minek? Tud ő jelezni, ha kész és akkor van erőforrás más feladatok elvégzésére ! „egy másodperces időzítőt akár századmásodpercenként le tud kérdezni” Idézet: „a be és kikapcsolás között a pic számolja a késleltetést,” Miért tenné? Ugyanúgy a timer működik, csak a flagbit nem vezérel megszakítást. A program körönként egyszer lekérdezi. Ha átbillen, ugyanúgy végrehajthatja az ide vonatkozó feladatot, majd megy tovább. Egy ledvillogtatás nem időkritikus feladat. Ezért eredendően fölöslegesnek vélem a megszakítással együttjáró procedúrákat.
1 LED-nél timer sem kell, akkor "simán" tudsz DECFSZ-kkel késleltetést csinálni!
A gond akkor kezdődik, ha több pl. LED-ed van...még OK a Te módszered, ha nem több a LED-ek száma, mint a TIMER-ek száma ! Probléma akkor van, ha sok különböző időt kell mérni, akár "egyidejűleg" ! Ilyenkor kell a megszakítás ( vagy ha a LED mellett más feladatok is vannak!), máskor csak lehet használni ( de aki használta már, annak nem okoz gondot és nem tartja bonyolultnak)!
Egy feleslegesen használt megszakítás akár el is vonhat erőforrást.
Egyszer egy már meglévő kétzónás időzítőt három zónásra kellett bővítssek. A harmadik zónát azért, hogy a programba ne keljen komolyabban belenyúlni megszakításra tettem. Az eredeti felállásban az időzítőket 1-255 sec között lehetett állítani. Miután belekerült a megszakítás, érdekes módon, 7-259 sec közé került az időzítés
Persze, mert rossz volt a kialakított szervezés, ezért megváltozott a főprogram időzítése...
Ha jól lett volna megoldva, akkor nem okozott volna gondot még 6 új zóna beiktatása sem! Az egésznek az a lelke, hogy feleslegesen ne töltse várakozással a processzor az idejét, ha közben lenne dolga ! Persze, ha nincs mit csinálnia, akkor ráér várakozni és visszatértünk az eredetileg felvetett problémádhoz, hogy 1 LED villogtatásához minek megszakítás ( de közben már mutattál is rá egy példát: ha a két zónás időzítő megszakításos lett volna, akkor a későbbi bővítés nem okozott volna gondot !)! Idézet: „ha a két zónás időzítő megszakításos lett volna, akkor a későbbi bővítés nem okozott volna gondot” Oké! Ezt elismerem. Meg azt is, amit a Pali írt, hogy kritikus esetben le kell tiltani a megszakítást. De ebben az esetben hogyan szerez a program tudomást arról, hogy neki volt időközben egy megszakítási kérelme?
Megszakítást csak minimális időre szabad letiltani. Ha újra engedélyezed, akkor megtörténik mindegyik, csak az engedélyezés után.
Tehát, ha egy AD konverzió előtt letiltom a megszakítást, majd amint lejárt, visszakapcsolom, reagálni fog a közben beérkezett, a konverzió időtartamánál rövidebb idejű impulzusra?
Igen. A megszakítást kérő bit beáll, csak a megszakítás nem következik be.
Köszönöm!
Viszont lenne egy újabb kérdésem. Készítettem egy encoderes útmérőt. A PIC tápján van egy 1000qF-os kondi. Ez a főtáptól diódával van elválasztva, az egyik lába pedig a főtápot figyeli. Ha megszűnik a táp, a program egy tárolórutinra urik, és EEPROM-ba menti az aktuális értékeket. Inicializálásnál, miután mindent beállított, törli a változókat, majd kiolvassa az EEPROM tartalmát és visszaírja az utólsó értékeket. A baj az, hogy 10-ből 9-szer szépen megcsinálja, majd egyszer csak nullákkal tér vissza. Előszőr arra gondoltam, hogy a mentés nem hajtódik végre, de akkor az előző mentés értékeivel kellene visszatérjen. Így viszont úgy néz ki, a kiolvasást nem hajtja végre. Pedig a kiolvasás nem egy külön rutin, hanem az inicializáció része. A tápfesz felépülése belezavarhat az EEPROM működésébe? Még egy kérdés. A BOR tápfigyelőt nem lehet valahogy átkapcsolni, hogy ne resetet hajtson végre, hanem egy kijelölt rutint? Megspórolna egy lábat a PIC-en.
Szerintem meg a beírás nem sikerült neki, a kiolvasás meg akkor történik amikor visszatér, és minden rendben van, de a beírt adat nem sikerült, ezért törlődik az előző adatmentés és lesz nullás a jelenlegi. A kiolvasott adat olyan-amilyen.
A hozzászólás módosítva: Jún 15, 2015
Az EEPROM írás byte-onként tipikusan 4ms, ezt vedd figyelembe a mentéskor.
A hozzászólás módosítva: Jún 15, 2015
A BOR az reset, táp figyelésre jó még a HLVD (amelyik PIC-ben van), vagy a PIC-ben levő komparátor. A nagy puffer kondi gondolom a stabilizátor előtt van, így azt érdemes figyelni.
Ha a főtáp akkor szűnik meg, amikor már törölte a memóriát, de még nem töltötte vissza, akkor előfordulhat ez a jelenség.
Az 1000qF-os kondi közvetlen a PIC táplábaira csatlakozik, hogy amikor a főtáp lekapcsol, a PIC még üzemeljen egy ideig. Ezalatt kerül sor a mentésre. Kipróbáltam, hogy amikor nullázódik, levettem a kondit,hogy ne tudjon menteni. Legközelebbi bekapcsoláskor a korábbi mentés adatai jöttek vissza. Tehát a visszaolvasással van a baj. A táfesz esetleges lassú felépüése nem okozhat gondot?
Arra gondolok, hogy esetleg a PIC processzora már alacsonyabb feszültségen elindul, mint az EEPROM-ja.
Nem lehetséges, hogy a programban a lekapcsoláskori mentés valamiért többször is lefut? Illetve, a ki- és bekapcsolás közötti időtartam alatt biztosan kisül a kondenzátor a lehető legszélsőségesebb esetben is?
Ha az EEPROM táp igénye +4,5..+5,5V ( pl. 93CXX ) és a puffer kondi +5,0V-ra van feltöltve a tápról, akkor lehet, hogy a PIC az EE írás befejezése előtt lefogyasztja a kondi energiáját 4,5 V alá, ami már megmagyarázná a befejezetlen írást. A 16F877 például 10-20 mA-t is fogyaszthat 20 MHz-en, de külső (pl led) és belső (CCP, AD, comparator, stb.) perifériákkal, valamint lebegő bemenetekkel ez sokszorosára is növekedhet.
Ebben az esetben, ha a +5V-t egy 7805 segítségével nyered mondjuk +12V-ról, akkor a 7805 elé kellene tenned az 1000 µF kondit a diódával így kiküszöbölve a felszültségesés kezdeti szakaszának a hatását, és a dióda előtti tápot kellene figyelni a PIC-nek megfelelő előtét ellenállással ( pl 12 V 0,7 mA esetén 10kohm ). Továbbá a tápellátás megszűnésekkor a PIC- nek minden külső és belső perifériát deaktiválni kellene, kezdve a legnagyobb fogyasztókkal, illetve a lebegő lábakat (nem bekötött bemeneteket) vagy felhúzod tápra, vagy lehúzod a testre, vagy kimenetként konfigurálod őket a lebegés lehetőségét kizárva. Ezekkel a lépésekkel jelentősen le tudod csökkenteni az áram fogyasztást így megnövelve azt az időt, ameddig a kondi kapacitása elég a PIC-nek és az EE-nak az írás befejezéséhez ( 1 bájt írás időigénye 4-6 milisec !!! )
Előre bocsi ez hosszú lesz
Másik megoldás a szoftveres trükközés, ahol pl minden egyes cm után tárolod azt az EE-ban. A 18F2550 EE-ja kb 1.000.000 írást képes elviselni. azaz 1 km-t lenne képes rögzíteni az EE tönkremenetele előtt, ha csak egy regiszterbe írnád a megtett cm-k számát. Egy lehetséges megoldás, hogy 100 db EE regiszteren tárolod a megtett cm-k számát, ami már 100 km rögzítését tenné lehetővé, 250 db regiszterrel 250 km és így tovább, ha külső EE-t használsz, akkor pedig az EE tönkremenetele után ki lehetne cserélni újra. Elv: Előkészítés: "0"-val töltöm fel az összes EE regisztert. A rögzítést ciklusokra osztanám. Első ciklusban minden megtett cm után "1"-t írnék a következő regiszterbe addig, míg elérem a max tervezett regiszter számot ( pl 100 db ). Ezután jönne a következő ciklus, ahol az első regisztertől kezdve már "2"-t írnék be a regiszterekbe minden megtett cm után. És így tovább ... A megtett távolság meghatározása a következő: Az első regiszter mindig a végrehajtott ciklusok száma - 1 tartalmazza Mivel egy ciklus 100 regisztert tartalmaz, amelyek cm-enként íródnak felül egymás után, ezért az első regisztert kiolvasva, abból 1-t kivonva, majd azt 100-al megszorozva megkapjuk, hogy hány teljes ciklust ( hányszor 100 cm-t azaz 1 m-t ) tett meg a mérő szerkezet. Az utolsó töredék ciklus által rögzített cm-k számát pedig úgy kapjuk meg, hogy megvizsgáljuk, hány regiszter értéke egyezik az első regiszterrel, hozzáadunk 1-t és ezt hozzáadjuk a teljes ciklusokból meghatározott értékhez. 10 regiszteres példa: cím: 0 1 2 3 4 5 6 7 8 9 érték: 4 4 4 4 4 4 4 3 3 3 első reg értéke = 4 ( 4 - 1 ) x 10 = 3 x 10 = 30 cm plussz a maradék, vagyis hat regiszter egyenlő a 0. regiszterrel, azaz 6 + 1 = 7 cm így 30 cm + 7 cm = 37 cm Remélem, hogy tudtam hasznos ötletet adni. A hozzászólás módosítva: Jún 16, 2015
Gondolom, a ki/be kapcsolást tervezetten hajtják végre.Ha igen, akkor a ki/be kapcsolás lehetne félig meddig szoftveres.Ekkor már biztonsággal menthetsz mindent, mielőtt a PIC lekapcsolná saját tápját.
Köszönet mindenkinek!
Végre meglett a hibát kiváltó ok! A gép főkapcsolója, ha gyors mozdulattal lett bekapcsolva, beprellezett. Ez a tápba tüskéket pakolt. Bár a PIC nem akadt ki tőle, de ilyenkor nem olvasta ki az EEPROM-ot. Úgy sikerült megoldani, hogy az inicializációba, amint a perifériákat beállította a program, tettem egy fél másodperces időzítőt. Azaz fél másodpercig áll a program. Ezután folytatódik csak az inicializálás, és az EEPROM kiolvasása. Most már hibátlan. ktamas66 említette a HLVD-t. A következő áramköröm, amiben ugyanilyen mentést kell végrehajtanom, egy PIC18F26K22-re épül. Ráadásul a program bonyolultsága miatt, csak megszakításból tudnám érzékelni a tápfesz csökkenését. A katalógus szerint van benne HLVD. Viszont nem értem a működését. Ez most belsőleg képes érzékelni? Mert az RB4-es lábra jelzi a katalógus. De nekem a PIC minden lába foglalt. Tehát nem tudok neki referencia feszültséget biztosítani.
Bár ez nem assembly, de.. Elnézted szerintem. Én az RA5 lábon látom, és nem feltétlenül kell neki az RA5. Olvasd el az adatlapot. Van benne egy MUX ami a HLVDCON<3:0> bitek alapján a tápot nézi belső ref alapján, vagy ha ezen bitek értéke 1111 akkor az RA5-re kapcsolt fesz a referencia.
A hozzászólás módosítva: Jún 16, 2015
Ezt találtam az adatlapon.
Csak azt nem tudom, hogy lessz ebből megszakítás 4,11V-nál. Mert azt nem találom, hogy hogyan kell beállítani, amegszakítást, és a leírásból úgy értelmezem, hogy a táblázatban jelölt alsó és felső érték is jelet ad. De nekem csak az alsó kell.
A rendes megszakításos működéshez a HLVDCON, INTCON, IPR2, PIE2, PIR2, TRISA regisztereket kell beállítani. Én úgy olvastam, hogy beállítod az értéket a HLVDCON 3:0 bittel a táblázatban megadott értékre és a 7 bittel beállítod, hogy alatta vagy felette jelezzen. A jelzés után a flag bitet szoftveresen kell törölni, hiába nincs már a tartományba a tápfesz.
Nos az én értelmezésem szerint ez azt jelenti, hogy a tpy érték a szokványos és a min-max pedig a tűrése, pl hőmérséklettől. Persze jelentheti a küszöb tűrését is, pl, hogy ha lefelé kapcsolsz akkor a min alatt ha feleflé akkor a max felettt történik az esemény, de szerintem az első magyarázat a megfelelő. Példákban a typ értékre állitanak be, szóval ez is az elsőt támasztja alá.
Köszönet újfent mindenkinek.
Ha elkészült, megírom hogy hogy sikerült.
Sziasztok!
Teljes siker koronázta az adatmentést. Mégegyszer köszönet minden segítsségért. Egy kis videó a végeredményről:Bővebben: Link |
Bejelentkezés
Hirdetés |