Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   1 / 2
(#) Bakman válasza djadji hozzászólására (») Jan 30, 2023
A Projekt opciókban megadott érték igazábol egy egysoros C kódot generál, ami valami ilyesmi:
  1. #define _XTAL_FREQ (32000000)
Vannak olyan függvények, amelyek használják ezt az értéket, pl. a Delay ilyen. Ha itt hibás érték van megadva, akkor ezen függvények hibás időzítésekkel fognak futni. Ha a programban nem használsz olyan függvényt, amelyiknek szüksége lenne erre az értékre, a fordító nem fogja figyelembe venni, lehet ott bármi. Ugyanakkor ennek helyes kitöltése mindenképpen ajánlott, mert nem tudni, a háttérben milyen függvények/makrók támaszkodnak erre.

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.png
    
(#) Bakman válasza Horváth P Tamás hozzászólására (») Jún 18, 2021
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ő?
(#) Bakman válasza djadji hozzászólására (») Márc 23, 2021
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.
(#) Bakman válasza djadji hozzászólására (») Márc 23, 2021
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.
(#) Bakman válasza Kovabe hozzászólására (») Okt 1, 2020
A program kezdődjön így:
  1. delay_ms(100);
  2. osccon=0b01110000;
  3. anselh=0;
  4. ansel=0;
Biztos ami biztos alapon. Az RB5 (RX) lábon van 10 kΩ felhúzóellenállás? Ha nincs, rakj oda egyet.
(#) Bakman válasza Kovabe hozzászólására (») Szept 28, 2020
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:
  1. osccon=0b01110011;
  2. osctune=0;
(#) Bakman válasza Kovabe hozzászólására (») Szept 28, 2020
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ő
  1. osccon=0b01110000;
sort átírod erre:
  1. osccon=0b01110011;
Az USB modul miatt van a rendszerben egy "CPU divider" nevű osztó, nem tudom, beleszól-e az órajelbe ilyen esetben.
A hozzászólás módosítva: Szept 28, 2020
(#) Bakman válasza Kovabe hozzászólására (») Szept 27, 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:
  1. osccon=0b01110000;
Az itt beállított értéket kell a programnak is megadni. Javaslom a 16 MHz-et, 8 MHz a nagyon minimum 1-Wire használata esetén Flowcode-ban. Az órajel átállításával a Timer0 periódusideje is megváltozik, ezt állítsd be úgy, ahogy neked jó.

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.
  1. baud=38400
(#) Bakman válasza Kovabe hozzászólására (») Szept 27, 2020
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?
(#) Bakman válasza Koncsar hozzászólására (») Nov 15, 2019
XC8 fordítóban máshogyan kell megadni:
  1. osccon=0b01100000;
Csupa nagybetűt kell használni.
(#) Bakman válasza Koncsar hozzászólására (») Nov 15, 2019
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.
(#) Bakman válasza Koncsar hozzászólására (») Nov 15, 2019
Parancsolj, mellékletek.
  1. osccon=0b01100000;
(#) Bakman válasza niedziela hozzászólására (») Márc 27, 2019
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.
(#) Bakman válasza frekivalto hozzászólására (») Feb 6, 2018
Flowcode 7 lesz az.
  1. osccon=0b11110110;
helyett
  1. osccon=0b11110110;
A hetes verzióban már a Michrochip féle fordító van, pár dolog másként működik a C kódoknál. Leginkább kis- és nagybetűk változtak. Itt van pár példa: Bővebben: Link.
A hozzászólás módosítva: Feb 6, 2018
(#) Bakman válasza bubuszoft hozzászólására (») Nov 30, 2017
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:
  1. osccon=0b01100000;
Ennyi, nem több.

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
(#) Bakman válasza Broy hozzászólására (») Szept 2, 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.
(#) Bakman válasza Broy hozzászólására (») Aug 23, 2017
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.
(#) Bakman válasza Broy hozzászólására (») Aug 23, 2017
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.
(#) Bakman válasza kaqkk hozzászólására (») Ápr 29, 2017
Parancsolj, melléklet.
  1. osccon=0b01110000;
  2. osctune=0b01000000;
A hozzászólás módosítva: Ápr 29, 2017

64 MHz.jpg
    
(#) Bakman válasza bubuszoft hozzászólására (») Szept 6, 2016
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.
(#) Bakman válasza bubuszoft hozzászólására (») Szept 6, 2016
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
(#) Bakman válasza Kovabe hozzászólására (») Júl 14, 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:
  1. osccon=0b01110000;
(#) Bakman válasza HuG hozzászólására (») Dec 5, 2015
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.

osccon.jpg
    
(#) Bakman válasza HuG hozzászólására (») Dec 5, 2015
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.
(#) Bakman válasza Ferkógyerek hozzászólására (») Aug 5, 2015
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".
(#) Bakman válasza Kovabe hozzászólására (») Dec 23, 2014
Konfiguráció hogyan van megadva? Belső órajel? Vcap engedélyezve? Ha igen, rajta is van a kondi (100 nF)? osccon regiszter beállítva?
(#) Bakman válasza Baxi hozzászólására (») Nov 12, 2014
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.
(#) Bakman válasza Baxi hozzászólására (») Nov 12, 2014
C blokk, pl.:

  1. osccon=0b11100010;


Így láthatod, hogy melyik bit mire van állítva.
(#) Bakman válasza Baxi hozzászólására (») Nov 12, 2014
Á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.
(#) Bakman válasza kiskata hozzászólására (») Okt 23, 2014
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.
Következő: »»   1 / 2
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem