Fórum témák
» Több friss téma |
A kérés a INTCONbits.TMR0IF 1 -re álltja. Ekkor a konttroller áttér a kiszolgáló rutinra.
- Ha a művelet végrhajtási ideje alatt újra bekövetkezik, a INTCONbits.TMR0IF -et újra beállítja 1 -re. Ha ezek után a kiszolgáló törli a INTCONbits.TMR0IF -t és visszatér, egy kérés kiszolgálása kimarad. - A kiszolgáló törli a INTCONbits.TMR0IF -t a tényleges műveletek előtt. Ha a művelet végrhajtási ideje alatt újra bekövetkezik, a INTCONbits.TMR0IF -et újra beállítja 1 -re. Ha ezek után visszatér, az új kérés miatt újra beindul a fenti folyamat.
Aham, ha jól értem itt arra próbálsz rávezetni, hogy használjak egy másik timert, mondjuk timer2-őt és azt állítsam be úgy, hogy 1ms-enként okozzon megszakítást.
Tehát itt 1ms-onként történne egy megszakítás melyben vizsgálná egyszer, hogy hány megszakítást végzet már el (másodperc mérése 1000), ha elérte az 1mp-et, akkor további feltételként megjelenne a LED bekapcsolása és természetesen vizsgálni kellene a LED világításának időzítését is ami ez esetben 80ms... Ebben az esetben több lenne a feltétel, az nem befolyásolná rossz irányba a lefutási, kiértékelési időt? Vagy itt is képbe kerülne az, hogy a kiszolgálás elején törölnénk a timert, így a kiszolgálás független az újabb megszakítástól párhuzamosan lefutna? Egyébként ez nem rossz ötlet.. Főleg, hogy eddig a CPU foglaltságával nem is foglalkoztam kellőképpen.
Egy 48 MHz -es 18F4550 12000 utasítást tud végrehajtani 1ms alatt.
Köszönöm a segítséget..
Azt hiszem ezt az utóbbi tehát az 1ms-os megszakításos dolgot ki fogom próbálni, hiszen az elvileg gyorsabb, ha nincs kiértékelési kérés és nem foglalja feleslegesen a CPU időt, ha csak arra ténylegesen nincs szükség... Továbbá észrevettem, hogy az idő növelésénél 1-el többet adok meg így 1*333ms-al többet mér másodpercenként és ezért van ez a komolyabb csúszás. Viszont szerintem mindenképp érdemes volt erre a témára kitérni.. Sokat lehet tanulni belőle.. A hozzászólás módosítva: Nov 5, 2014
Amíg a megszakítást nem fejezed be, addig nem számít, hogy törlöd-e a megszakításjelző bitet, ill. hogy jön-e be újabb, mert amíg a megszakításban van, addig a processzor átállítja az INTCON.GIE bitet ( általános megszakítás engedélyezés ) nullára, azaz nem fogad újabb megszakítást, ezt állítja vissza assemblyben a RETFIE utasítás ( magasszintű nyelven a fordító dolga ezt befordítani! ) ! A HP41C kolléga által jelzett dolog ( a megszakítás elején töröld a bitet ) csak arra való, hogy amennyiben a megszakítás kiszolgálása alatt bejöhet még egy megszakítás kérés, akkor az ne vesszen el ( ilyenkor újra be tud állni a jelzőbit, mivel nem törlöd le a kiszolgálás végén! ) ! Ha ilyen sűrűn jöhetnek a megszakítás kéréseid, akkor az már eléggé kihegyezett feladat, érdemes valami nagyobb sebességre váltani vagy más megoldást / szervezést használni !
Szerk.: közben látom, már rájöttél egy jobb szervezési lehetőségre ! A hozzászólás módosítva: Nov 5, 2014
Sziasztok!
Vettem ezt a programozót mi kell hozzá, hol találok egy kapcsolást rajzot amire fel tudom a atmel chippeket rakni és beprogramozni. esetleg ez tud vissza felé is, ki tudom olvasni a chip programját Kezdésnek mit ajánlanátok Idézet: „mi kell hozzá, hol találok egy kapcsolást rajzot?” Leginkább az AVR - miértek, hogyanok topikban.
Sziasztok!
Egy rémisztően egyszerű problémával futottam össze, de vagy túl este van már nekem, vagy nem tudom, de nem világos teljesen a következő: Adott egy 10F204-es PIC, adatlapja: Bővebben: Link A 9.2.2-es résznél (INTERNAL 4 MHz OSCILLATOR) leírja hogyan kell kalibrálni a belső oszcit. Ezt ugye az alábbi módon lehet egyszerűen:
Ilyenkor a GP2 rendes portláb lesz, és az oszci freki "középső" értéken van. Viszont számomra ellentmondásos az adatlap: Idézet: „calibration instruction is programmed into the last address of memory” utána pedig: Idézet: „and is placed at the Reset vector” Csináltam már ilyet, de az másik családú PIC volt, és ott azthiszem az utolsó helyre kellett egy RETLW utasítást berakni a kívánt OSC értékkel, amit ha meghívtunk a Reset vectornál egy CALL utasítással, akkor ugye az bekerül a WREG-be, amit aztán berakhattunk az OSCCAL-ba. Viszont itt MOVLW-t ír, és az sem egyértelmű, hogy milyen formában kerül a program végéről a program elejére ez az érték.. Továbbá azt sem értem minek kell így bonyolítani. Miért nem jó simán a reset vectoron a movlw aztán movwf .. ? Egyszer talán megértettem, de nekem most lehet túl este van már.. Előre is köszönöm!
Szia!
Ha állandó értékű sztringeket akarsz tárolni, akkor azt ne RAM-ban tárold,háttértárnak a flash memóriát használd. Lehetőleg globális változókat használj, hogy a fordító ne újabb és újabb byte-okat foglaljon le minen függvényhez. Neked 4x80 byte memóriád van összesen 4 lapon , és plusz 16 byte ami minden lapon közös. Ha mindenképp sok ram kell, aránylag egyszerűen csatolható soros vagy párhuzamos RAM a kontrollerhez. akár 128kx8 is. üdv. Foxi A hozzászólás módosítva: Nov 5, 2014
Szia!
Simán a MOVLW 0x00, MOVWF OSCCAL rész kell. A reset vektoron való elhelyezés csak annyi, hogy a program 0x00 címére, tehát így:
A te általad említett RETLW, CALL dolgot nem értem teljesen értem. Azt, hogy az utolsó memória helyen van tárolva, ha jól rémlenek Hp41C sorai, azt jelenti, hogy gyárilag a 4 MHz-nek leginkább megfelelő OSCCAL érték el van tárolva a PIC-ben. Ezt felhasználás (törlés, programozás) előtt "illik" kiolvasni és ezt az értéket visszatölteni, persze ez alól kivétel a 0 bit, ami ai I/O portot állítja. A hozzászólás módosítva: Nov 5, 2014
A 10F20x a Baseline családba tarozik. Náluk a reset vektor a memória utolsó utasítása. Ide kell elhelyezni a movlw OSCCAL_value utasítást. Ha ez végrahajtódik, a 0 címre jut a vezérlés, de a W -ben benne lesz az érték, amit az OSSCAL regiszterbe kell tölteni.
Ld. Adatlap Figure 4-1. Idézet: „Note 1: Address 0000h becomes the effective Reset vector. Location 00FFh contains the MOVLW XX internal oscillator calibration value.”
Köszi a választ, így már érthető!
A proteus szimulációja zagyvaságot ír, de MPLAB SIM-ban valóban az utolsó címről kezdi. Viszont az még nem egészen világos, hogy ez a módszer miért jobb, mint ha simán a 0x00 címre írnám a MOVLW OSCCAL_value-t (ahogy pl. Pali79 is írta)?
Az utolsó címre a gyári teszteléskor beírják az értéket.
PIC 18 nál miként lehetne az alábbi keresési algoritmust egyszerűsíteni?
Valahogy nekem az hiányzik, hogy a cpfseq akkor ugrik ha egyenlő, de olyan meg nincs ami akkor tenné ha nem egyenlő. Ez esetben nem kellene minden vizsgálati sorban egy "felesleges" bra. Van alternatív megoldás?
Miért nem XOR-t használsz?
...Még az eredeti atat is megmarad... A hozzászólás módosítva: Nov 6, 2014
Köszönöm válaszod. Megpróbálom értelmezni amit írtál... Nekem még ez elsőre kínai, most barátkozom a PIC-eccel. Globális változó alatt azt érted, hogy például létrehozunk egy Char tömböt LCD1 néven és ennek adunk egy 16 karakteres tömböt, majd ugyanezt megcsináljuk mondjuk LCD2-vel, feltételezve, hogy 2*16 karakteres Lcd használunk, és csak a két tömböt jelenítjük meg a kijelzőn, úgy, hogy a tömb karaktereit irkáljuk át a éppen megjelenítendőre? Nekem még ez a 4*80 byte 4 lapon ez teljesen magas. Ne haragudj, de én azt gondolom, hogy nem ismerem eléggé a pic lelki világát (felépítését), hogy ezt tudjam értelmezni. Nyilván az a baj, hogy C nyelven programozok, nem assamblyval kezdtem. Ez a külső ram jól hangzik, de egy soros kommunikációt levezényelni számomra még nem egyszerű. Hőmérő IC-ket (ds18b20 vagy DHT 22) sikerült már működésre bírni, de magamtól nem írtam még ilyen (számomra) bonyolult kódot. Ha le van írva a kód, akkor tudom értelmezni, de kitalálni magamtól még nem megy. Még egyszer köszi. Tanulgatok, olvasgatok tovább.
Megbújik a 16F88x -ben még kétszer 16 byte a 2. és 3. bankban a 0x110 .. 0x11F és a 0x190.. 0x19F címeken.
Nos követve Hp41C által javasoltakat, 8bit-es timer-el (ez esetben timer2-őt) próbálkozom.
A mostani teszt környezetem egy 18F452-es PIC amit 10MHz + 4*PLL-el használok. Tehát itt 40MHz-vel kell számoljak. Ha követem azt az elvet, hogy egy kisebb timerrel próbáljak meg dolgozni és ne használjak késleltetést mert az ügye az jobban terhelné a CPU-t és így kevésbé hatékonyan van kihasználva az erőforrás. A következőkre jutottam: 1/(4/40MHz) == 100ns. Ha timer2-őt használok és előtöltöm PR2-őt 255-el, akkor a megszakításom 25,5us-onkénti ciklusba fog pörögni. (0,0000001*255 == 25,5us) Ha ezt a szisztémát követem, akkor itt 40 ciklusonként fogok 1ms-ot kapni és 40x1000 vagy is 40.000 ciklusonként kapok 1 másodpercet. Szerintem ez hibás, így kérlek okosítsatok fel.. Köszi.. A hozzászólás módosítva: Nov 6, 2014
Szia, úgy látom te nem igazán értetted meg Hp41C kolléga szavait...
Ő azt mondta, hogy használd a timer2-t KÜLSŐ 32768Hz-es kristállyal, azért a timer2 mert tudtommal csak annak van összeköttetése egy másodlagos oszcillátorral, és az 8 bites is, így az előbb említett kvarc tökéletesen osztható 2^8-al (256) így ezzel másodpercenként 128 megszakításod lesz, ha ezt egy változóban tárolod és minden megszakítás után növeled akkor a 128-ik megszakításnál pontosan 1 másodperc lesz! Az előbbi hozzászólásodban leírt próbálgatások teljesen fölöslegesek, mert ugyanezt a másik (18f4550-es) PIC-el is el tudtad volna végezni. A lényeg az volt, hogy ne a proci órajelét használd, hanem egy teljesen más órajelet amit szépen lehet osztani. Egyébként ezeket használják órákban is a pontos 1mp előállítására, nem véletlenül volt ez említve
Nem ezt mondta.. Ezt Pali79 javasolta.
Nem fontos számomra a tökéletes 1mp, de közel annyi kellene azért mivel mérem az időt csak kis intervallumban.. Ő arra mondott példát, hogy ne használjak delayt mert az nagy százalékban használja feleslegesen az erőforrásokat. Használjak inkább rövidebb megszakításokat és azokat számoljam és elérve a megfelelő időt végezzem el a szükséges beállításokat.. Csak kicsit sokallom a másodpercenkénti 40e megszakítást ezért gondolom, hogy nem jó valami... Idézet: „Az előbbi hozzászólásodban leírt próbálgatások teljesen fölöslegesek, mert ugyanezt a másik (18f4550-es) PIC-el is el tudtad volna végezni.” Nem felesleges mert közben az a PIC beépítésre került... Természetesen használtam már óra kvarcot, de most ezt kihagynám, főleg azért mert a módosítani kívánt programomnak már le van gyártva az elektronikája.. A hozzászólás módosítva: Nov 6, 2014
Timer2 -nek van elő- és utóosztója is. A timer2 megszakítási ideje
titt2 = 1 / (Fosc / 4 / <T2_prescaler> / (PR2+1) / <T2_postscaler> ) Ha 1ms megszakítási időt szeretnél: T2_prescaler = 4, T2_postscaler = 10, PR2+1 = 250 azaz titt2 = 1 / (40E6 / 4 / 4 / 250 / 10 ) = 0.001 s @matheattila A timer2 csak a belső órajelről járatható. A megoldásnak van még egy hátránya: A timer2 nem működik alvó állapotban. Érdemes olvasgatni a timer1 errata -t is. A hozzászólás módosítva: Nov 6, 2014
A fene
Elő és utóosztókkal nem számoltam (pedig tudtam, hogy van, de valamiért kimaradt...) Köszi... A hozzászólás módosítva: Nov 6, 2014
Ha TMR0-val akarod az 1mp-es megszakítást akkor itt egy példa:
majd a megszakítás kezelő rutinban ismét:
és kész is a pontos 1mp-es megszakítás. Ha kisebbet akarsz akkor az a lényeg, hogy olyan előosztókat használj amivel a lehető legpontosabban el tudod osztani az órajelet úgy, hogy beleférjen a timer-be (8 biten 256, 16 biten 65536).
Pontosan ugyan így csinálom, csak time1-el
A kérdés itt nem ez volt... De megoldódott... Köszi..
Így is lehet.. Azonban probléma léphet fel, ha más megszakítás kiszolgálásával van elfoglalva a kontroller. Ekkor a beírás helyett jobb lenne a hozzáadás. A hozzáadással is lehetnek problémák, ha elég nagy a szám, amit az alsó feléhez kell hozzáadni. Ráadásul 16 bites módban a TMR0H egy átmeneti regiszteren keresztül olvasódik ki ill. a TMR0H -t kell előbb beírni, aztán a TMR0L beírásakor töltődik át. Az jócskán megnehezíti a hozzáadást. Innen indultunk. Mégiscsak egyszerűbb a helyzet, ha a timert egyszer felprogramozzuk, aztán elketyeg minden beavatkozás nélkül....
A timer1 -nek is lehetnek bosszantó dolgai: Microchip Timer1 errata. A hozzászólás módosítva: Nov 6, 2014
Sziasztok
Pickit2 klon-t használok, a kérdésem az lenne az eeprom data-ban a kettő darab FF milyen értékü illetve mi szerint tudom átszámolni?
PC számlógép tudományos (vagy programozói) nézet.
16-os 8-as kettes és tizes számrendszer oda és vissza. üdv.:Foxi
Tervezem egy redőny-motor vezérlő PIC-es áramkör építését. Van egy dolog, amiben elakadtam. Az asszony szeretné, hogy legyen olyan betanítható pontja a redőnynek, mondjuk 1/3-nál, hogy betanulás után megnyom egy gombot és oda áll a redőny magától. Én ezt úgy gondoltam megoldani, hogy PIC betanulja a teljes út idejét, majd amikor a 1/3 pozícióban betaníttatjuk elmegy valamelyik végállásig, közben méri az időt, majd a kapott időt levonja a teljes menetidőből.
Az egész lelke egy 16f887 vagy 18F4550 lenne. Ötleteket szeretnék, ti hogy oldanátok meg. PIC programozásban sajnos nem vagyok annyira penge, de ha mondjátok mibe ássam bele magam... Jelenlegi tudásom szerint a timer0, 1, 2 lehetne használni (ebből az 1-es az 16 bites, amely nagyobb felbontást eredményezhet.). De nem tudom, hogy melyik regisztert hogy kellene beállítani, a timerhez (ezzel még ismerkednem kellene). Gondoltam, hogy számlálóval is csinálhatnám,de ennek a használatát is példákból el kellene tudnom sajátítani. Ha esetleg valaki tud valami példa áramkört , leírást, e két témakörben MicroC nyelvre, azt nagyon megköszönném. |
Bejelentkezés
Hirdetés |