Fórum témák

» Több friss téma
Fórum » PIC programozás assemblyben
 
Témaindító: sonajkniz, idő: Máj 30, 2015
Témakörök:
Lapozás: OK   2 / 32
(#) sonajkniz hozzászólása Jún 14, 2015 /
 
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.
(#) Pali79 válasza sonajkniz hozzászólására (») Jún 14, 2015 /
 
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
(#) kissi válasza sonajkniz hozzászólására (») Jún 14, 2015 /
 
Idézet:
„egy másodperces időzítőt akár századmásodpercenként le tud kérdezni”
Minek? Tud ő jelezni, ha kész és akkor van erőforrás más feladatok elvégzésére !
(#) sonajkniz válasza Pali79 hozzászólására (») Jún 15, 2015 /
 
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.
(#) kissi válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
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)!
(#) sonajkniz válasza kissi hozzászólására (») Jún 15, 2015 /
 
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
(#) kissi válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
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 !)!
(#) sonajkniz válasza kissi hozzászólására (») Jún 15, 2015 /
 
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?
(#) nedudgi válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
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.
(#) sonajkniz válasza nedudgi hozzászólására (») Jún 15, 2015 /
 
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?
(#) nedudgi válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
Igen. A megszakítást kérő bit beáll, csak a megszakítás nem következik be.
(#) sonajkniz válasza nedudgi hozzászólására (») Jún 15, 2015 /
 
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.
(#) dokidoki válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
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
(#) pgabor2 válasza sonajkniz hozzászólására (») 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
(#) ktamas66 válasza sonajkniz hozzászólására (») 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.
(#) nedudgi válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
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.
(#) sonajkniz hozzászólása Jún 15, 2015 /
 
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.
(#) Bakman válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
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?
(#) kissi válasza sonajkniz hozzászólására (») Jún 15, 2015 /
 
Milyen PIC-ről beszélünk ?!
(#) sityu39 válasza sonajkniz hozzászólására (») Jún 16, 2015 /
 
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 !!! )
(#) sityu39 válasza sityu39 hozzászólására (») Jún 16, 2015 /
 
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
(#) sonajkniz válasza kissi hozzászólására (») Jún 16, 2015 /
 
(#) proba válasza sonajkniz hozzászólására (») 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.
(#) sonajkniz hozzászólása Jún 16, 2015 /
 
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.
(#) usane válasza sonajkniz hozzászólására (») Jún 16, 2015 /
 
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
(#) sonajkniz válasza usane hozzászólására (») 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.
(#) Pali79 válasza sonajkniz hozzászólására (») Jún 16, 2015 /
 
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.
(#) usane válasza sonajkniz hozzászólására (») Jún 16, 2015 /
 
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á.
(#) sonajkniz válasza usane hozzászólására (») Jún 16, 2015 /
 
Köszönet újfent mindenkinek.
Ha elkészült, megírom hogy hogy sikerült.
(#) sonajkniz válasza sonajkniz hozzászólására (») Jún 23, 2015 /
 
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
Következő: »»   2 / 32
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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