Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   218 / 1319
(#) bbalazs_ válasza Thowra hozzászólására (») Máj 26, 2008 /
 
Az adatlapja mondja meg a tuttit.
Nagyjabol 10ezerszer, de vannak ezer-szazezer kozotti ertekuek is.
Probaljatok meg kicsit nagyobb fesszel. Persze a gyari egetok nem biztos, hogy tudjak ezt...
(#) watt hozzászólása Máj 26, 2008 /
 
Van egy ilyen sorom (MCC18):
  1. if(getsUSBUSART(Pub_Buffer_512_ptr,10))

Hozzá egy ilyen figyelmeztetésem:
  1. 254:Warning [2054] suspicious pointer conversion


A Pub_Buffer_512_ptr-t így hozom létre:
  1. #pragma udata Pub_Buffer_512
  2.         unsigned char Pub_Buffer_512[512];
  3.         unsigned char * Pub_Buffer_512_ptr = &Pub_Buffer_512[0];

A Pub_Buffer_512 a Linker fájlban létre van hozva.

Kérdezném, hogy ebből milyen gond lehet? Hogy érti azt, hogy gyanús, kétes mutató konverzió?
(#) trudnai válasza watt hozzászólására (») Máj 26, 2008 /
 
Azt hiszem a getsUSBUSART egy char* pointert var, es nem tetszik neki, hogy unsigned-et kap. probald meg castolni, vagy eleve char*-nak definialni a puffert es/vagy a pointert.
(#) potyo válasza watt hozzászólására (») Máj 26, 2008 /
 
  1. unsigned char * Pub_Buffer_512_ptr = &Pub_Buffer_512[0];

Ez a sor igazából felesleges, mert a tömb neve eleve a tömb első elemére mutató pointerként viselkedik. Tehát írhatod így:
  1. if(getsUSBUSART(Pub_Buffer_512,10))
(#) watt válasza potyo hozzászólására (») Máj 26, 2008 /
 
Annak oka van, hogy így kell deklarálni. Ha megnézed, ez egy 512bájt hosszú RAM területet fed le, másképp nem lehetne elrni minden elemét.
(#) watt válasza trudnai hozzászólására (») Máj 26, 2008 /
 
Igazad lehet! A getsUSBUSART 64 bájt méretet vár max.(gyári USB firmware)
Azt hiszem előbb át kell mozgatnom egy 64bájtos pufferbe a megfelelő szeleteket, és utána kiküldeni, mert egyébként nem fogja érteni melyik címre hivatkozom. A baj csupán az, hogy már nem sok memória van. Esetleg lemozgatom az alsó 64bájtra sorban a szeleteket...
A C-t csak nemrég kezdtem el használni, ezért nem igazán értem a castolást, és hogy az miért lenne megoldás. Gondolom segítesz!?
(#) watt válasza watt hozzászólására (») Máj 26, 2008 /
 
Jobban átgondolva, hülyeséget írtam, azt hiszem.
Ennek semmi köze, hogy mekkora a puffer mérete.
Ez egy memória cím, nemde, csak a pointer esetében átnyúlhat több bankon. Nem tiszta, hogy ez a C-nek miért jelent gondot, mikor asm-ban FSR-el le lehet kezelni simán. (megint nem szeretem a C-t! )
(#) potyo válasza watt hozzászólására (») Máj 26, 2008 /
 
Én el birom érni akkor is...
(#) watt válasza potyo hozzászólására (») Máj 26, 2008 /
 
Hogyan? Én létre sem tudtam hozni, amíg nem turkáltam a linkerben! Az USB CDC-re ültettem a progit...

Egyébként van egy érdekes tapasztalatom. Az USART Rx és az SPI SDO lába közös, de nekem mindkettő kell. Ezért úgy gondoltam felváltva fogom használni. De ha egyszer inicializáltam az USART-ot, hiába tiltottam le és váltottam SPI-re, nem működött az SPI vonal. Aztán kínomban az RC7-et az SPI mód váltáskor beállítottam kimenetnek és működik.
Ebből arra következtetek, hogy az USART kiválasztásakor az Rx vonal automatikusan bemenetre konfigolja a lábat(ezt tudtam is, csak nem sejtettem, hogy úgy is hagyja!), viszont az SPI nem konfigolja magától kimenetnek az SDO lábat! Köszönöm Microchip!
(#) potyo válasza watt hozzászólására (») Máj 26, 2008 /
 
Idézet:
„A C-t csak nemrég kezdtem el használni, ezért nem igazán értem a castolást, és hogy az miért lenne megoldás.”


Igazából ez egy védelmi figyelmeztetés a fordítótól, mert a char és az unsigned char két különböző értéktartományt tud tárolni (-128..+127 illetve 0..255), bár mindkettő egy bájtos. Char én unsigned char esetén nem olyan vészes, de ha pl. egy int-re mutató pointert váró függvénybe char-ra mutató pointert adsz be, és az oda pakolgat adatokat, akkor ott minden második bájt felül lesz írva. A castolás pedig gyakorlatilag a védelem megerőszakolását jelenti.

Pl. csinálhatsz olyat, hogy
  1. char Pub_Buffer_512[512];
  2. char * Pub_Buffer_512_ptr = &Pub_Buffer_512[0];

(bár ez utóbbi sor szerintem továbbra is felesleges)
(#) potyo válasza watt hozzászólására (») Máj 26, 2008 /
 
A linkerbe én is belenyúltam:
  1. DATABANK   NAME=gpr0       START=0x60           END=0xEF
  2. DATABANK   NAME=puffer     START=0xF0          END=0x2FF
  3. DATABANK   NAME=gpr3       START=0x300          END=0x3FF


Azután pedig:
  1. #pragma udata puffer
  2. unsigned char puffer[512];
  3. unsigned char * puffer_ptr=puffer;  //bár ez nem kell
  4. ...
  5. puffer[302]='A';


Szimulátor szerint működik...
(#) trudnai válasza potyo hozzászólására (») Máj 26, 2008 /
 
Azt hiszem ha ROM-ra nyulkalsz akkor nem felesleges, ahhoz mindenkepp kell a pointer. Azonban valoban van egy bank korlat ebben az MC18-ban. Nem egeszen ertem miert nem tudtak megoldani, hisz epp ez lenne a lenyege egy magas szintu nyelvnek Na mindegy, hogy ez hogyan lett pontosan implementalva az MC18-ban nem tudom hirtelen, nemsokara utana nezek, de mindenesetre elmeletileg lehetne igy pointert gyartani a tombbol ahogy mondod, potyo - csak ezek a PIC-es C implementaciok nagyon furan viselkednek neha.
(#) trudnai válasza potyo hozzászólására (») Máj 26, 2008 /
 
Igazad van, linker script modositassal mukodik a dolog, akkor vissza szivtam amit mondtam
(#) watt válasza potyo hozzászólására (») Máj 26, 2008 /
 
Részlet a kezelési útmutatóból! Én ebből indultam ki
  1. FAQ-10 How do I create a large object in data memory (> 256 bytes)?
  2. By default, MPLAB C18 assumes that an object will not cross a bank boundary. The
  3. following steps are required to safely use an object that is larger than 256 bytes:
  4. 1. The object must be allocated into its own section using the #pragma idata or
  5. #pragma udata directive:
  6. #pragma udata buffer_scn
  7. static char buffer[0x180];
  8. #pragma udata
  9. 2. Accesses to the object must be done via a pointer:
  10. char * buf_ptr = &buffer[0];
  11. ...
  12. // examples of use
  13. buf_ptr[5] = 10;
  14. if (buf_ptr[275] > 127)
  15. ...
  16. 3. A region that spans multiple banks must be created in the linker script:
  17. - Linker script before modification:
  18. DATABANK NAME=gpr2 START=0x200 END=0x2FF
  19. DATABANK NAME=gpr3 START=0x300 END=0x3FF
  20. - Linker script after modification:
  21. DATABANK NAME=big START=0x200 END=0x37F PROTECTED
  22. DATABANK NAME=gpr3 START=0x380 END=0x3FF
  23. 4. The object’s section (created in Step 1) must be assigned into the new region
  24. (created in Step 3) by adding a SECTION directive to the linker script:
  25. SECTION NAME=buffer_scn RAM=big


Mindezt a "//bár ez nem kell" megjegyzésedre írtam...
(#) watt hozzászólása Máj 26, 2008 /
 
Még valami: Miért használ a microchip a firmware-ben sima chart, mikor címre számít? Szórakoznak az emberrel? Hol láttak ezek már előjeles címet? Vagy én nem értek valamit?
(#) potyo válasza watt hozzászólására (») Máj 26, 2008 /
 
Ebben az az érdekes, hogy a pointer sem más, mint egy változó, ami egy memóriacímet tárol. A tömb neve pedig a továbbiakban konstansként szerepel a programban, amit pointerként fel lehet használni, mert a tömb nulladik elemére mutat. Hogy felhasználod-e, vagy ugyanezt a kezdőcímet egy másik pointerbe teszed, és a továbbiakban azt használod, az már rajtad áll, teljesen mindegy (a generált kódot nem néztem, ott lehet némi eltérés, de biztos nem nagy). Igazából nem értem, hogy miért van ez így kihangsúlyozva a leírásban...
(#) potyo válasza watt hozzászólására (») Máj 26, 2008 /
 
Akkor valószínűleg ezt nem értetted. Amikor azt látod, hogy char * ptr, az nem az jelenti, hogy a cím az előjeles, hanem hogy az azon a címen levő adat előjelesként kezelendő, amikor azt valahol felhasználjuk pl. egy feltételes ugrásnál.
(#) trudnai válasza watt hozzászólására (») Máj 26, 2008 /
 
Igen, tulajdonkepp ezt csinalta potyo is, csak o nem hozott letre sectiont a linker scriptben.
(#) trudnai válasza watt hozzászólására (») Máj 26, 2008 /
 
A masik ahhoz amit potyo mondott, hogy C-ben minden pointer. Mikor egy tombod van, akkor is tulajdonkepp egy pointered van, ezert is lehet keverni azokat. Ha megfigyeled a peldat amit irtal, abban a char* buf_ptr -t utana siman buf_ptr[index] -kent hasznalja. Elmeletileg a char *buf_ptr = &buffer[0] helyett is lehetett volna char *buf_ptr = buffer -t irni.

A pointer tipusa amugy azt is megmondja mikent kell szamolni vele (pointer aritmetika). Tehat a buf_ptr+5 (avagy buf_ptr[5]) -nel neki tudnia kell 8, 16 vagy 32 bites (vagy akar strukturanal ennel is hosszabb) szamot kell az eredeti memoria cimhez hozza adnia.
(#) watt válasza potyo hozzászólására (») Máj 26, 2008 /
 
Igen, köszi, már vágom. Csak a típust mutatja, amire mutat azét...(jajj! )
Mindenesetre átalakítottam, és most már az sem működik ami eddig! Gyúrom tovább...
(#) Thowra hozzászólása Máj 27, 2008 /
 
Üdv mindenkinek!
Még mindig ezzel a fránya 627 tel szívok.
Megpróbáltam magasabb feszen törölni, írni de nem lehet így se. Pic nél nincs valami olyasmi mint teljes formázás?
(#) trudnai válasza Thowra hozzászólására (») Máj 27, 2008 /
 
Dehogynem, mar egyszer leirtam, hogy a "bulk erase" az... hogy hogy forditottak ezt magyarra sajnos nem tudom, en nem hasznalok magyar nyelvu dolgokat, mert sokkal kevesebb magyarazatot talalni magyarul a neten...
(#) szilva válasza Thowra hozzászólására (») Máj 27, 2008 /
 
Ha a bulk erease után is csak rosszul detektálja, akkor szerintem ott a core sérült. Nem hiszem, hogy lehet kezdeni vele bármit is, maximum kitűzheted az ingedre dekorációnak a chipet, ha nem akarod kidobni
(#) trudnai válasza Thowra hozzászólására (») Máj 27, 2008 /
 
Gondolkodtam Thowra, ugy tudnad torolni, hogy ovatosan az oldalcsipovel keresztbe rafogsz, es egy enyhe nyomassal picit tartod, majd folyamatosan novekvo nyomast gyakorolsz ra mig kette nem valik a muanyag tokja es lathatova nem valik a szilikon lapkaja.

Ezekutan az egeszet beteszed a kukaba es eloveszed a masikat amit epp most vettel a boltban... Es mikozben ezzel az ujjal dolgozol foldeld le magad nehogy a statikus feltoltodes tonkre tegye a chipedet.
(#) watt válasza trudnai hozzászólására (») Máj 27, 2008 /
 
Ti milyen földelést használtok? Nálam a virágboltban vett muskátliföld vállt be a legjobban!
Egyébként ha van egy fémfelület, amit meg lehet fogni, és a PC földelt(!) fémrészéhez is van köze, akkor annak megtapizása már elegendő lehet... Ilyen pl. az USB hosszabbító dugó vége...
(#) Thowra válasza trudnai hozzászólására (») Máj 27, 2008 /
 
Üdv!
A bulk erese vel az a bajom, hogy nem tudom pontosan hogy és milyen progival kell elkövetni
Ami a füldelést illeti azt használok.
A második hsz ed teccett
Szóval mi is ez a bulk erase? és hogy is kell?
(#) potyo válasza watt hozzászólására (») Máj 27, 2008 /
 
Idézet:
„Ilyen pl. az USB hosszabbító dugó vége...”


Abban nem bíznék, annyi árnyékolás nélküli usb kábelt láttam már...
(#) szilva válasza watt hozzászólására (») Máj 27, 2008 /
 
Megmondom őszintén, én otthon általában semmit. Viszont utálom a műszálas cuccokat, úgyhogy nem szoktam "csattogni". Ráadásul egy jó fél éve, amióta a PIC-es pákámat megépítettem, azóta azzal dolgozok, és annak a pákának a teste földelt (a PC táp, amiről megy, az is földelt, a páka háza össze van kötve a táp házával).
(#) Soulskater hozzászólása Máj 27, 2008 /
 
Sziasztok!
Abban szeretném a segítségeteket kérni, hogy segítsetek elindítani a pic programozás rögös útján!
Szóval el tudnátok nekem magyarázni egyszerűen hogy hogyan kell a hs oszcillátort bekötni,az égető rajzát elmagyarázni (amit a pices cikkben taglaltak)
melyik jelölés mit jelent,ilyen nagyon alap dolgok!
A kedves segítégeteket nagyon köszönöm!!!
(#) Braf hozzászólása Máj 27, 2008 /
 
Találkozott már valaki olyan problémával , hogy az égető (PicKit2) felismeri a pic-et de nem tudja égetni? (16f877) Törölni tudom, törlődik rendesen. Bármit próbálok bele írni hibát ír ki. (mindenhol 0000h, 0001h, 0002h, 0005h, vagy 200X h értékeket olvas vissza) Meghalt volna a pic ben a flash memória?

Minden mással megy az égető (másik 877 el is).
Következő: »»   218 / 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