Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1014 / 1319
(#) adamhollos válasza kissi hozzászólására (») Aug 9, 2011 /
 
Nem ismertem. Köszi, hogy segítettél.
(#) Andre90 válasza El_Pinyo hozzászólására (») Aug 9, 2011 /
 
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
(#) edison14 hozzászólása Aug 9, 2011 1 /
 
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?
(#) vilmosd válasza edison14 hozzászólására (») Aug 9, 2011 /
 
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.
(#) trudnai válasza edison14 hozzászólására (») Aug 9, 2011 /
 
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...
(#) edison14 válasza trudnai hozzászólására (») Aug 9, 2011 /
 
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.
(#) potyo válasza edison14 hozzászólására (») Aug 9, 2011 /
 
Esetleg, ha a fordító ismeri, akkor használhatsz unsigned short long-ot, ami 24 bites, így gyorsabb lesz a kód.
(#) edison14 válasza potyo hozzászólására (») Aug 9, 2011 /
 
Igen ismeri és ezt is fogom használni. Köszönöm.
(#) pagaby hozzászólása Aug 9, 2011 /
 
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?

Fesz_mero.c
    
(#) icserny válasza pagaby hozzászólására (») Aug 10, 2011 /
 
A programodban ADCON1 = 0b00001001; áll, ami a Vref+/Vref- lábak használatát írja elő.

A PICCOLO projektben én így írtam:
  1. ADCON1=0;                               //VREF+ = VDD, VREF- = VSS
(#) pagaby válasza icserny hozzászólására (») Aug 10, 2011 /
 
Köszönöm!
(#) szepesg hozzászólása Aug 11, 2011 /
 
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>
(#) Attila86 hozzászólása Aug 11, 2011 /
 
Ugrótáblát szeretnék:
  1. Adás_ugrótábla
  2.         movf    Bit_számláló, W
  3.         addwf   PCL, f
  4.         bra             bit_0
  5.         bra             bit_1
  6.         bra             bit_2
  7.         bra             bit_3
  8.         bra             bit_4
  9.         bra             bit_5
  10.         bra             bit_6
  11.         bra             bit_7
  12.         bra             bit_8
  13.         bra             bit_9
  14.         bra             bit_10

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.
(#) Hp41C válasza Attila86 hozzászólására (») Aug 11, 2011 /
 
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.

  1. Adás_ugrótábla
  2.             movf    PCL,w ; betölti a PCLATU, PCLATH regisztereket
  3.             movf    Bit_számláló,W
  4.             addwf   WREG,w
  5.             addwf   PCL, f
  6.             bra          bit_0
  7.             bra          bit_1
  8.             bra          bit_2
  9.             bra          bit_3
  10.             bra          bit_4
  11.             bra          bit_5
  12.             bra          bit_6
  13.             bra          bit_7
  14.             bra          bit_8
  15.             bra          bit_9
  16.             bra          bit_10


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?
(#) potyo válasza szepesg hozzászólására (») Aug 11, 2011 /
 
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?
(#) potyo válasza Attila86 hozzászólására (») Aug 11, 2011 /
 
18F-et használsz? Miért nem használod a táblázatkezelő parancsokat? TBLRD és társait.
(#) potyo válasza potyo hozzászólására (») Aug 11, 2011 /
 
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ó...
(#) nagy_david1 hozzászólása Aug 11, 2011 1 /
 
Ü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?
(#) Baprof hozzászólása Aug 11, 2011 /
 
Ü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á.
(#) icserny válasza Baprof hozzászólására (») Aug 11, 2011 /
 
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...).
(#) trudnai válasza Hp41C hozzászólására (») Aug 11, 2011 /
 
Feltetelezem, hogy a bitszamlalo valtozo mindig kisebb vagy egyenlo 127-tel, ekkor:

  1. Adás_ugrótábla
  2.     ; UPPER es LOWER betoltese
  3.     movlw   high ugrotabla
  4.     movwf   PCLATH
  5.     movlw   upper ugrotabla
  6.     movwf   PCLATU
  7.  
  8.     rlncf   Bit_számláló,w ; WREG = szamlalo * 2
  9.     addlw   ugrotabla      ; WREG += ugrotabla cime
  10.  
  11.     ; tulcsordulas kezelese
  12.     btfsc   STATUS,C
  13.     incf    PCLATH,f
  14.     btfsc   STATUS,C
  15.     incf    PCLATU,f
  16.  
  17. ugrotabla
  18.     bra     bit_0
  19.     bra     bit_1
  20.     bra     bit_2
  21.     bra     bit_3
  22.     bra     bit_4
  23.     bra     bit_5
  24.     bra     bit_6
  25.     bra     bit_7
  26.     bra     bit_8
  27.     bra     bit_9
  28.     bra     bit_10


De ehelyett lehet egyszerubb lenne valami egyszerubb szerkezet:

  1. Adás_ugrótábla
  2.     incf    Bit_számláló,w ; WREG = szamlalo * 2
  3.  
  4. ugrotabla
  5.     dcfsnz  WREG,w
  6.     bra     bit_0
  7.     dcfsnz  WREG,w
  8.     bra     bit_1
  9.     dcfsnz  WREG,w
  10.     bra     bit_2
  11.     dcfsnz  WREG,w
  12.     bra     bit_3
  13.     dcfsnz  WREG,w
  14.     bra     bit_4
  15.     dcfsnz  WREG,w
  16.     bra     bit_5
  17.     dcfsnz  WREG,w
  18.     bra     bit_6
  19.     dcfsnz  WREG,w
  20.     bra     bit_7
  21.     dcfsnz  WREG,w
  22.     bra     bit_8
  23.     dcfsnz  WREG,w
  24.     bra     bit_9
  25.     dcfsnz  WREG,w
  26.     bra     bit_10
  27.  
  28.     bra error...


Izles kerdese persze...
(#) Hp41C válasza trudnai hozzászólására (») Aug 12, 2011 /
 
  1. Adás_ugrótábla
  2.         ; UPPER es LOWER betoltese
  3.         movlw   high ugrotabla
  4.         movwf   PCLATH
  5.         movlw   upper ugrotabla
  6.         movwf   PCLATU
  7.      
  8.         rlncf   Bit_számláló,w ; WREG = szamlalo * 2
  9.         addlw   ugrotabla      ; WREG += ugrotabla cime
  10.      
  11.         ; tulcsordulas kezelese
  12.         btfsc   STATUS,C
  13.         incf    PCLATH,f
  14.         btfsc   STATUS,C
  15.         incf    PCLATU,f
  16.  
  17.          MOVWF    PCL   ; Kimaradt...
  18.    
  19.     ugrotabla
  20.         bra     bit_0
  21.         bra     bit_1
  22.         bra     bit_2
  23.         bra     bit_3
  24.         bra     bit_4
  25.         bra     bit_5
  26.         bra     bit_6
  27.         bra     bit_7
  28.         bra     bit_8
  29.         bra     bit_9
  30.         bra     bit_10
(#) trudnai válasza Hp41C hozzászólására (») Aug 12, 2011 /
 
Valoban
(#) nagy_david1 válasza nagy_david1 hozzászólására (») Aug 12, 2011 /
 
Ü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.
(#) szepesg válasza potyo hozzászólására (») Aug 12, 2011 /
 
/*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.*/>>
(#) Poostmaster hozzászólása Aug 12, 2011 /
 
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.
(#) vilmosd válasza Poostmaster hozzászólására (») Aug 12, 2011 /
 
Lehet tap, csatlakozasi problema, vagy hosszu programozo kabel is.
(#) Hp41C válasza Poostmaster hozzászólására (») Aug 12, 2011 /
 
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.
(#) icserny válasza szepesg hozzászólására (») Aug 12, 2011 /
 
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.
Következő: »»   1014 / 1319
Bejelentkezés

Belépés

Hirdetés
XDT.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