Fórum témák
» Több friss téma |
Fórum
A Projekt opciókban megadott érték igazábol egy egysoros C kódot generál, ami valami ilyesmi:
osccon: tetszik, nem tetszik, ez így működik. Ha belső órajelet használsz, valahogy meg kell mondani a PIC-nek, mire állítsa be a belső órajelet. A regisztert két esetben nem kell piszkálni: 1: Belső órajelet használsz és az alapértelmezett érték megfelel (lásd melléklet, pl. PIC18F14K22). 2: Valamilyen külső órajelet/kvarcot/rezonátort használsz. Külső kristály: Pontosabb mint a belső, cserébe buksz egy-két lábat. Időalapú kommunikációnál és időmérésnél lehet érdekes a pontosság, pl. UART (RS232), 1-Wire (pl. DS18B20), stopperóra. Élvezérelt kommunikációnál, ahol a fel- vagy lefutó élek adják az ütemet és az eszköz nem ragaszkodik kimondottan egy sebességhez (SPI, I2C, 2x16 karakteres LCD kijelző), elég a belső órajel pontossága. Mellékszál: minél bonyolultabb a PIC, annál összetetteb pl. az órajel beállítása is. A hozzászólás módosítva: Jan 30, 2023
osccon:01110000;
Első C blokkal beállítja a belső órajelet 8 MHz-re. Az "osccon:01110000;" formátum helyett javaslom inkább az "osccon=0b01110000;" variációt. Lehet, hogy kettősponttal is működik, én még nem láttam ezt a variációt. A szám sincs meghatározva, miszerint az binárisan értendő és lehet, hogy decimálisként értelmezi a fordító (most nem tudom kipróbálni). Inits makró: bekapcsolja az I2C modult és elindítja a kijelzőt. Igaz, utóbbit egyszer már megtette a fő függvényben. RTC_W változó 208 lesz (0b11010000), RTC_R változó pedig 209 (0b11010001). Az egyikkel írni, a másikkal olvasni lehet az RTC-ből. Read_Time() makró: kiolvassa az időt az RTC-ből, pontosabban a másodperc, perc, óra és nap adatokat. A dátum, hónap és év adatokkal nem foglalkozik a program, nem is kötelező. Disp_Time makró: a kiolvasott adatokat kiírja a kijelzőre, mindig két számjeggyel, pl. 03:12:37, a napot már szöveggel. Egyelőre ennyi. Melyik része nem érthető?
Lépések:
1: kiválasztod, hogy belső vagy külső órajellel akarod hajtani a kontrollert (jelen esetben belső). 2: kiválasztod az adatlap alapján, hogy a lehetőségek közül melyikkel élsz. Én a 8 MHz-et választottam neked. 3: Flowcode -> Build menü -> Projekt opciók... -> Chip beállítása (kipipál) -> Configure chip... Itt megadod a konfigurációt amit szeretnél használni. Ez úgy-ahogy megvan, komolyabb probléma nincs benne. 4: Flowcode -> Build menü -> Projekt opciók... -> Órajel sebessg (Hz): mező. Beírod a 8 MHz-et: 8000000 5: raksz egy C blokkot a program elejére, ezzel a tartalommal: osccon=0b01110000; A részelteket az adatlapban találod az oszcillátor konfigurációnal. Ha nem egyértelmű, lehet kérdezni. 6 opcionális: a C kód után, hacsak valamiért nem kell sietni, érdemes egy kis késletetést rakni. Pl. stabilizálódik a tápfeszültség, észhez tér a panelen lévő többi eszköz, chip újraírásakor segíthet (speciális eset, ezt most ne eröltessük). Ennyi.
Két-három helyen is meg kell adni az órajel frekvenciáját/forrását.
Konfiguráció, Flowcode, osccone regiszter. Tölts fel egy hibás LED villogtatást, kijavítjuk neked. A 20 MHz biztosan nem jó, ilyen órajel frekvenciát nem nagyon tudnak a kis PIC mikrokontrollerek maguktól.
A program kezdődjön így:
Ez igen érdekes. Kezdődjön így a program (legyen ott az osctune beállítása is), hátha el van hangolva a belső órajel:
Akassz egy logikai analizátort a 1-Wire vonalra. Az alábbiakat kellene látnod:
1sec.jpg: Az egy másodperc szünet a "DS18B20_0_StartConversion" és a "DS18B20_0_ReadTemeprature" makrók közötti idő. Ennek kb. 1 s hosszúságúnak kell lennie. A szünet bal oldalát nézd meg tüzetesebben, ebben van a mérési parancs. Reset.jpg: A reset időtartam kb. 600 ms hosszúságú. Presence.jpg: 95 - 96 µs. Adatfolyam.jpg: A reset kezdete és az utolsó bit vége közötti időnek kb. 2.4 ms-nak kell lennie. Ha ezek az idők nagyon nem stimmelnek, akkor a kontroller nem 16 MHz-en jár. Próbáld meg úgy, hogy a program elején lévő
A hozzászólás módosítva: Szept 28, 2020
Pár hiba van még a gépezetben.
Ha nem használod az USB modult, kár ilyen kontrollert venni, eleve buksz három lábat. RA0 és RA1 csak bemenetként használható, hiába kötöttél oda LED-et. Ajánlom figyelmedbe a PIC18F14K22-es típust, az is 20 lábú. Extend Instruction Set legyen mindig kikapcsolva, ha tud ilyet a kontroller. Karakteres LCD hazsnálatánál biztosan okoz gondot, a többit nem teszteltem. A hiba megerősítve a MAtrix fejlesztői által is. Hogy ez a Flowcode és/vagy a BoostC hibája, kb. mindegy is. A program, hacsak nem valami extáról van szó, mindig kezdődjön egy kis késletetéssel. A feltétel bekarikázott része soha nem fut le, mert ha t kisebb, mint 24, akkor nem lehet nagyobb, mint 80, a t=0 rész soha nem hajtódik végre. A helyes órajelbeállításhoz kell egy kis C kód az elejére:
A programban az UART sebessége 38400-ra van állítva, ezt tekerd át 9600-ra, ha annyi kell, vagy a HMI-n állítsd át a kommunikációs sebességet 38 400-ra mindjárt az első oldalon.
Nincs beállítva az órajel. Sem az osccon regiszterrel, sem a beállításokban nincs megadva. Ezt az órajel frekvenciát belső oszcillátorral nem tudja.
Build menü -> Projekt opciók. Mekkora legyen az órajel frekvenciája?
XC8 fordítóban máshogyan kell megadni:
Ha nem írod át az osccon regisztert, akkor belső órajelválasztás esetén (amit a konfigurációban állítasz be) a "gyári beállítás" lesz érvényben, ami nevezett PIC esetében 1 MHz.
Parancsolj, mellékletek.
Kell az a beállítás és a C blokk is. Utóbbi csak akkor, ha van értelme, pl. van a kontrollerben osccon regiszter.
Flowcode 7 lesz az.
A hozzászólás módosítva: Feb 6, 2018
Nehéz így, mert alapvető dolgok hiányoznak.
0x50 érték hexadecimális (0x jelöli) számrendszerben van, 0b10100000 bedig binárisban (0b jelöli). Utóbbit azért szeretjük ebben a helyzetben, mert így könnyen látható, hogy melyik bit mire van állítva. A PIC18F14K22 kontroller adatlapján az osccon regiszterben nyolc bit van, öt csoportban. bit 7 bit 6,5,4 bit 3 bit 2 bit 1,0 Az osccon beállításánál a hetes bittel kell kezdeni a nullásig bezáróan. osccon=0b76543210 Ha te 8 MHz-en akarod járatni a kontrollert, akkor szépen sorban kinézed az adatlapból a számodra szükséges biteket: bit 7: 0 (perpillanat nincs jelentősége) bit 6,5,4: 1,1,0 bit 3: 0 (perpillanat nincs jelentősége) bit 2: 0 (perpillanat nincs jelentősége) bit 1,0: 0,0 Mindezek után már csak egymás mellé kell rakni a biteket: 01100000 Flowcode-ban pedig így beírod egy C blokkba, rögtön a program elejére:
A most nullán álló biteknek van jelentősége itt-ott (adatlap leírja), de egyelőre hagyjuk, kezdetnek így is megfelel. A hozzászólás módosítva: Nov 30, 2017
Lehet, hogy hibás a kikapcsolása, lehet, hogy nem. Készítsd el vele a hex fált, majd ellenőrizd le a konfigurációs biteket. Ha azok jók, akkor lehet, hogy a kontrollerben van a hiba, erről az errata tud bővebbet mondani, már ha dokumentálva van.
Az osccon regiszter minden programkörnyezetben az, annak beállítása nélkül a kontroller az alapértelezett sebességen fut, lásd adatlap.
Az adatlapból nézd meg, hogy a belső oszcillátor milyen frekvenciákon tud ketyegni. Ezután válassz egyet, állítsd be az osccon regiszterrel (Bővebben: Link) maj ezt az értéket add meg a Chip beállításaiban.
Töltsd fel a programot, úgy egyszerűbb ellenőrizni. Ami biztosan hibás, az az órajel beállítása, a kontroller nem tud 10 MHz-et előállítni a belső oszcillátorból.
Ha az osccon regisztert nem állítottad be, akkor a kontroller 500 kHz-es órajelről megy.
Parancsolj, melléklet.
A hozzászólás módosítva: Ápr 29, 2017
Flowcode-ban a Chip beállításaiban utod megadni, hogy honnan vegye az órajelet a kontroller. Belső oszcillátorhoz az Internal RC kell. Ebből is van két opció. Az egyiknél az órajel frekvenciájának negyede megjelenik az egyik lábon (OSC out), a másik beállításnál a jelzett láb szabadon hazsnálható.
Ha belső órajelet használsz (ami nem belső kvarc), akkor az osccon regiszterrel tudod beállítani, hogy mekkora sebességgel menjen a kontroller. Ha kell a PLL is (ami az osccon-ban beállított frekvenciát megnégyszerezi), akkor a chip beállításaiban bekapcsolod, az osctune regiszterben is és ügyelsz arra, hogy az osccon regiszterben az órajel forrása (ha jól emlékszem a két alsó bit) megfelelően legyen kiválasztva.
Nem tudom most megnézni a programot, de valószínűleg nincs beállítva jól a belső oszcillátor. Az osccon regisztert mire állítottad?
A hozzászólás módosítva: Szept 6, 2016
Megvan a fő hiba: A kontroller órajele nincs jól beállítva. Piszkálás nélkül 500 kHz-en fut. Kell egy osccon C blokk a program legelején:
Még egy kis segítség a mellékletben ahhoz, hogy érthető legyen, hogyan lehet beállítani az órajelet az osccon segítségével. A 0b az elején csupán azt jelenti, hogy az adat binárisan van megadva, tehát bitenként el kell zongorázni az értékeket (majd egy pontosvessző a végére). A kép a kontroller adatlapjáról van.
A konfiguráció eleve hibás, így biztosan nem lesz jó semmilyen időzítés. Belső órajelet használsz, de a Flowcode-ban nem írtad át a frekvenciát. Most 3 276 800 Hz-hez vannak számítva az adatok, de a belső oszcillátor ilyen sebességgel nem tud futni.
Build menü -> Projekt opciók... -> Órajel sebesség (Hz) Itt kell beírni a valós órajel frekvenciát, amit az osccon regiszterrel lehet beállítani.
Az osccon regiszterben be lehet állítani, hogyan aludjon a kontroller. Továbbá, ha jól tudom, az sem mindegy, hogy a kimenetek milyen állapotban vannak a SLEEP utasítás kiadásakor. Extra: adatlap 3.1 -es pontja: "Selecting Power-Managed Modes".
Konfiguráció hogyan van megadva? Belső órajel? Vcap engedélyezve? Ha igen, rajta is van a kondi (100 nF)? osccon regiszter beállítva?
Milyen C-ben keresed? Nem értem a kérdést. Flowcode-ban beszúrsz egy C blokkot, mindjárt a program elején, az osccon=... tartalommal.
C blokk, pl.:
Így láthatod, hogy melyik bit mire van állítva.
Általában a kontroller adatlapján megtalálható, hogy melyik állapotot vegye fel a sleep utasításra, ha jól emlékszem az osccon regisztert kell konfigurálni. Talán azzal többet tudsz elérni. Perpillanat nem tudom ellenőrizni, de tégy egy próbát, hátha.
Chip konfigurációban:
Watch Dog engedélyezve van, a programban viszont nem törlöd sehol. C kód: Az adatlap szerint az osccon regiszter utolsó előtti bitjének 1-nek kell lennie a belső órajelhez. Szerintem így kellene kinéznie: osccon=0b01110111; osccon2 és osctune elvileg nem kell, a PLL-t a Chip konfigban is meg lehet adni. |
Bejelentkezés
Hirdetés |