Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Köszönöm a választ! Örülök, hogy jó lett
Megtennéd, hogy felteszed a rajzod? Kíváncsi vagyok milyen alkatrészekkel oldottad meg a kényes feladatokat. Köszi!
Sziasztok!
Tudna nekem valaki segíteni... Egy dsPIC33FJ128GP804 -el próbálkozom DAC-ot összehozni. És nagyon nem megy...és nagyon nem látom hogy hol lehet a hiba. Ide bemásolom a kódot hátha észrevesz valaki valamit... Ja igen amit látok hogy a kimeneten kb stabilan 1.4 Volt van. Ha változtamo a DAC1RDAT értékeét olyan 0.8 -tól változik 1.4-ig de nem lineárisan. Kód: #include "p33fxxxx.h" #include "libpic30.h" _FOSCSEL(FNOSC_FRCPLL); // Internal FRC oscillator _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE); void __delay32(unsigned long cycles); void __delay_us(unsigned long); void InitClock() { PLLFBD = 38; // 80Mhz -40Mhz CLKDIVbits.PLLPOST = 0; // N1 = 2 CLKDIVbits.PLLPRE = 0; // N2 = 2 OSCTUN = 20; //for 8 Mhz RCONbits.SWDTEN = 0; RCONbits.SWDTEN=0; // Disable Watch Dog Timer } void InitDAC(){ ACLKCONbits.ASRCSEL= 1, // Primary OCS as input ACLKCONbits.SELACLK = 0; // Enable the reference clock ACLKCONbits.AOSCMD = 0; // Auxiliary Oscillator Disabled ACLKCONbits.ASRCSEL = 1; // Auxiliary Oscillator is the Clock Source ACLKCONbits.APSTSCLR = 2; // Aux. Clock devider DAC1CONbits.DACEN=1; // DAC module Enable DAC1CONbits.DACSIDL=0; // Stop in idle mode DAC1CONbits.AMPON=1; // Enable output amp during sleep DAC1CONbits.FORM=0; // Data Format Unsigned DAC1CONbits.DACFDIV=0; // Devide input clk DAC1STATbits.ROEN=1; // Right Channel Enable DAC1STATbits.LOEN=0; // Left Channel Enable DAC1STATbits.RMVOEN=1; // R. Midpoint on pin DAC1STATbits.LMVOEN=0; // L. Midpoint on pin DAC1DFLT=32000; } int main(void) { InitClock(); InitDAC(); TRISA=0b11111111111111111; TRISB=0b11100111001111111; TRISC=0b11111111111111110; while(1){ LATBbits.LATB8=1; __delay32(400); LATBbits.LATB8=0; __delay32(400); DAC1RDAT=0xFFFF; } } És előre is nagyon köszönöm!
Sziasztok!
Kérdésem a következő lenne, 16f-es piceknél mi a különbség az RB0/INT és az RB4-7 lábon történő változás megszakítások között, azon kívül, hogy az INT megszakításnál van élválasztás és schmitt triggeres? Konkrétan egy 16f627A-t kínzok, és míg az INT megszakítás tökéletesen működik, a másik hol működik hol nem, és egy 74ls14 schmitt triggeres inverter beépítése után is sokkal érzékenyebb a pergés jelenségre. Idézet: „16f-es piceknél mi a különbség az RB0/INT és az RB4-7 lábon történő változás megszakítások között ?(Konkrétan egy 16f627A-t kínzok)” RB0 külső interrupt bemenet, az INTEDG (OPTION.6) beállításától függően felfutó vagy lefutó élre reagál. RB4..7 pedig a logikai szint megváltozására okoz interruptot (tehát hol felfutó, hol lefutó élre!) okoz megszakítást. Pergésmentesítésnél tehát azt is ellenőrizni kellene, hogy interruptnál milyen szinten van éppen a láb... Olvasnivaló: adatlap 14.6.1 és 14.6.3
Jó lenne látni a kapcsolást, és azt, hogy hol és mit mérsz!
AVDD és AVSS gondolom VDD, ill. VSS-hez van kötve (és szűrve). Ha minden igaz, neked csatornánként három kimeneted van: egy pozitív és egy negatív (differenciális) kimenet, és egy "középleágazás". Az adatlap szerint amíg az adat 0000-tól FFFF-ig megy, a pozitív kimenet kb. 0,65 V-tól 2,65 V-ig változik, a negatív kimenet pedig ennek a tükörképe, azaz 2,65 V-tól 0,65 V-ig változik. A "középleágazás" pedig 1.64 V körül áll stabilan. Az általad mért értékek eltér ezektől, ezért lenne jó látni, hogy hol és mit mértél. Megj: azt nem tudom, hogy miért 16 bites az adatregiszter, de így írják!
Na, közben leesett a tantusz.... ez 16 bites DAC! :yes:
Igen, ezzel tisztában vagyok, de akkor ezek szerint más nincs.
A pergés mentesítést megpróbálom tökéletesíteni. Köszi a választ.
Alapvetően nem szokás pergésre hajlamos jelet megszakításos bemenetre vezetni. Illetve lehet, pl. azért, hogy felébressze a kontrollert a SLEEP-ből, de a bejövő jel állapotának feldolgozásához már nem a megszakítást használjuk fel.
Azért annyi különbség van, hogy a "mismatch" állapotot, azaz a változást egy érdekes mechanizmussal állapítja meg a PIC, ami feltételezi, hogy a változásos interruptot előidéző portot kiolvasod az interruptban. Az INT megszakításnál emlékeim szerint nincs szükség ilyen jellegű hókusz-pókuszra.
A DAC tesztelése talán egyszerűbb volna, ha az adatot a kísérletezéshez a DAC1DFLT regiszterbe írnád!
Az audio DAC, olyan mint a tamagochi, mindig "etetni" kell - interrupton vagy DMA-val - s ha nem kapja a beállított ütemben a jelet, akkor "visszaesik" a DAC1DFLT-ban tárolt értékre. A Microchip honlapján a lap alján a 33F Ref. Manual 33. fejezete szemléletes ábrákon és mintakóddal mutatja be az interruptos és DMA-s kezelést. Idézet: „Ha változtamo a DAC1RDAT értékét olyan 0.8 -tól változik 1.4-ig de nem lineárisan.” Tegnap az adatlapból idéztem, miszerint 0.65 és 2.65 között kellene mozogni, ellenőrizni azonban nem tudom, mert nincs ilyen vezérlőm. Azonban van itt egy friss topik, amelyikben azt fejtegetik, hogy a dsPIC33FJ128GP802 adatlapja hibás lehet, mert a középszinthez képest csak -0.65 to +0.65 V kilengést mérnek (0000 - FFFF között). Mivel a dsPIC33FJ128GP802 az általad használt dsPIC33FJ128GP804-nek a kistestvére, az is érintett lehet! Mellesleg a Ref. Manuálban ajánlott külső erősítő kapcsolása is hibás:
Ezek szerint inkább inkább állandóan figyeltessem a bemeneti lábakat megszakítás generálás nélkül. Végülis járhatónak tűnik.
Köszönöm a válaszokat neked és szilvának is.
Általában ugye a nyomógombok és a kapcsolók a pergésre hajlamosak. Ezek pedig eleve emberi beavatkozást feltételeznek, tehát egy kis késés (néhánytíz ms) a reakcióban nem probléma. Van egy készülő cikkem, ami még nem publikus, de már teljesen kész, csak még 1-2 fényképet akarok beletenni. Az ott szereplő firmware pontosan azt csinálja, hogy a megszakításra reagál, hogy felébredjen a kontroller, de a megszakítás szerepe itt be is fejeződik. Ha nem küldeném SLEEP-be a kontrollert, akkor nem is lenne szükség a megszakításra. Ha érdekel, itt a cikk: Link
Idézet: „Ha nem küldeném SLEEP-be a kontrollert, akkor nem is lenne szükség a megszakításra.” Ha a GIE nincs engedelyezve akkor megszakitasi rutin vegrehajtasa nelkul is meg lehet ugyanezt tenni, azaz nincs megszakitas de attol meg a PIC fel tud ebredni es tudja folytatni a munkat a sleep mogotti utasitassal.
Pontosan ezt csinálja a Firmware a kapcsolásban Így tényleg érthetőbb.
Szóval a megszakításjelző flag-et billenti be a változás, és ez ébreszti fel a kontrollert sleep-ből. Ehhez kellett engedélyezni az Interrupt-On-Change megszakítást, hogy felébreszthesse, viszont a globális megszakítás nincs engedélyezve, így a SLEEP utáni utasítással folytatja a munkát a kontroller.
Sziasztok.
Egy kérdésem lenne, mit kell akkor tennem, ha az mplab a következő hibaüzenettel jön nekem: Unknown processor '18F4550' A rendszert újra kellett raknom és azóta nem tudom használni az mplabot rajta. Előre is kösz.
Sziasztok !
Kicsit OFF Mit jelent az "SMD" és az "SMT" ? Köszönöm ON
Bővebben: Link
Felület szerelt alkatrész, és technológia.
SMD - Surface Mount Device, mig az SMT - Surface Mount Technology. Tehat ez utobbi az egesz technologiat jelenti mig az elozo magat a komponenst/alkatreszt.
Idézet: „mit kell akkor tennem, ha az mplab a következő hibaüzenettel jön nekem: Unknown processor '18F4550'?” 1. PONTOSAN megírni,hogy mindez hol, milyen körülmények között és milyen előzmények után következett be. (pl. assemler vagy C fordító futtatésakor, eszköz kiválasztásakor, stb.). 2. Gondosan utánanézni, hogy mi van a telepítési könyvtárban.
Á ez nem igaz. Nem néztem melyik verziót teszem fel, és egy régebbit raktam fel, amiben tényleg nincs benne. Felraktam a legújabbat, és mostmár jó.
Egy manőverrel törölhetnéd is a régebbieket. Én még a legújabb telepítőjét is le szoktam törölni telepítés után. Ha kell, majd letöltöm ismét.
En azert nem szoktam letorolni a telepitoket mert mar nem egyszer kiadtak rossz valtozatot es csak az interim release mukodott - amibol me az archivumban sem oriznek meg peldanyt
Sziasztok!
A PIC16F877A időzítő moduljával ismerkedem. Átolvastam az adatlapot, de néhány dolog még nem tiszta. Amit meg szeretnék valósítani: az egyik bemeneten megjelenő impulzus hosszát (amíg a bemebet magas) megmérni, majd egy későbbi időpontban ugyan ilyen hosszú impulzust kiadni az egyik kimeneten. A TIMER1 modul tűnik szimpatikusnak, mert 2 byte-os a számlálója. Amit nem értek: 1. Hogy tudom az egyszer megmért és eltárolt impulzushosszat "visszajátszani"? Hogy lehet megmondani a timer-nek, hogy csak eddig számlálj, és ne tovább? (Az is jó lenne, ha visszafelé tudna számlálni, és nullánál figyelhetném a túlcsordulást, de ilyen lehetőséget nem találtam.) 2. Pontosan mit csinál a prescaler? Jól értem, hogy ha a prescaler 1:1, akkor FOSC/4 időközönként lép a timer számlálója, ha pedig mondjuk 1:4, akkor FOSC/4/4 időközönként? Köszi előre is a segítséget! Péter
2. igen jól érted.
1. Az impulzus hossz mérésére a CCP1 modult lehet használni megfelelő számlálási sebességgel. A mért értéket 65536-ból és beleteszed a Timer1 számlálójába amit ugyanolyan sebességgel számláltatsz, miközben az impulzus elejét elindítod. Mikor túlcsordul a timer, megszakítást is okozhat, amikor van lehetőséged az impulzust befejezni. Persze korrigálni kell az eltárolt értéket a lekezeléshez szükséges idővel(kivonással).
Sziasztok !
Modellvasútról beszélünk és ez egy "foglaltságjelző" Feladata ,hogy egy ellenőriz kívánt szakasz foglaltságát megjelenítse a szemaforon. Amit megvalósítottam : Szakasz elején és végén a talpfák alatt felfelé egy-egy reflexiós - ha jól írom - optokapu. Működése: a felette elhaladó kocsikat - azoknak mindenféle kis apró barázdáit,lelógó ütközőit ,stb - "megszámolja" és egy regiszterbe beírja. A másik végén -tehát "kihaladó szerelvény" - újra megszámolja ,beírja ,egy másik regiszterbe ,majd a két regisztert összehasonlítja.Ha egyezik ,akkor zöld a lámpa - elhaladt az összes "bejött" kocsi ,ha nem egyezik,akkor leakadt egy kocsi ,kvázi piros a lámpa. Ez idáig tökéletes megy is ,mindkét irányból ! De....... Mi van akkor ,ha nem megy ki a másik végén ,hanem egyszerűen visszatolat ?Akkor természetesen nem egyezhet a két regiszter.Gondoltam én balga ,teszek még két optot a meglévőkhöz elég közel - mintegy "párnak" - és az majd figyeli az ide oda tolatgatást......Igen ám de itt el is akadtam. Tehát nem egy konkrét pontot kell vizsgálnom ,hanem egy barázdás valamit Köszi aki válaszol !
Két ilyen résoptika kéne egymás mellé, és akkor az irányt meg tudod határozni... Innentől, ha visszafele megindul a szerelvény, akkor csökkented a regiszter értékét, mintha a másik oldalon menne kifelé a vonat...
Lehet szerencsésebb lenne egy egér érzékelőjét felhasználni, az pont ilyen célra készült ( iránymeghatározással számlál barázdákat) Ki kell kísérletezni melyik megoldás jobb. szerk: ha két résoptikát raksz egymásmellé, mindenképp kell lenni olyan állapotnak, amikor mindkét érzékelő takarásban van, mert enélkül nem lehet irányt meghatározni.
Köszi !
Az ötlet bennem is eljutott idáig ,csak nem ilyen egyszerű sajnos ! Mert ha egy vagon nem megy át teljes egészében az egyik érzékelőpároson,az egyik többet számlál ,mint a másik Megpróbálom szemléltetni.... O O optok IIIIIIIIIIIIIII vagon alján mindenféle barázda --------> bejövő irány <-------- kimenő irány |
Bejelentkezés
Hirdetés |