Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Nem ismertem. Köszi, hogy segítettél.
Sziasztok!
Köszönöm mindannyitoknak a gyors és hasznos válaszokat, és El_Pinyonak a programot. Mivel nekem a kitöltési tényező folyamatos változtatása kelleni fog némi szabályozással egyetemben, ezért sajnos le kell mondanom erről a szoftveres megoldásról. Úgy néz ki mégis le tudom cserélni 12F683-asokra a chipeket, azzal már sokkal több számítási idő megmarad az egyéb dolgokra. Üdv: András
Helló. Van egy kis gondom a HITECH C fordítóval. Egy olyan probléma amit nem értek meg. Nos arról van szó hogy egy számot kell szoroznia 5000-el majd osztania 1023-al. Nos rossz eredményt kapok, de ha 50000-el szorzom akkor jó eredményt kapok csak a számolás több ideig fog tartani. De ha 500-al szorzok akkor is rossz eredményt kapok pedig nekem az 500-al való szorzás is elég lenne. Mi lehet a hiba?
Valtozo tipusoknak nezzel utana. Mert ugye van 8 bites, 16 bites, 32bites.. valtozo tipus. A 16 bites unsigned ugye 65535 max erteket vehet fel. Peldaul 500x500=250000. Na ezt nem lehet abrazolni 16 bitesen, csak 32 bitesen. Attol fuggetlenul elvegzi a muveletet, es a 16 bites unsigned erteke 53395 lesz. Remelem erted a halandzsamat.
Nem latom a programodat, de gondolom az 50000 az ugye nagyobb, mint 32768 es igy 'int' helyett 'long' tipusnak felkonvertalja a szamodat igy el tudja tarolni a nagy szamot, ha pedig 5000-el akkor nem csinalja meg ezt az atalakitast.
Hogy miert rossz 500 eseten? Megintcsak nem latom a programod, de ha olyan a keplet, hogy X*500/1024 akkor valoszinuleg a fordito az 500/1024-et kiszamolja forditas kozben es igy 0.4887... -tel akar szorozni, es ha ezt a szamot integer tipusnak konvertalja akkor ugye 0-val akar szorozni. De ezek csak otletek, mivel nem mutatsz kodot igy nehez megmondani mit csinalsz...
Hoppá. Kössz a figyelmeztetést. unsigned int-el dolgoztam pedig nem azzal kellett volna. Így csak 16 bites számot kaptam de nem volt elég. 32 bites szám már elég lesz. Köszönöm a figyelmeztetést.
Esetleg, ha a fordító ismeri, akkor használhatsz unsigned short long-ot, ami 24 bites, így gyorsabb lesz a kód.
Igen ismeri és ezt is fogom használni. Köszönöm.
Heló!
PIC18F14K50 segítségével feszültséget szeretnék mérni, és az értéket kijelzőre kiíratni. Az LCD és az ADC kezelése megy. A mérendő feszültség az RC0-ra van rákötve. Viszont negatív referenciaforrásként nem tudom a tokon belül a VSS-t használni, hiába van beírva a D1NSS=0. Próbálkozásaim során a következőkre jutottam: 1.) Ha RC1 analóg bemenet akkor D1NSS bit értékétől függetlenül 0-tól különböző érték csak akkor jelenik meg a kijelzőn ha az RC1 lábat lekötöm VSS-re. 2.) Ha RC1 digitális kimenet és 0 van rá kiíratva akkor méri a feszültséget (gondolom 0-ra húzza le) 3.) Ha RC1 digitális kimenet és 1 van rá kiíratva akkor nem mér (gondolom az ADC nem működik) A PIC jó, PICCOLO projektben lévő programmal kipróbáltam. Csatoltam a forráskód elejét . Valamit az inicializálásnál rontottam el?
A programodban ADCON1 = 0b00001001; áll, ami a Vref+/Vref- lábak használatát írja elő.
A PICCOLO projektben én így írtam:
Hello!
PIC32-t kezdek programozni, és ezzel kapcsolatban van egy kérdésem: FRC-t használok órajelnek. Ez 8MHz-es (legalábbis a dokumentációkból erre lehet következtetni). Ez azt jelenti, hogy ha van egy számláló a programban (és az számol), akkor 1 másodperc alatt 8 000 000-t ér el. A számolóm ez úttal a timer1-hez tartozó TMR1 regiszter. Ha azt akarom, hogy a ledem egy másodpercig égjen, egyig ne, akkor csinálok egy osztást a 8 000 000-ra, 256-tal. Így 31250-et kapok. Ez azt jelenti, hogy a számláló értéke csak minden 256-dik órajel rising edge-re növekszik eggyel. Tehát jöhet a while(TMR1<31250) {} PORTA = 0xFF; TMR1 = 0; //0-zás stb... és még sem működik. Vagy túl gyorsan villog van túl lassan. Attól függően, hogy az OSCCON-ban csinálok-e visszaosztást vagy nem. 2-3 napja szenvedek miatta. Mi lehet a baj? Köszönettel: szepesg>
Ugrótáblát szeretnék:
De az addwf sor után teljesen máshová ugrik. Miért? Megnéztem, az addwf sornál d'40' van a PCLAT-ban és ha a Bit_számláló mondjuk nulla akkor a következő léptetésre a PCLAT-ban d'44' lesz és a programban teljesen máshová, a megszakítások környékére ugrik.
Szia!
18F -en a bra 2 byte -ot foglal. A PCL írása előtt a PCLATU és a PCLATH regisztereket is be kell állítani.
Ez a részlet még mindig nem kezeli azt az esetet, ha a táblázat átlógna a 256 byte-os határon. Egy 2 byte-os rlcf / rrcf és egy bit tesztelése nem lenne jobb megoldás - nem kellene a 256 byte -os határral foglalgozni?
Ha mindig 0xFF-t írsz a PORTA-ba, akkor nem fog villogni. Vagy mást is csinálsz? Mutass többet a kódból. Szimulátor mit mutat?
18F-et használsz? Miért nem használod a táblázatkezelő parancsokat? TBLRD és társait.
Na itt lehet, hogy hülyeséget mondtam, mert most nézem, hogy nem egyszerű tábla, hanem ugrótábláról van szó...
Üdv!
Bár én kezdő vagyok de a problémám idő közben rájöttem, hogy még sem annyira egyszerű. Itt fogalmaztam meg a problémám de itt is leírom. Szeretnék véletlenszerűen számokat generálni egy adott intervallumban és azokkal dolgozni. C tudásommal próbáltam megoldani a problémát (randomize; random(szám)) de ezt a CCS nem fogadta el. Utána kinyitottam a CCS könyvet és az ott kapott rand(), srand() parancsokkal is nekifutamodtam de hiába. Mint utólag rájöttem a véletlenszerűség megoldása nem is egyszerű dolog. Keresgéltem a neten is de nem sokra jutottam pedig olyan egyszerűnek tűnik. Persze tudom, hogy nem létezik szó szoros értelemben vett véletlenszerű számgenerálás. Már az is megfelelne ha pl 1000 ciklus után kezdene el ismétlődni. Nekem a lényeg az lenne, hogy x idő után mindig új értéket kéne kapjak. Ez az idő is konstans lenne. Mennyire lenne véletlen ha egy számokkal feltöltött tömbben lépegetnék megadott időközönként? Nagy helyet elfoglalna? Előre is köszönöm. Esetleg valaki a rand() függvénnyel tudna egy példát, alkalmazást mellékelni mert lehet itt szúrtam el. A CCS nem kapott hibát de ettől eltekintve nem működik. Ezért lenne szükségem esetleg egy példára hátha rájövök magamtól is a hibámra. u.i: esetleg valaki tudna ajánlani egy jó oldalt, könyvet ahol sok az alkalmazás, soronkénti magyarázattal együtt?
Üdvözletem!
Meg szeretném kérdezni az urakat itt, akiknek már volt dolguk Microchip USB Frameworkkel, hogy tudnak-e valami oktatóanyagot adni a használatával kapcsolatban adni, mivel én már rongyosra lapoztam a Google-t. Nem értem hogy miért nem adnak egy alaposabb leírást a használatához, de biztosan meg van nekik az okuk rá.
Mit akarsz vele csinálni, és milyen üzemmódban?
Ha csak használni akarod, akkor a mintapéldákat kell megnézni. Ha meg akarod érteni a működését, akkor az usb.org-on kell kezdeni. HID módú kapcsolathoz Watt cikkét ajánlom. CDC (virtuális soros port) mód használatához a PICCOLO projektemben közzétett szoftver segédlet nálam elég jól bevált. Ez az USB Framework valamelyik korábbi kiadásának átirata. Én a Microchip által ajánlott függvények használatát nehézkesnek találtam, ezért kiegészítettem kettős buffereléssel, ahhoz hasonlóan, ahogy az AN956 alkalmazási mintapélda ajánlja (vagy ahogy én azt értettem...).
Feltetelezem, hogy a bitszamlalo valtozo mindig kisebb vagy egyenlo 127-tel, ekkor:
De ehelyett lehet egyszerubb lenne valami egyszerubb szerkezet:
Izles kerdese persze...
Üdv!
Közben a problémám megoldódott a rand() függvénnyel. Kezdőségem okozta a gondot és nem is a forráskód. Még a ccs generált hibás include-olni kívánt pic adatokat. Rossz órajel.
/*Hello!
Íme a kód: */ #include p32mx795f512l.h //ennek a sornak a megfelelő része kacsacsőrben van, de ha azt használom itt, //akkor nem látszódik a sor kacsacsőrben lévő része main () { OSCCON = 0x4482; //sec osc, sysclk = pbclk T1CON = 0x0; TMR1 = 0x0; T1CON = 0x8000; TRISA = 0; while (1) { PORTA = 0x80; TMR1 = 0; while (TMR1<32768) { //vár } PORTA = 0x0; TMR1 = 0; while (TMR1<32768) //mivel a sec.osc. pont 32768-at számol egy másodperc alatt, azért ezt írtam ide { //vár } }//főcilk. vége }//main vége /*szóval: ez a kódom, és bár jónak tűnik, nem azt teszi, amit akarom, hogy tegyen. Nem másodpercenként villog, hanem kb. 8x gyorsabban. Ezt a 8-at azért írom, mert ez a tapasztalatom. Előre is köszönöm a segítséget.*/>>
Sziasztok.
Van egy 887A-s próbapanelom. Ezen próbálom ki a programokat, amin tanulom a programozást. Egy gyári PK2-vel szoktam írogatni. Eddig nem volt semmi gond, de mostanában 3-4-5-ször is be kell írnom, mire jó. Mindig valami hibát jelez az ellenőrzés után. Mi lehet a gond? Olyan sokszor még nem írtam a csipet, hogy elfáradt volna.
Lehet tap, csatlakozasi problema, vagy hosszu programozo kabel is.
Esetleg a 100nF hiánya... Avagy egy belső oszcillátoros, MCLR -t letiltó konfiguráció, amiben a PGC és / vagy a PGD láb kimenet -- Use Vpp first Programming Enrty, amihez a Vdd -t a programozónak kell adnia. Az ilyen konfigurációkban a kimenetté állítás elé be kell tenni néhány ms késleltetést.
Használd a kód gombot! Talán még a kacsacsőr is megmarad, de a kód feltétlenül olvashatóbb lesz.
A SOSC használatához szerintem nem jó T1CON mostani beállítása. A Timer1 diagramja alapján úgy tűnik, hogy a TCS bitet is "1"-be kellene állítani. |
Bejelentkezés
Hirdetés |