Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: Nagy tévedés! Az adatlap szerint 24 MHz a legmagasabb frekvencia, amit HS vagy HSPLL üzemmódban ajánl. Ennél magasabb bemenő frekvenciáknál kizárólag EC vagy ECPLL módot ajánl az adatlap 2-3. táblázata. „maximum annyit tehetsz rá amennyit az adatlapján ír, PIC18F2455 esetén ez 48MHz”
Tudom, de én egy szót se ejtettem a HS, HSPLL vagy EC, ECPLL -ről, csupán annyit mondtam, hogy az adatlap szerint max 48MHz-es órajellel működik és hogy ahhoz milyen kondi kellene
Szép ferdítés, de amit írtál nem erre utal.
Sziasztok!
Pic16f877a-n szeretném használni spi és i2c modult felváltva. Annyi lenne a feladat, hogy először i2c-n olvasok egy ic-t, majd átváltok spi-re. Ha szükséges akkor újra vissza i2c-re, írás, és megint vissza spi-re. Megoldható ez? Ha igen, mire kell figyelni átálláskor?
Idézet: A (külső) órajelhez nem kell kondi, csak a kristály rezonátorhoz. Abból pedig 24 MHz a legnagyobb frekvenciájú, amit az adatlap ajánl. „az adatlap szerint max 48MHz-es órajellel működik és hogy ahhoz milyen kondi kellene ”
Én inkább egy szoftveres megoldást használnék a lassabb perifériára,
Ezt szerettem volna elkerülni, mert nem sikerült még működő i2c kezelő rutint írnom.
Kell viszont a gyors spi, így akkor megint nekiülök. Köszönöm a gyors választ.
A megoldás: tanulni,tanulni, tanulni. Anélkül még segíteni sem tudunk...
Sziasztok,
megint lenne egy kérdésem felétek. Ezzel mi a probléma ? : void DOGM_write_string(char *buffer) { while(*buffer) // Write data to LCD up to null { Delay10TCYx(4); // Wait while LCD is busy DOGM_write(*buffer); // Write character to LCD buffer++; // Increment buffer } return; } void DOGM_write(char data) { RS_bit=1; switch(data) { case '\f': DOGM_clr(); // Kijelző törlés break; case '\n': DOGM_position(0,1); // Új sor break; default: byteout(data); // Karakterkiírás break; } cursor++; if(cursor>0x0F) { if(cursor<0x3F){DOGM_position(0,1);cursor=0x40;} //2.sor eleje else if(cursor>0x4F) { DOGM_position(0,0);cursor=0; //1.sor eleje } } RS_bit=0; } Ezt egy EADOGM162 -es COG kijelzőhöz írtam, és a szöveg kiíró része nem megy jól. Ha simán ezt a tesztet futtatom : while(1) { DOGM_write(i); delay_sec(1); i++; } akkor szépen írkálja a karaktereket sorban , még az újsor és törlés karaktert is felismeri, de ha simán beirom hogy DOGM_write_string("Szevasz tavasz"); erre mindig mást ír ki , kb 2-3-4 karaktert de nem is betűket hanem valami furcsaságot. Tudtok valami támaszt adni ?
Az alábbi sorban használt késleltetés túl rövid lehet!
Oh , átírtam úgy hogy a szöveget beraktam egy karaktertömbbe, és így már kiírja:
.... char szoveg[]="Szevasz tavasz" ; .... DOGM_write_string(szoveg); .... A kérdésre viszont szívesen várnám a választ hogy miért nem ment?Sima LCD lib-nél az ilyen kiíratás ment.
Érdemes megnézni a C-fordítókban, mert van készen!
Szövegkonstans kiíratásához a mutatót char *buffer helyett
const rom unsigned char *buffer-nek kellett volna deklarálni (ebből az unsigned nem kötelező...). A char szoveg[]="Szevasz tavasz" ; sorral áttetted a szöveget a RAM-ba, így a char* típusú mutató eléri.
Vki a 18F sorozatban lévő UserId-t olvasta már ki programból (ill. programozta már)?
Nekem az alábbi nem működik:
A DEVICE_DATA a 0x200000 címre mutat és a TBLPTR-be jó cím is van.
A programot asm-ben írom, más programnyelvet nem nagyon ismerek.
Ebben az adatlapban láttam ilyen megoldást. Külön, külön működik mind az spi és az i2c modul, de együtt az i2c olvasás/írás után az spi már nem működik nálam. Most félreraktam a dolgot, és nekiültem a szoftveres i2c-nek (az spi mennyivel egyszerűbb ). Leginkább az a gond, hogy már régóta húzódik ez a munka, és szerettem volna minnél hamarabb befejezni. Ha közben valakinek van tippje/tapasztalata két hardveres modul felváltva használatára azt szívesen venném. watt: Még egyszer köszönöm a segítséget!
Így a W-ben az utolsó ID marad csak. Egyébként jól csinálod, működnie kéne, az adatlap szerint.
Es a W-t hova toltod be? Mas cimekrol tudsz olvasni? (Pl normal program terulet, Device ID ill Config bitek)
C18-ban próbálkoztam egyszer ilyesmivel. Nekem működött. A beírást PICkit2-vel csináltam, a linkelt program csupán kiolvassa a korábban beírt adatot.
A belinkelt programodban nem látom, hogy a beolvasott adatot elraknád vagy felhasználnád.
Tudom, hogy nem rakja el sehova, és elvileg a lefuttatása után csak az utolsó marad meg a w-ben.
Csak a lényeget akartam bemásolni. Pickit3-al debugolva egy 18F24k22-t mindig 0-t kapok vissza, pedig elvileg be van írva a userid-ba az adat. Más helyről tudok olvasni, pl. a program területről tblrd-vel. Ill. ha el is tárolom az adatokat, ott mindig 0 jelenik meg. Ide a készülék sorozatszámát akartam tenni, mert nagyobb darabszámba fogok készüléket gyártani és a program kódot levédem, és ez egy egyszerű módja lett volna a készülék sorszámának tárolására.
Szia!
Ha a programtárat "levéded", akkor a programbóli olvasását engedélyezned kell. Ld. cogfig regiszterek EBTRx bitek... Az EECON1 regiszer EEPGD bitjét 0-ra állítod?
Egyelőre semmi sincs levédve, szabadon olvasható, írható minden. De így sem megy.
Az a baj, hogy a neten sem találok olyan asm kódot, ahol leírnák, hogy ez így működik. Mindenhol csak az van, hogy így működnie kell, meg a doksiban ez, meg az van... Úgy tűnik, mintha senki sem használná ezt a funkciót.
Én is csak a PIC írása/olvasása közben használom a WPB-ben, de az elvileg ugyanazokat a program utasításokat hajtja végre a PIC-ben, mint amit te is használsz. Ha lesz időm megnézem, nekem megy-e!
A PICKit2 a saját programjával megmutatja a UserID-t. Ott ellenőrizheted.
Én a HID bootloaderrel úgy jártam, hogy beírtam a UserID-t, a PICkit2 mutatta. Azután az első bootloader használat után ki is törölte... Módosítani kelett, hogy ugyan ne törölje már ki, ha semmi köze hozzá.
Üdv!
A kérdésem a következő: Egy 16f871es PICnél mitől lehet az, hogy ha az ADCvel ha csak egy csatornát kezelek akkor tökéletesen működik, de ha többet (2) akkor egy bizonyos szintnél nem megy lejjebb a mért érték?
Próbáltál már csatornaváltás után hosszabb ideig várni? Mekkora a bemenő jelek forrásának az impedanciája (ellenállása)?
A mérés csak akkor lesz jó, ha a csatornaváltás és a konverzió indítása között eltelt adatgyűjtési időben az ADC mintavevő-tartó egységének kondenzátora beáll a mérendő feszültségre.
A feszültségforrás egy 47Ks poti.
Akkor is ezt csinálja ha minkét ch 0V on van.
Idézet: Ez így nem felel meg az adatlapban leírt követelményeknek. Legalább egy kondenzátort tegyél utána (az ADC bemenetekre).„A feszültségforrás egy 47Ks poti.” Idézet: Zajt szed fel a bemenet, vagy a beállítás rossz. „Akkor is ezt csinálja ha minkét ch 0V on van.” Az adatlap előírja, hogy az adatgyűjtési idő (Tacq) és a konverziós időegység (Tad) milyen határok között lehet. Ezeket betartod?
Idézet: „A feszültségforrás egy 47Ks poti.” Hogy lehet a feszultseg bemenet egy poti? Ebbol honnan tudjuk azt hogyan kototted be? Azert talaltak ki a kapcsolasi rajzot, hogy hasznaljuk es abbol megertsuk mit csinaltal, mit hova kotottel be... Es azert talaltak ki a forras programot is, hogy abbol lassuk mit csinaltal. Anelkul vagdalozunk itt a levegoben es probaljuk kitalalni hogy csinalhattad meg es abbol rajonni mi lehet a hiba -- magyaran a lustasagod miatt, hogy nem csatoltal semmit nekunk kell extra munkat csinalni, ami azt hiszem nem fair.
Elnézést.
Ugyan ezzel a hardware-rel jól működik ha olyan program fut rajta ami csak az AN0át figyeli. Szóval nem hiszem, hogy zaj. Az időzítés meg szerintem azért jó mert ha mindkettő bemenet le van húzva a földre akkor is ezt csinálja. Vagyis nincs töltés amit ki kéne "süttetni" két mérés között. |
Bejelentkezés
Hirdetés |