Fórum témák
» Több friss téma |
Sajnos nem, hanem halványan világít.
nedudgi: A sorok kapnak magas szintet az oszlopok a testet kapcsolgatják.
A fentebb beillesztett sor a sorok kikapcsolásáért felel elvileg. Úgy tudom, ha szimplán kiolvassuk az előre definiált változót akkor alapértelmezett állapotba tér vissza és ilyenkor a sorok alacsony szintre kerülnek vagy nem?
Köszönöm, nálad a pont.
Nem kapcsolta ki a sorok szintjét és ezért volt gond.
Így már jól működik.
Sziasztok!
Van egy NTK típusú hőmérő ellenállásom. Kétütemű motor gyertya hőmérsékletét szeretném vele mérni. Hogyan lehetne PIC-el megoldani? Én arra gondoltam, hogy áramgenerátorral hajtom, és AD konverterrel mérem a rajta eső feszültséget. Van más megoldás is?
Ez jó megoldás. Ha valamiért bonyolítani akarod, akkor pl. lehet vele oszcillátor freki meghatározó elemét készíteni és akkor frekvenciát kell mérned... !
16F886-os pic-nél szeretnék egyszerre használni timer2 időzítőt és Dallas18B20 digitális hőmérőt.
Olyan problémába ütköztem, hogy ha a timer2 inicializálásakor az INTCON.PEIE := 1; értéket kap, akkor a hőmérő csak -1 fokot mér RA1 lábon. Meg lehet oldani valahogyan, hogy timer2 mellett működjön a hőmérő is?
A "GIE" globális megszakításokat is engedélyezted?
Esetleg még az analóg lábakat digitálisra állítani... Vagy a megszakítások megvannak, csak a hőmérő adatait nem olvassa? Esetleg próbáld ki kettős pont nélkül is:
A hozzászólás módosítva: Jún 27, 2014
Mikropascalban programozok. Abban kell az értékátadáshoz a kettőspont.
Külön külön jól működik az időzítő és a ds1820 is. Ha viszont a PEIE megkapja az 1-es értéket, akkor -1 fokot számol a program. Ahogyan keresgetek a neten, úgy látom nem csak én botlottam ebbe a problémába, de még mindig nem értem pontosan mi áll a hátterében. Most annyival tudtam orvosolni, hogy a ds1820 olvasása előtt kikapcsolom a PEIE-t, aztán meg vissza. Ez persze pocsék megoldás, mert a timer2, így teljesen pontatlan lesz. Sajnos a programban már használom a timer0 és timer1 időzítőket is, így nem egyszerű kiváltani a timer2 szerepét, ill. a ds1820-at sem cserélném le szívesen.
A hozzászólás módosítva: Jún 27, 2014
Pff akkor passz.
C-ben próbálkozom szóval ehhez kicsit sem konyítok. Az, hogy ennyi timer-t használsz nagyon megbonyolítja a dolgot... Más: Ha portbővítő IC-t használok (74HC595) 7 szegmenses kijelző meghajtására, akkor is kell vagy érdemes a lábak elé egy 270Ohm-os ellenállást betenni vagy ilyen meghajtó IC-knél nem kell?
Igen kell. Gondolom nem 5V-os kijelző használsz.
Idézet: Nyilvánvalóan az a probléma, hogy szoftveres időzítéssel olvasod ki a hőmérőt. Abba viszont belerondít az, ha közben beüt egy megszakítás. Ezt megérteni nem nehéz, megnyugtató megoldást találni már nehezebb... Muszáj neked ilyen hőmérőt használni? Van annyi analóg, I2C, vagy SPI kimenetű is, amivel egyszerűbb volna az élet. „Most annyival tudtam orvosolni, hogy a ds1820 olvasása előtt kikapcsolom a PEIE-t, aztán meg vissza.”
Mivel a mechanikai résszel egyenlőre nem tudok foglalkozni, ezért elméletbe maradok az első felállásnál, miszerint fordulatonként egy impulzus jön be a CCP-re. Számításaim szerint 1 km/h sebességnél kb 4,2 s-enként jön be egy impulzus. Ha maradok a 4 MHz-es kvancnál akkor 1 us léptetéssel számolva ez idő alatt kb 64-szer csordul túl a Timer1. A túlcsordulások számát tárolom egy változóban (T). Az időt ez esetben így gondolnám kiszámolni: (T×65535)+ <CCPR2H:CCPR2L>
Jó ez így?
Nem pontosan. Csinálj egy 3-4 byte-os változót, ami simán csak számol, a felső byte-ban a túlcsordulásokat. Ezt a változót mented a capture-ban Túj néven, mikor bejön a következő impulzus kiszámolod a különbséget (Túj-Telőző), ez lesz az eltelt idő, az új értéket mented a Telőző-be. A számlálód szabadon futhat, nem kell nullázgatni.
icserny-nek is válasz:
Ilyet vettem: Bővebben: Link Akkor ide érdemes talán még meghajtó tranzisztorokat is betennem? Vagy, ha multiplexelem akkor az nem kellene? Gondolom a PIC és a 74HC595 közé nem kell semmi csak simán rákötöm ott nem keletkezik terhelés.?
Ezt a szabadon futhat dolgot nem értem egészen. Mi van akkor ha a változó túlcsordul? Akkor előfordulhat, hogy a Túj értéke kisebb lesz mint a Telőző. Nem jól gondolom?
De, jól gondolod, csak 4 byte-on ritkábban fog bekövetkezni, de "befog" !
Akkor ezzel nem sokat nyerek csak elbonyolítom a későbbi számítást, így is 24 bites lesz végeredmény ha jól értem, azzal is fogok küzdeni.
Szerinted jó az előzőekben felvázolt képlet?
Szerintem jó! De miért nem használsz még előosztót a TIMER1-hez? Ha pl. 64-es előosztót használnál, akkor 64 us pontosan tudod mérni az időt! Nem tudom, milyen sebesség intervallumban akarsz mérni, de pl. a 4,2 s-hoz képest nagyon elhanyagolható, ha 64 us pontosan mérem meg ( a konkrét feladat ismeretében esetleg továbbgondolva, lehet, hogy még tovább lehet egyszerűsíteni a feladatot! Írd fel magadnak a hozzátartozó képleteket és nézd meg, mivel tudnád egyszerűsíteni ! ) !
Idézet: ... Mert a 16F877A -ban nincs, csak 1/1, 1/2, 1/4, 1/8. Egy külső átkötéssel a Timer1 órajelét lehetne a Timer2 és egy CCP felhasználásával a CCP kimenetéről vezérelni. „De miért nem használsz még előosztót a TIMER1-hez?”
Idézet: „Egy külső átkötéssel a Timer1 órajelét lehetne a Timer2 és egy CCP felhasználásával a CCP kimenetéről vezérelni.” Ennyi erővel akkor már lehetne egyenesen a Timer2 megszakításában növelni egy változó értékét (mint ahogy azt a Timer1 tenné a TMR1H és TMR1L regiszterekkel) és ha még az sem elég akkor annak egy bizonyos értékénél lehet egy másik változót növelni, majd az első változót nullázni (mintha a Timer1 túlcsordult volna)
Amikor a megszakítási területen vagyunk, lehet olyan szubrutint meghívni ami egyéb memóriaterületen van? Vagy ez problémás?
Mindent lehet, csak a futási időkkel számolni kell. Lehetőleg a megszakítás kezelő rutin legye rövid.
Nem a feladat megoldásához fűztem megjegyzést, hanem az ajánlathoz.
Van erre valami megkötés, hogy mennyi utasítást lehet a megszakításba tenni?
Elvi megkötés nincs.
Ha egy kérés kiszolgálása alatt egy másik kérés is érkezik, akkor az első kiszolgálása alatt a második kérés várakozik, a feldolgozása az első kérés teljes kiszolgálása után kezdődik. Előfordulhat, hogy a további kérések kiszolgálása annyi időt vesz igénybe, hogy egyes kérések már többször is befuthatnak. Ez a szituáció vezethet hibás működéshez. Pl. időzítő megszakítás kiszolgálása viszonylag hosszú, annyira, hogy közben az UART egység kérésének kiszolgálása nem tud lefutni, mire a következő karakter vétele befejeződik.
Azért írtam 3-4 byte-ot, mert nem tudom miben programozol, ha C-ben akkor a long 4 byte-os ( a 24 bites gondolom macerás ). A túlcsordulást mindenképpen figyelned kell ( vagy valami korlátot), hiszen ha áll a traktor (vagy nem traktor ), számolhatsz az idők végezetéig. A 24 bites változó kb. 16s alatt csordul túl ( a 32 bites kb. 70 perc ). A szabadon futón az értem, hogy folyamatosan növeled, ha elérte 0xFF-et 0-ra ugrik (mint normálisan). A kivonásnál a kettes számrendszerben helyes eredményt kapsz ha maximum csak egy "átfordulás" történt, akkor is ha Túj kisebb mint Telőző.
Ezt az új-előző játékot úgyis játszanod kell, hiszen mikor bejön az impulzus mented a CCPRxL-H értékét, a következőnél is, és így számolod a különbséget (hiszen, mondjuk 100km/h-nál 42ms-onként jönnek az impulzusok, tehát csak a CCPRx regiszterek különbsége adja az eltelt időt).
Jogos, de 8-as osztásnál is javul a "megszakítások sűrűsége" !
Még egy ötlet (bár nem tudom milyen funkciókat használsz még más feladatokra):
Az egyik CCP modullal előállítasz egy 11904,76Hz-ez órajelet, ez pont az 1/4,2s 50 000 szerese. Ezt az órajelet számolod a másik CCP modullal capture üzemmódban. Így a kapott 16 bites értékkel kell tovább számolni, minimum mérhető sebesség (ahol túlcsordul) 0,76km/h. Az 1km/h-hoz ugye az 50 000 tartozik, 100km/h-nál a pontosság még mindig 0,2km/h. A számítás: 50000/(Túj-Telőző) Remélem érthető voltam . |
Bejelentkezés
Hirdetés |