Fórum témák
» Több friss téma |
Üdv,
Egy PIC16F1789 kontrollerrel analóg részével van egy kis gondom. ADC-t és DAC-t is szeretném használni, egyelőre sikertelenül: Hiába állítom be pozitív referenciának az FVR-t, továbbra is a VCC-t veszi maximumnak. A kimenet formátumát szintén hiába állítgatom (ADRMD_bit), semmi nem változik. Ahogy nézem az adatlapot, egy picit bonyolítva van az AD konverter ebben a PIC-ben, de nem jövök rá, hogy mit csinálok rosszul. A DAC is problémásan működik: A maximális értéken (0x1F) 3150mV-ot ad a kimenetén. Itt is hiába állítom VCC-re, vagy FVR-re a pozitív referenciát, semmit nem változtat. Az errataban találtam egy bejegyzést az FVR-re vonatkozólag, miszerint 4x-es erősítésre konfigurálva (4096mV) +/-8%-ot tévedhet, de az én esetemben úgy gondolom erre nem fogható. A kontroller minden táplábon megkapja a stabil 5V-ot kerámia kondikkal szűrve. MikroC-ben írt forrásom:
Igen, lehet "ágyúval verébre" a dolog de így viszont szinte határtalan a lehetőségek tárháza.
![]() ![]() A hozzászólás módosítva: Dec 16, 2016
A DAC hibája megoldódott...10k ellenállással volt terhelve, ez sok volt neki áramban.
Az adatlapban nem találok utalást a terhelhetőségre. Az ADC hibája továbbra is fennáll. ![]()
Nem tudom, mit rontok el, de már megőrjít a dolog. Gondoltam írok néhány sort, hátha valaki csípőből megoldja a problémámat. Jelenleg egy 18F4550-es kontrollerrel küzdők. A fejlesztő környezetem MikroC for PIC (különböző verzióit próbáltam), az égetést az MPLab végzi a generált Hex filéből. Az égető egy PICKIT 3 klón. A történet annyi, hogy írom a forráskódot ezerrel , folyamatosan fordítom, égetem, minden OK. Majd amikor elér egy szintet a program mérete a fordítás hibás lesz. Ekkor az adott PIC-nél a használt memóriák ROM 12%, RAM 6%. Ha valamely részt kiveszem a kódból, akkor egy ideig tudok mást írni helyette, de egy idő után ismét rossz a fordítás. Pontosan a "hibátlannak tűnő" fordított hex file beégetése után a PIC nem indul el (mintha üres lenne). A mikroC környezetem nem Demo, ennél nagyobb forráskódot is képes volt hiba nélkül fordítani. Van valakinek bármilyen ötlete, mi okozhatja ezt?
Minden segítséget megköszönök.
Az órajel beállítását nem látom (ADCS).
Szia!
A hiba oka az ingyenes MikroC. Mivel nem fizettél érte, nincs licens file-od. És ezért 2K a fordítási határod! A hozzászólás módosítva: Dec 16, 2016
Idézet: „A mikroC környezetem nem Demo, ennél nagyobb forráskódot is képes volt hiba nélkül fordítani.” Itt említi, hogy nem demót használ.
Akkor ezt benéztem...
Pedig a 18F4550 -nek 32768 byte a program memóriája, ami 16384 szó. A demo limit 2k szó. 16384 * 0.12 = 1966,08 szó. Hmmmm... Mégiscsak demo módban megy.
A hozzászólás módosítva: Dec 16, 2016
Miért van az,hogy ha azt írom,hogy if (templ&8) RC0=1; akkor megcsinálja a feladatot,de ha if ((templ&8)==1) RC0=1; akkor már nem?
Idézet: „ha if ((templ&8)==1) RC0=1;” Az a helyzet, hogyt templ&8 soha nem lesz 1. Az csak 0b1000 lehet, vagy 0b0000. Tehát ezek a működő megoldások:
A második már egy kicsit túl van komplikálva...
Sziasztok!
Van egy egyszerű kis hello world programom, de egyszerűen nem akar működni. Valaki tudna segíteni? Mi baj lehet a configgal?
Milyen típus? Az analóg funkcióval rendelkező lábak (különosan az RB0) digitálisra vannak állítva.
Idézet: „float Homerseklet = (float)(kod)/16.0; float - lebegőpontos típus, hogy a tört fokok is eltárolódjanak. kod a read paranccsal kiolvasott hőmérséklet kód. Ha assembly -ben programozol: a (kod) értékét eltárolod két byte -ban, eltárolod az előjelet kiíráshoz. Ha negatív, minden bitet negálsz és hozzáadsz 1 -et (16 bitesen). Az alsó 4 bitet átteszed egy harmadikba, a (kod) értékét 4-szer jobbra lépteted (balról mindig 0 értéket lépteted be). Az eredmény az egész fok az első két byte -ban, a harmadik alsó négy bitjén a tört fok. Előjelet pedig eltároltad már.” Ha ezt a képletet használom akkor megkapom a hömérsékletet celsiusba?? de a minuaszt vagy a + hogy??
Nekem fogalmam nincs mert csak bemásoltam azt amit ő írt, így nem tudhatom ,hogy ő mit használ.
Idézet: „float Homerseklet = (float)(kod)/16.0;”
Mivel a kod változó előjeles, a float változó is előjeles értéket kap. Idézet: „Ha assembly -ben programozol:” A laírtakban szerepel, hogy eltároljuk az előjelet.
Említette korábban Hp41C is, hogy hiányozik néhány fontosabb regiszter beállítása.
Nem vagyok XC-s, de talán ebből ki tudsz idúlni..
mikroC be
![]() Nem szeretnék tizedeseket akkor igy nézne ki a kód:
Valahogy igy képzeltem el ![]() Jól gondolkodom???
Nem követtem végig a 1Wire témát, nem tudom, hogy így kell-e olvasni, de ha signed int-et kapsz vissza akkor nem egyszerűbb megkérdezni, hogy kisebb-e mint 0?
Valószínűleg a mikroC int alatt 16 bit signed-et ért, de adódhatnak fordítók amik 32 bitet értenek alatta és akkor mindig szerkesztgetni kell, ha a 0-nál kisebb nagyobb dolgot csinálod akkor nem lesz ilyen probléma.
A hozzászólás módosítva: Dec 18, 2016
Akkor kérdéseim
![]() Ow_Read(&PORTE, 2); milyen számot kapok decimalisan Ha + érték ha - érték?? A hozzászólás módosítva: Dec 18, 2016
Meg kell nézni az eljárás deklarációját a OneWire Library oldalán:
Idézet: „unsigned short Ow_Read(unsigned short *port, unsigned short pin);” Azaz 16 bites előjel nélküli egész. A DS18B20+ adatlapjából: +125 --- 0000 0111 1101 0000 --- 07D0h -55 ---- 1111 1100 1001 0000 --- FC90h Csak egy konverziót kell felhasználni: int kod = (int) Ow_Read(&PORTE, 2); A kod máris előjeles szám lesz. kod /= 16; pedig az egész fokokat adja előjelesen: -55 --- 0xC9 -2 --- 0xFE -1 --- 0xFF 0 --- 0x00 1 --- 0x01 125 - 0x7D A hozzászólás módosítva: Dec 18, 2016
Vagy is akkor bekérem az adatott osztom 16 al és ott a hömérséklet eredménye mint anno írt képleted??? Ennyi?? amit írtam kód az jó lenne?
Sorrol sorra mit csinál???
Wait beépített függvény ? A hozzászólás módosítva: Dec 18, 2016
Most tényleg le kell írnom még egyszer, amikor ott a megjegyzés minden sorban?
1. 1-Wire reset pulzus kiadása. 2. ROM azonosítás kihagyása - csak egy DS van a buszon. 3. A hőmérséklet konvertálásának indítása. Ha parazita táplálással megy, ezek után a vonalra "erős" tápot kell kiadni. 4. Meg kell várni a konverzió végét: kb 750ms. Ebben a formában nem beépített függvény. Nem használom a micro C -t.... Neked kellene utánajárni, milyen eljárás ven rá... 5. 1-Wire reset pulzus kiadása. 6. ROM azonosítás kihagyása - csak egy DS van a buszon. 7. Kiolvasás indítása. 9 byte -ot (vagy kevesebbet lehet olvasni). 8. Alsó byte beolvasása a kod 7..0 bitjeire. 9. Felső byte beolvasása a kod 15..8 bitjeire. 10. egész fokra konvertálás - előjelesen. Jobban megnézve a kiolvasás előtt Újra reset / Skip_rom kellhet.
A hozzászólás módosítva: Dec 18, 2016
Ne haragudj, de nem értelek. Ott a működő kód a súgóban. Még te linkelted be korábban.
Egyébként MikroC ben nincs wait(). MiroC ben Delay(). van. De nem illik mindenhova beszúrni, mert megtelik a pic. De ezt is el kell olvasnod miért.
Tudom elkultem a kodt de nem birtam kibogaraszni a kodrengetekbol. Mi a delayel? Ossz vissz 3 db van a picbe.
A hozzászólás módosítva: Dec 19, 2016
A pontos formátuma pl: " Delay_ms(750) " ez 750 milisecundum késleltetést eredményez.
És azért nem szabad túl sokat használni belőle , mert mindenhol ahová beírod, egy méretes asm kódot berak a programodba. Ezért ha mondjok kell 100ms késletetés a programodban 88 helyen, akkor csinálsz egy függvényt amiben benne van a Delay utasításod. És ezt hívogatod meg minden szükséges alkalommal. |
Bejelentkezés
Hirdetés |