Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Még annyi kérdésem lenne, hogy a megszakítások prioritását hol lehet állítani? Kéne a kütyübe egy BATTLO jelzés, és ennek a megszakításnak előnye kell legyen az ADC megszakítással szemben, mivel csak 2 X 8 karakteres az LCD.
Köszi
Ha jól emlékszem egy 16F-et használsz, annak nincs csak egy megszakítási pontja. Így ha az ADC megszakít, azt nem tudod megszakítani. De mivel ez nem annyira fontos, nem is kell megszakításból kezelni. Lehet, hogy dugába dől a jó terved. De ne keseredj el, ez velünk is pont így megtörténik, ha nem godnoljuk át az egész program vázát előre. Ilyenkor előről kezdjük!
![]() Idézet: A programban. Úgy láttam, hogy 16f690-es volt az MPLAB-ban kiválasztva. Emlékeim szerint ebben egyszintű a megszakítás. A prioritást a megszakítások kiszolgálásának sorrendje határozza meg. Tehát az ISR-ben a fontosság sorrendjében ellenörzöd le a megszakítást jelző flag-eket és így azt a rutint hajtatod végre előbb, ami a fontosabb.„Még annyi kérdésem lenne, hogy a megszakítások prioritását hol lehet állítani?” A 18-as pic-ekben a megszakítás már több szintű, ott kell különböző regiszterekben beállítani azt.
Ajánljatok már egy 16f877-hez hasonló 18-as ic-t mert a megszakítási szintek elég fontosak.
bummm. Ez pofára esés...
![]() ![]() ![]() ![]()
Köszönöm, de ezek szerint nem is kell 2 megszakítást kezelnem.
Azért köszi az infót.
18F452 vagy 18F4520. Talán ez utóbbi olcsóbb is, és valamivel többet is tud, mindenesetre mindkettő tudja azt, amit a 16F877.
Igen én javasoltam, de ennek több módja is van. Érekelne, hogy milyen más megszakításos ütemezéses ötleted van a jelenlegin kívül!
Amit írsz igaz, de a prioritást csak részben határozhatja meg a lekezelés sorrendje. Azzal nem tudsz mit kezdeni, ha egy megszakítás lekezelése közben egy újabb jön, ami fontosabb. Meg kell várd, míg lekezelődik az előző! A 18F-es megszakítás megoldása ennél kifinomultabb, ott a high megszakítja a low-t. Persze ezzel vége is, több prioritás nincs.
Egyszer már volt róla szó, hogy miben különbözik pl. egy 16f84 meg egy 16f84a, de akkor csak annyi derült ki, hogy az utoprogramozása kicsit más.
Én elolvastam már 2 magyar leírást az pic ic-k programozásáról, de ott nem találtam ilyen utalásokat, és az utasításkészletben sem láttam különbséget. Kérdés: Miként lesz egy 16f84-re irt asm-ből 16f84A hex file?
Ahha. Akkor ha jól vettem ki a doksiból, akkor a programon semmit nem kell faragni, az időzítésen sem ha ugyan azzal az oszcillátorral van meghajtva, csak az A sorozat tud 20Mhz felett is ketyegni valamennyivel, míg a sima csak 10Mhz felett valamivel.
Csak akkor most nem értem, hogy a Potyó féle icd2-es égetőhöz miért volt külön A-s és Sima hex file is, bár lehet hogy a 877-ben más különbségek is vannak. Köszi a linket. Idézet: „Csak akkor most nem értem, hogy a Potyó féle icd2-es égetőhöz miért volt külön A-s és Sima hex file is” Látod, magad megis válaszoltad: Idézet: „a 877-ben más különbségek is vannak” Az A jelzés csak azt jelenti, hogy van valami eltérés. Nem jelent konkrét eltérést!
Akkor most már ezt is tudom. Mindegy a ponghoz 16f84-et irnak, nekem meg 16f84A-m van, de az jó lesz, aztán ha a 877-est már kivűlről fújom, akkor veszek egy 18F4525-öst.
Viszont azért azon padlót fogtam, hogy a 24-es sorozat 1000 lábú ic-i is csak 1200Ft-ba kerülnek, szóval ez baromi olcsó.
Így van, olcsó! Ajánlom figyelmedbe a 18F4620-at is! Ha C-ben nyomod, van bőven memória. Igaz a 4525-ös is elegendő, de 200Ft-on ne múljon, hogy nem fér bele a sokadik éves fejlesztés!
![]()
Próbálkoztam a timerrel.
Timer0-t használok, 8bites regiszterrel és 4-es előosztóval. Betettem 1 LED negálást a másodpercek növeléséhez. Először a segédváltozó 46875-ös (48M/8/256) értékénél növeltem a másodperceket, ekkor a LED kb 5 másodpercig világított. Erre elosztottam a 46875-öt 5-el, majd a TMR0L-be 4-et raktam kezdőértéknek, mert 4 C-s utasítást számoltam a segédváltozó növelése előtt. Így a LED villogás stimmelni látszik, 1 másodpercig világít. Viszont 1 óra alatt összeszedett kb 5 perc késést. Ezért nem akartam próbálgatni. Ezt, hogy lehet korrigálni? Próbáltam MPLAB SIM-el debuggolni a progit, de elakadt az _asm goto _startup _endasm utasításnál (bootloadert használok). Közben elkezdtem foglalkozni a hőmérsékletkijelzéssel, mert azt is szeretnék. Softveres I2C-t használok, mert a hardveresnek az egyik vezetékén van a bootgomb. A hőérzékelő DS1621. Először a PICC fordítóban található ds1621.c-t írtam át a súgója és az MCC18 Library doksi alapján. Mivel ez nem vezetett eredményre (folyamatosan 795-öt kaptam, ha jól emléxem), újrakezdtem a ds1621 adatlapja alapján. Így se lett az igazi, vmiért 255-öt ír ki. Az sw_i2c.h-ban átírtam a konstansokat a megfelelőekre, hozzáadtam a projekthez az i2c forrásfájlokat. Fordításnál a projekt könyvtárában létrejönnek a .o-k. A ds1621 adatlapja alapján egyszerűnek tűnik, viszont az MCC18 Libraryban lévő példa már bonyolultabb. Mellékelem a ds1621.c-t, remélem vki tud segíteni. Jó lenne végre 1 kis sikerélmén ![]() Előre is köszönöm mindenkinek a segítséget!
Jut eszembe: a ds1621 bekötésében nem vagyok biztos. Itt az oldalon van 1 óra projekt, abból szedtem ki. A 2 SDA-t összekötöttem, a 2 SCL-t is és úgy mennek a PIC-re. Máshol 4,7k-s ellenállásokat láttam.
Jó így?
Ez így jó!
Idézet: „A 2 SDA-t összekötöttem, a 2 SCL-t is és úgy mennek a PIC-re.” Ezt a mondatodat nem értem, mit kötöttél össze? Két hőmérőd van?
A sok kérdés miatt egyelőre csak egy részt vegyünk:
Idézet: „(48M/8/256)” A Timer0 bemenetére nem a FOSC 1/4-e megy? Nézz utána az adatlapban 11-1 ábra!(csak hogy szokd meg, annak mindig nyitva kell lennie, és nem nekünk kell benne a kérdéseid után böngészni, ugyanis mi sem vagyunk káptalanok! ![]()
A mellékelt rajzon 2 SDA van, ezeket kötöttem össze, ugyanígy tettem az SCL-el is. Egy hőmérő van.
Az ábrán Fosc/4 megy, de van mellette T0SE is, nem teljesen világos. A szövegben nem találtam utalást a Fosc-ra. Lehet, h láma kérdés, de ez mi, az órajel?
A T0SE az a Timer0 Source Edge bit a T0CON regiszterben. Számodra jelentéktelen itt. Az Fosc az oszcillátorfrekvencia.
Ha a szimulátor valahol, a szimuláció számára lényegtelen résznél akad el, akkor ideiglenesen dobd ki belőle azt. A szimulátorral pontosan be lehet lőni az időzítésekek, csak egy kicsit kisérletezni kell az értékekkel.
Én ugyan nem menyus vagyok, de én ugy csináltam az LCD kiirást hogy a megszakitásbol csak egy 32 byte-os tömbbe tettem a szöveget (2x16-os LCD) és egy jelzöbittel közöltem hogy lehet frissiteni a kijelzö tartalmát. Ezt viszonylag gyorsan meg lehet csinálni mert semmilyen eszközre nem kell várakozni.
A föprogram végtelen hurkában pedig figyelem a jelzöbitet. Ha jelzés van akkor ráküldöm az LCD frissités rutinra ami buta módon a teljes 32 bájtos tömböt kiirja az LCD-re. Itt nem számit hogy mennyit kell várni az LCD-re mert ugye bármikor meg lehet szakitani a folyamatot. A jelzőbitet a kiiro rutin elején törlöm, hátha már a kiirás alatt valymelyik megszakitásban futo rutin modositja az LCD szövegét.
Megjegyzésbe raktam a vector remapping részt, igaz, h így is belemegy 1 addFP.asm-be, de legalább nem ragad bele, run-ra továbbmegy.
Programozónak tanulok, használtam már debuggert, de ezt a simet nem vágom, h lesz jó pontosítani az időzítéseket, ha lépésenként futtatom? A disassembly listing ablak alapján próbáltam megszámolni az utasításokat a megszakításkezelőben, de bekerül 1 ciklusba, ha az az aktív ablak léptetéskor. C-s kódnál nem, meg nincs is ott ciklus.
Van egy olyan, hogy Stopwatch. Ott lesz két-két számláló. Az egyik mutatja, hány utasításciklus futott le a reset óta, a másikat meg kézzel nullázhatod. Ha megadod az oszcillátor frekvenciáját, akkor az eltelt időt is látod mindkettő mellett.
A felhúzó ellenállások 10k helyett inkább 4,7 k-sak legyenek, nálam 10 k-val nem ment a ds 1621. Az I2C specifikációról van magyar nyelvű leírás is, talán www.tavir.hu oldalon.
Ugyan nem MCC18-ban, hanem PICC CCS-ben a működő, kipróbált ds1621-et kezelő kódom így néz ki. Gondolom kommentek nélkül is érthető és rögtön észreveszed, hogy az init-ben a konverzió indítása (0xee) megelőzi a konfigurálást (0xac)!
Az LCD-re írás pedig így néz ki:
A printf-ben a formátum megadása után látható fok jelet persze csak akkor jeleníti meg, ha az előtte az LCD-ben saját karakterként definiálva van.
köszi a tippet, majd csak jövő hétvégén tudom kicserélni az ellenállásokat
nem értettem, hogy miért a config előtt indítja a konvertálást, adatlap se írja, hogy fel kéne cserélni most felcseréltem, de a helyzet változatlan a kiírásnál miért kell kivonni a datah-ból 256-ot? az adatlap alapján abban a hőmérséklet egész része van kette komplemensben magyar i2c-s leírás ezen az oldalon is van, meg van vmi Kandós jegyzetem, azokat is olvastam potyo: megtaláltam, 150 utasítást számolt, de ha azt beírom regiszter kezdőértéknek, siet az óra
Ne azt nézd, hány utasítás, hanem mennyi idő telik el, amíg ráfut ugyanarra a kódrészletre. Tegyél breakpoint-ot a megszakítást követő első utasításra, indítsd el a progit, amikor ráfutott a breakpoint-ra, akkor megáll. Ekkor a Stopwatch-nál a Zero gombbal nullázod a számlálót, majd ismét elindítod a programot. Ekkor látod, mennyi idő telik el két megszakítás között. Ha ez nem annyi, amennyi kellene, hogy legyen, akkor módosítasz a kezdőértéken. Érdemes erre az időre letiltani az összes többi megszakítást, ne zavarjanak be a szimuláció folyamán.
De ha megmutatod a kódot, vagy legalább azt a részletét, ami az időt kellene, hogy mérje, akkor tudnánk többet mondani. |
Bejelentkezés
Hirdetés |