Fórum témák
» Több friss téma |
Hát nem is gondoltam én más nyelvre...
Úgy látom, teljesen hiába írom le már sokadszor...
Egy pillantást kell vetni a forrásra.
Ezt most nem értettem!
Ez most kinek szólt és mire vonatkozott?
Szerintem a IT rutinon belüli GIE bit piszkálása és a stack összefüggéseire. Mikor elugrik a pic az IT rutinra letiltja az azonos szintű megszakításokat, a RETFIE pedig újra engedélyezi, ezzel neked nem kellene törődni.
Értem, és köszönöm.
Amúgy ezt a cikket több nappal azelőtt zártam le, minthogy erre Hp41C felhívta volna a figyelmemet.
Írtam én erről már régebben is:
PIC16F kontroller: Mit tegyek, ha betelt a 2K? cikkben. A hozzászólás módosítva: Okt 11, 2015
Sziasztok!
Legutóbi cikkem programjával kapcsolatban jött néhány észrevétel. Úgy gondoltam, feltöltöm ide a programot, hogy a fórumon többen hozzászolhassanak.
Azt láttad az adatlapban, hogy a belső oszcinak mekkora a hőmérséklet függése? Nem valami pontos. Lehet nem kellene megspórolni az a 200 Ft-ot egy normális külső kvarcra.
Először is hozzátennék néhány gondolatot a timer kezelésről. A 151-es sorban először mented a TMR1H-t, majd az L-et. A timer folyamatosan számol, ezért előfordulhat olyan olyan eset, hogy a számláló pl. 0x01FF-en áll, ilyenkor lemented a H-t -> 0x01, mivel a movff 2 utasításig tart közben a számláló túlcsordul mondjuk 0x0201- re, ha ekkor lemented az L-et -> 0x01-et kapsz, az eredmény ( 0x0101) hibás lesz. Ez ellen megteheted például, hogy megállítod a timert mentés előtt, és csak a regiszterek törlése után indítod újra. A másik lehetőség, hogy mivel ez a pic támogatja a 16 bites timer műveleteket, ha engedélyezed, a TMR1L olvasásakor elmenti a H értékét is, így nem tud túlcsordulni, íráskor pedig a H értékét csak az L írásakor menti be a timer regiszterekbe. Tehát ilyenkor mindíg az L-et kell először olvasni és utoljára írni.
Nos rátapintottál a lényegre. Ezen igen sokat gondolkodtam, de végül nem tudtam megoldani. A timer megállításával próbálkoztam, csakhogy magasabb fordulaton az a 4-5 órajel is számít.
Erről a 16 bites timer mentésről még nem hallottam. Ha részleteznéd, főleg, ha egy pár soros példát készítenél, megköszönném.
Nincs példaprogram, csak a TxCON 7 bitjét (RD16) kell 1-be állítani .
Ha a megszakítás végén a retfie FAST utasítást írnád, mindenkinek eszébe jutna, hogy az árnyékregiszterekbe mentett értékeket visszateszi a fő regiszterekbe (WREG, STATUS, BSR...)
Az interrupt kezelésről is néhány szó. Először is kijelenthetjük, hogy semmi nem történik egyszerre és azonnal . A IT rutinra ugrásnak van egy késleltetése (interrupt latency), ami 3-4 utasítás. Ez akkor kerül előtérbe, ha konkurens IT-k kezelése zajlik. Ebben az esetben előfordulhat, hogy ha bejön a mérendő jel, bebillenti a RABIF-et, eltelik két ciklus, közben a timer számlálója is túlcsordul és ő is bebillenti a TMR1IF bitet. Mire az IT rutinra érek nem tudom pontosan mi váltotta ki az IT-t először. Mivel Te csak egy IT kezelsz le egyszerre, ilyenkor mindig a számláló növelése történik először (holott lehet a mérőjel jött előbb), majd ha ez végzett a pic újra belép az IT rutinba és végrehajtja a mentéseket. Ez a késleltetés (mivel ilyenkor a számláló számol tovább) magasabb fordulaton hibát okozhat.
A jelenlegi esetben ez a hiba lehet belefér a kijelzés kerekítésébe, ráadásul magas fordulaton hamar új eredmény születik, így legfeljebb csak felvillan egy hibás eredmény, de a szemünk észre sem veszi. Idézet: „így legfeljebb csak felvillan egy hibás eredmény, de a szemünk észre sem veszi.” Ezt már többször tapasztaltam, de azt hittem, az infra jibázik.
Ebben a PIC -ben van CCP modul is. A Timer1 eredményét el lehet tárolni a segítségével. Sőt még azt is meg lehet mondeni, mi történt előbb. Ha a betárolt minta felső bitjei egyesek, akkor a jel váltott előbb, ha 0 -k, akkor a túlcsordulás volt előbb.
Ez jól hangzik, és szivesen alkalmaznám, csak fogalmam sincs róla, hogy ezt hogyan kell.
Igen, a pontos időmérést a CCP modul capture üzemmódjával lehet megvalósítani, de így is működhet, csak ki kell számolni, hogy a timer mentése, törlése és az IT rutin hibája mennyire befolyásolja a pontosságot (mondjuk a belső órajel pontosságát is figyelembe véve), és egyáltalán mekkora pontosságra van szükségem. Szerintem a felvillanásokat a timer mentés hibája okozhatta inkább. Az IT-nél egyszerűen nem kell kiugrani a rutinból, ha végzett a számláló növelésével, hanem továbbengedni, és megvizsgálni közben jött-e RABIF megszakítás (hiszen az is lehetséges, hogy akkor jön mikor már a benn vagyok az IT rutinban és a mérőidőt növelgetem).
És még egy javaslat. Úgy látom ügyesen megoldottad, hogy amíg a számítás és kijelzés zajlik ne változhasson a kijelezendő érték a megszakítás miatt. Én ezt megfordítanám, hogy a mérések folyamatosak legyenek, legfeljebb nem kerül mind kijelzésre (lassú fordulaton úgyis ritkán jön mérés, minek dobáljuk el őket). A 32 bites számolás előtt egy segédváltozóba mentem az értékeket, amivel számolok:
Elég sok infót zúdítottatok rám Hp41C-vel.
Eltartott egy darabig, míg feldolgoztam. Ezek, az álltalatok jelzett hibák mind javításra fognak kerülni. Az is lehet, Hogy Pali79 tanácsa szerint rárakok egy kvarcot, csak nem úgy, ahogy ő gondolja. Arra gondoltam, hogy egy 1MHz-s kvarccal hajtanám Timer1-et, a proci frekijét meg fellőném 16MHz-re. Így a futási sebesség 4x gyorsabb lenne, így csökkenne az elcsúszás a számlálásban, ráadásul az időmérés pontossabbá válna. Vélemény?
Szia!
Felesleges a timer1-be másik kvarc, a rendszerórajel ottvan és pontos.Csak előosztót kell 4-re állítani. A timer2-őt pedig pofon egyszerű bármilyen frekin másodperc alapú megszakításra állítani. esetleg t2-t beállítod 1/10 vagy 1/100 másodpercre a ccp1 capture üzemmódjával ott a pontos freki, és nem függ semmilyen programcsúszástól, vagy megszakítás késleltetéstől sem. üdv.:Foxi A hozzászólás módosítva: Okt 14, 2015
Az lenne a kerdesem, hogy 32 bites adatot hogyan tudnek definialni? Az eeprom-ban szeretnem a program sorai koze. Mint a db es a dw, csak nincs tovabb. A data nem mukodik (nem jelez hibat, de csak wordot fordit) es a dd-re is hibat ad. MPASM-al forditom le.
Elore is koszi.
Sajnos nem jo, csak egyetlen byteot rak le.
Bocsanat, azt meg elfelejtettem, hogy 18F-es sorozatrol van szo, tehat 8 bites mikroproci. A hozzászólás módosítva: Okt 15, 2015
Változó értékről van szó vagy konstansról?
Szia! Ha van kedved böngészni! Mellékletbe betettem egy programrészletemet, ez egy fordulat után már kiírja az eredményt. A progi kb 2/3-át kitöröltem, de a maradékból kihámozható a lényeg.
(Én így csináltam..)
Konstansrol. De sok decimalisrol, szoval ha egy kellene csak, fognam a szamologep HEX-DEC forditojat es beirnam.
Meg tudom oldani igy is trukkosen, csak erdekelne, hogy van-e ilyen az MPLABon belul.
Hát... Mivel 8 bites PIC-et használsz, nem hinném, hogy a fordító támogatná a 32 bites számokat. A 16 bites Timer1 is TMR1L-ből és TMR1H-ból áll és nem egy 16 bitesből.
Szia!
Nincs, de szervezheted úgy az adatokat, hogy 4byte-ot olvas ki egymás után, és leteszi a megfelelő változóba.A mutatót néggyel növeled. Igy mégis tudsz 32 bitet tárolni.Hiszen a 32 bit nem más mint 4byte. Az első helyen a legkisebb helyiértékű byte van és követi a többi. A hozzászólás módosítva: Okt 16, 2015
Az MPLAB elfogadja az 1 Byte-os decimális számokat, nem kell átszámolni hexába.
Ismeri a több bittel rendelkező decimális számokat is: pl .1000 az ezer.
A byte -ra osztását így lehet megoldani: low(.1000) az alacsony helyiértékű (bit 7..0) byte: 0xE8 high(.1000) az magas helyiértékű (bit 15..8) byte: 0x03 upper(.1000) az felső helyiértékű (bit 23..16) byte: 0x00 |
Bejelentkezés
Hirdetés |