Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1197 / 1319
(#) Attila86 hozzászólása Aug 11, 2015 /
 
dsPIC33EP512GP806-al dolgozom most és akadt egy kis nézeteltérésem az SPI perifériákkal:
Az SPI3 nem megy olyan gyorsan mint azt szeretném. Megnéztem debuggerben hogy az SPI3 elsődleges és másodlagos órajel-osztói mire vannak állítva és kiderült hogy nem arra amire szeretném. Én erre szeretném:
  1. SPI3CON1bits.PPRE=0b11;     //Elsődleges osztó 1:1
  2. SPI3CON1bits.SPRE=0b110;    //Másodlagos osztó 2:1

De valójában ez van benne:
  1. SPI3CON1bits.PPRE=0b00;     //Elsődleges osztó 64:1
  2. SPI3CON1bits.SPRE=0b110;    //Másodlagos osztó 2:1

Vagyis 64-szer olyan lassú az SPI mint azt szeretném. Debuggerben megállítottam a fenti sorok előtt és léptettem a PIC-et. Az SPI3CON1bits.PPRE=0b11 sor előtt 0b00 van a regiszterben, a soron továbblépve pedig szintén 0b00! Na ez hogy a bánatba lehet?!
Megpróbáltam azt hogy a Variables fülön átírom kézzel 0b11-re, de miután beírom és rányomok az enterre, visszaugrik 0b00-ra! Próbáltam más értékeket is de semmit nem fogad el, csak a 0b00-át.

Gondoltam defektes a PIC. Ezért megnéztem az errata-ját (Bővebben: Link) melyben van is két SPI-os hiba említve de ezek nem órajel-osztóról szólnak.

Ha már van 4db SPI-ja a mikrovezérlőnek, gondoltam megnézem a másik hármat is hogy azok mit művelnek:

SPI1CON1bits.PPRE -> 0b01 van benne és nem lehet átírni semmire
SPI1CON1bits.SPRE -> 0b111 van benne és nem lehet átírni semmire

SPI2CON1bits.PPRE -> bele tudok írni akármit
SPI2CON1bits.SPRE -> csak 0b000-t és 0b001-et lehet beleírni

SPI3CON1bits.PPRE -> 0b00 van benne és nem lehet átírni semmire
SPI3CON1bits.SPRE -> 0b110 van benne és nem lehet átírni semmire

SPI4CON1bits.PPRE -> bele tudok írni akármit
SPI4CON1bits.SPRE -> csak 0b000-t és 0b001-et lehet beleírni

Még arra is gondoltam hogy a PPRE-be és az SPRE-be esetleg nem lehet bizonyos kombinációpárokat beállítani ezért direkt próbáltam változtatgatni mindkettőt össze vissza de ugyan ezt tapasztaltam.
(#) benjami válasza Attila86 hozzászólására (») Aug 11, 2015 /
 
Első körben megpróbálnám azt, hogy a teljes SPIxCON1 regisztert egy utasítással tölteném fel, hogy ne irogassa és olvasgassa gyors egymásutánban ugyanazt a regisztert.
(#) killbill válasza Wezuv hozzászólására (») Aug 11, 2015 /
 
Parameterkent csak a mezo cimet tudod atadni. Olyan megoldas szerintem nincs, ami ennyire egyszeruen osszerakja a p-t meg a mezo nevet. Ha csak par mezo van, akkor atadhatsz egy kodot es egy switch - case szerkezet a megfelelo mezon elvegzi a kivant muveletet.

Viszont, ha csak 8 egybites mezod van, ami nem is struktura, hanem bitfield, akkor mas a helyzet. Eloszor is, a bitfield-nek nincs cime, nem lehet ra cim szerint hivatkozni. De egyebkent nem is kell, mert nem bitfield-et kell alkalmazni, hanem egy 8 bites szot, aminek az egyes bitjeit allitgatod |=, &= stb logikai muveletekkel. Es akkor mar nem is nev szerint kell rajuk hivatkozni. Azaz nev szerint, mint pl:
  1. #define FLAG_1SEC   (1<<0)
  2. #define FLAG_10SEC  (1<<1)
  3. #define FLAG_STOP   (1<<2)
  4. #define FLAG_RELOAD (1<<3)
  5.  
  6.   flag |= FLAG_1SEC;
Ezzel bitenkent tudod allitgatni, vizsgalni stb. Es ezt parameterkent is at tudod adni, hiszen csak egy szam. Nevet csak azert adsz neki, hogy megse ugy nezzen ki a program, hogy flag |= 32; Senki nem tudja, hogy mi az a 32, de a FLAG_1SEC az beszedes.

A pic32 magja egy RISC processzor (MIPS m4k), ami jellemzoen minden muveletet regisztereken vegez es azon felul van load meg store.
(#) Wezuv válasza killbill hozzászólására (») Aug 12, 2015 /
 
Szia! Azt értem, hogy a bit-field egy a bájton értelmezett bitmező és nincs címe, csak a bájtnak, de azt nem, hogy miért nem lehet átadni a változtatni kívánt bit számát egy subrutinnak paraméterként, majd benne használni. (pontosabban, nem tudom hogyan kell, lehet-e )

A fenti példádból kiindulva az alábbi problémát szeretném megoldani:
  1. struct sFlags{
  2.         unsigned B0:1;
  3.         unsigned B1:1;
  4.         unsigned B2:1;
  5.         unsigned B3:1;
  6.         unsigned B4:1;
  7.         unsigned B5:1;
  8.         unsigned B6:1;
  9.         unsigned B7:1;                 
  10.     }volatile Flags;
  11.    
  12.     #define FLAG_B0   (1<<0)
  13.     #define FLAG_B1   (1<<1)
  14.     void FlagSetsub(volatile struct sFlags *pFlags, unsigned char pBit, unsigned char BitChange);
  15.  
  16.     void foo(void){
  17.         FlagSetsub(&Flags, FLAG_B0, True);    //True=1, False=0
  18.  
  19.     }
  20.  
  21.     void FlagSetsub(volatile struct sFlags *pFlags, unsigned char pBit, unsigned char BitChange){
  22.         pFlags->pBit=  BitChange;  
  23.     }

Nyílván az unsigned char pBit típusa nem megfelelő, ötletem sincs, hogyan lehetne jelezni a fordítónak, hogy ez egy bitre történő hivatkozás. Köszi az eddigieket is!
(#) Wezuv válasza Wezuv hozzászólására (») Aug 12, 2015 /
 
De még ez sem lenne jó igazából, mert ez is csak egy structurához kötődik, másikat nem fogad el. Jó lenne kiszedni a structura, vagy union bájtra vonatkoztatott címét, azt átadni, mint egy unsigned char típus címe, majd úgy változtatni, mint bármelyik másik bájt bitjeit. De ezt eddig nem engedi a fordító típuseltérések miatt, holott ez is csak egy sima bájt a memóriában. Kezdem azt hinni, hogy ezt nem lehet és igazából nem is értem, hogy miért nem...
(#) killbill válasza Wezuv hozzászólására (») Aug 12, 2015 /
 
Idézet:
„Azt értem, hogy a bit-field egy a bájton értelmezett bitmező és nincs címe, csak a bájtnak, de azt nem, hogy miért nem lehet átadni a változtatni kívánt bit számát egy subrutinnak paraméterként”
Azert nem lehet atadni a bit szamat, mert nem csak szama van, hanem tobb dolog is tartozik egy-egy bitfieldhez. Eloszor is van tipusa, aztan van egy kezdo bitpozicioja a byte-on (int-en) belul es vegul van szelessege, azaz, hogy hany bites az adott bitfield.
Ha te bitenkent akarsz dolgozni egy adattal ilyen cimzett modon, akkor egyszeruen fogsz egy sima byte-ot, szot, akarmit, es logikai ES, VAGY, XOR muveletekkel fersz hozza a bitekhez. Azaz a bitet nem mint valtozot kezeled, hanem mint bitet. Tehat, a fenti peldadat alapul veve:
  1. static colatile char flags;
  2.  
  3. #define FLAG_B0   1
  4.  
  5. foo(void)
  6. {
  7.   flags |= FLAG_B0;
  8. }

Mert ez pontosan azt csinalja, hogy a flags valtozo legalso bitjet egybe allitja. Ehhez mindjart az is hozzatartozik, hogy annak nem latom ertelmet, hogy a szamoknak nevet adjunk, tehat a FLAG_B0, B1...FLAG_B7, felesleges, mert nem hordoz semmi tobbletinformaciot ez az elnevezes. Annak van ertelme, hogy FLAG_START, FLAG_STOP, stb.

De ha ebbol fuggvenyt akarsz csinalni, akkor atadhatod egy fuggvenynek a flags cimet, es egy byte-ot, ami a bitmask, valamint, hogy set vagy reset:
  1. FlagSetsub(volatile char *p, char whichbit, int setreset)
  2. {
  3.    if(setreset == True)
  4.       *p |= whichbit;
  5.   else
  6.      *p &= ~whichbit;
  7. }

Ez mindjart egyszerre tobb bitet is beallit vagy torol.
(#) usane válasza Attila86 hozzászólására (») Aug 12, 2015 /
 
Elsőre én is azt javaslom mint benjami, msodszor pedig nem tudom milyen módban és mekkora sebességgel akarod működtetni, de érdemes az adatlap 526. oldalától lefelé is olvasni.
Az SPI Reference Manual:
Idézet:
„Not all clock rates are supported. For more information, refer to the SPIx timing
specifications in the “Electrical Characteristics” chapter of the specific device data sheet.”
(#) Wezuv válasza killbill hozzászólására (») Aug 12, 2015 /
 
Idézet:
„Azert nem lehet atadni a bit szamat, mert nem csak szama van, hanem tobb dolog is tartozik egy-egy bitfieldhez. Eloszor is van tipusa, aztan van egy kezdo bitpozicioja a byte-on (int-en) belul es vegul van szelessege, azaz, hogy hany bites az adott bitfield.”

Igen, de ezeket a típusokat miért ne tudnám átadni, csak elvi síkon? (azon kívül persze, hogy a fordító nem támogatja, azaz jelen esetben nem lehet...).

Egyetértek veled, ha ilyenre van szükség, akkor nem szabad struktúrát használni.
Köszönöm a segítséged!
(#) killbill válasza killbill hozzászólására (») Aug 12, 2015 /
 
Rosszul mondtam, a bit-mezőknek nincs előjelük, mindig unsigned-ek.
(#) Wezuv válasza killbill hozzászólására (») Aug 12, 2015 /
 
Igen, de én úgy értettem, más típus, több bites, vagy meglévő char, int is lehet egy "mező", és akár azt is át lehetne adni, ha lehetne.
(#) killbill válasza Wezuv hozzászólására (») Aug 12, 2015 /
 
A struktura egy olyan tipus, ami barmilyen mas tipusu elemekbol rakhato ossze. Akar strukturak is lehetnek benne. A strukturanak elemei vannak a magyar terminologia szerint. Az elemekre csak a nevukkel tudsz hivatkozni, de az elemek cime is eloallithato. Tehat akar az egesz struktura cimet elo lehet allitani, akár valamelyik elem cimet. Mindennapos dolog, nagyon hasznos.
A bitmezo a strukturan belul egy specialis dolog. A bitmezo az egyetlen objektum (a konstansokon kivul), aminek nem lehet a cimet eloallitani es nem lehet ra hivatkozni cim szerint. A C-ben még a fuggvenyeknek is eloallithato a cime, es cim szerint lehet fuggvenyt hivni. Egy fuggveny cimet at lehet adni valtozoban, es meg is lehet hivni az alapjan. A bitmezokre nem lehet igy hivatkozni, nem tudom, hogy miert. Igy definialtak. Az elmult 28 evben talán egyszer hasznaltam bitmezot, de akkor sem volt indokolt A mikrocsip eloszeretettel alkalmazza a hardware regiszterek leirasara, ami kenyelmesse es helyenkent atlathatobba teszi a programot, de ugyanakkor tudni kell azt, hogy a bitmezokon beluli bitek elhelyezkedese a C fordito maganugye. Ertsd, ha csinalsz bitmezoket, akkor nem tudhatod, hogy az elso mezod a 31. vagy a 0. biten lesz. Tehat HW regiszterek leirasara csak ugy lehet hasznlani, ha garantalt, hogy a C fordito ujabb valtozatai nem valtoztatnak a bitkiosztas meneten. Ezen felul a HW regiszterek leirasanal felesleges kodot eredmenyez, ha minden egyes bit beallitasara kulon ertekadas van, ahelyett, hogy egyetlen ertekadassal beallitanad a regiszter osszes bitjet. A forditott kod szempontjabol meg nagyjabol tok mindegy, hogy bitmezot hasznalsz vagy "kezzel" maszkolgatod, shiftelgeted a biteket, ugyanazt fogja forditani, ha jo a fordito. De ez itt mar erosen OFF, lassan tenyleg kellene csinalni egy C programozas topikot...
(#) Wezuv válasza killbill hozzászólására (») Aug 12, 2015 /
 
Köszi a válaszokat! Egyébként van C topic is...
(#) kszabi hozzászólása Aug 13, 2015 /
 
Sziasztok!
Szükségem lenne egy kód mintára.
Két db int tipusu változót szeretnék letárolni, majd reset után visszaolvasni.

dsPIC33EP512MU810, c30 v3.31
Köszi Szabolcs
(#) killbill válasza Wezuv hozzászólására (») Aug 13, 2015 /
 
Idézet:
„Egyébként van C topic is...”
Szerintem általános C topik nincs, vagy legalábbis én nem találtam. PIC C van, meg AVR C. De mindkettőn nagyon sokszor alapfokú C kérdések vannak, nem pedig valamelyik mikrokontrollerre specifikus kérdések.
(#) Wezuv válasza killbill hozzászólására (») Aug 13, 2015 /
 
Szia!
Erre gondoltam:
PIC programozása C nyelven, C-Compiler
Általános nincs, de ide szerintem belefér bármi, ami PIC és C.
(#) killbill válasza Wezuv hozzászólására (») Aug 13, 2015 /
 
A PIC es PIC C C topikban OFF a bitmező, mert ennek semmi köze a PIC-hez, ez pusztán általános C kérdés. Egyszer egy kedves fórumtárs nehezményezte, hogy a PIC topikban C-ről beszélünk, mert szerinte a PIC-et a rendes ember assembly-ben programozza... És amiért mondtam, hogy kellene egy C topik, az az, hogy a bitmezőknél sokkal hétköpznapibb C kérdések is fel szoktak merülni mint pl. pointerek, típusok, implicit típuskonverziók, változók érvényességi köre, stb. Akarmilyen processzoron is dolgozzon az illető (PIC, AVR, ARM, PC, 8051, z80, stb) a C nyelvvel kapcsolatos kérdéseknek ott lenne helye. Csak mivel nincs ilyen topik, a kérdést mindenki az általa használt mikrokontroller programozása C-ben című topikban teszi fel.
(#) Wezuv válasza killbill hozzászólására (») Aug 13, 2015 /
 
Szerintem ezzel nincs semmi gond, emiatt ne fájjon a fejed.
(#) Attila86 válasza usane hozzászólására (») Aug 14, 2015 /
 
Az SPI sebességének beállítása előtt kikapcsoltam az SPI-t majd az osztó-módosítás után vissza, így sikerült megváltoztatnom az SPI sebességét. Érdekes azonban hogy debuggoláskor manuálisan még így sem tudtam átírni a két regisztert, csak a PIC saját magának.
(#) Attila86 hozzászólása Aug 14, 2015 /
 
Szeretnék most ugyan ezzel a mikrovezérlővel (dsPIC33EP512GP806) feszültséget mérni az egyik lábán. Semmi extra, 12 bites módban, az AD1 CH0-jával az RE6 lábon (AN30) mérnék DMA és mintavétel-automatizálás nélkül. Áttúrtam az adatlapot, végül arra jutottam hogy az alábbi beállítások megfelelőek lesznek:
  1. //A/D konverter:
  2.     AD1CON1bits.AD12B=1;        //12 bites mód
  3.     AD1CON1bits.FORM=0b00;      //Eredmény jobbra igazítása, előjel nélkül
  4.     AD1CON1bits.SSRCG=0;
  5.     AD1CON1bits.SSRC=0b000;     //A SAMP bit törlése indítja a konverziót
  6.     AD1CON1bits.SIMSAM=0;       //Nincs szimultán mintavételezés
  7.     AD1CON1bits.ASAM=0;         //Automatikus mintavételezés kikapcsolva
  8.     AD1CON2bits.VCFG=0b000;     //AVSS és AVDD használata referenciaforrásnak
  9.     AD1CON2bits.CHPS=0b00;      //Csak a CH0 mintavevő csatornát használjuk
  10.     AD1CON2bits.ALTS=0;         //Nem használjuk az alternáló módot
  11.     AD1CON2bits.SMPI=0b0000;    //Minden egyes konverzió után történhessen megszakítás/DMA címléptetés
  12.     AD1CON3bits.ADRC=0;         //Az ADC konverziós órajelének a forrása a rendszer órajeléből származtatva
  13.     AD1CON3bits.ADCS=0b00000100;//TAD=5*TCY=142,85ns
  14.     AD1CON4bits.ADDMAEN=0;      //DMA nincs használva az A/D-hez, a konverzió eredményei az ADC1BUF0-ADC1BUFF bufferba kerülnek
  15.     AD1CHS0bits.CH0NA=0;        //A CH0 csatorna negatív jelének forrása a VREFL lesz
  16.     AD1CHS0bits.CH0SA=30;       //A CH0 csatorna pozitív jelének forrása az AN30 lesz
  17.     AD1CON1bits.ADON=1;         //A/D modul bekapcsolva!

A mintavételt megszakításból, 40ms-onként indítom az AD1CON1bits.SAMP bit törlésével. Ha jól vettem ki az adatlapból akkor így kell indítani. A következő megszakításban (40ms múlva) pedig kimentem az ADC1BUF0-ADC1BUFF regiszterek tartalmát. Arra ugyanis nem sikerült rájönnöm hogy az A/D hova teszi a mérési eredményt, a tetejébe? Az aljába? Vagy tologatja mint egy fifo? Ezért biztos ami biztos kimásoltam mind a 16-ot és kijeleztettem a TFT-n, de teljesen random értékeket kaptam amik ráadásul soha nem is változnak.
Mit rontottam el? Rosszul indítottam el a mintavételezést?
(#) cross51 válasza Attila86 hozzászólására (») Aug 14, 2015 /
 
Nem teljesen erre a családra van de hasonló csak itt nem írnak a DMA-ról(de mint mondtad ez most nem szükséges) Bővebben: Link.
Valamint a SAMP bit nem teljesen így van akkor kezdődik a mintavétel, ha SAMP bit = 1 és mikor a SAMP bit = 0 akkor kezdődik a konverzió amit a DONE bit-el lehet figyelni.

Az, hogy hova pakolja az ADC az eredményt ez beállítástól függ alapértelmezetten az ADCBUF0-ba kerül, de ha úgy van beállítva(nem tudom, hogy kell sose használtam) hogy az ADCBUF0-ADCBUFF-ig tárol akkor az ADCBUFF0-ba az első mérés eredménye és szépen sorba így tovább.
Bocsánat, hogy nem tudok pontos beállítást mondani rég használtam már 16 bites PIC-et.
(#) edison14 hozzászólása Aug 15, 2015 /
 
Sziasztok!

PIC24-re próbálok asm kódot írni. Egyenlőre csak LED villogtatással kezdem mert ezt a családot még nem ismerem. Meg is írtam az első kódot, de fordításkor az alábbi hibaüzenet jön ki:
Idézet:

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'D:/Electro/Project/Led_blinkers/testasmPIC24.X'
make -f nbproject/Makefile-default.mk dist/default/production/testasmPIC24.X.production.hex
make[2]: *** No rule to make target 'build/default/production/newAsmTemplate.o', needed by 'dist/default/production/testasmPIC24.X.production.hex'. Stop.
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Entering directory 'D:/Electro/Project/Led_blinkers/testasmPIC24.X'
make[2]: Leaving directory 'D:/Electro/Project/Led_blinkers/testasmPIC24.X'
nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
make[1]: Leaving directory 'D:/Electro/Project/Led_blinkers/testasmPIC24.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 125ms)”


Nem tudom mit takar ez a hiba. Tudnátok segíteni mi lehet a probléma?
(#) Attila86 válasza cross51 hozzászólására (») Aug 15, 2015 /
 
Sikerült közben megoldanom, köszi!
(#) Attila86 hozzászólása Aug 15, 2015 /
 
Na most egy egyszerűbb(nek tűnő) kérdésem van:
Szeretnék az RG7-es lábra felhúzóellenállást bekapcsolni:
  1. TRISGbits.TRISG7=1;
  2. CNPUGbits.CNPUG7=1;

Szerintem ennyi kellene. De stabil alacsony szint van a lábon.
(#) AZoli válasza Attila86 hozzászólására (») Aug 16, 2015 /
 
Ha jót nézek, (C1IN1-/SDI2/PMA4/RPI119/RG7) ez az a láb. Itt van pl. comparator modul bemenet, SPI, és PPS, stb.
Gondoltam hogy PPS -el valami periféria kimenet hozzá van rendelve, és az tartja alacsony szinten, de nem lehet, mert PRI.
A PMP modul lehet még, de azt még sose használtam, nem ismerem. Nincs engedélyezve véletlenül?
(#) killbill válasza Attila86 hozzászólására (») Aug 16, 2015 /
 
Ha egy ellenallassal megprobalog felhuzni tapra, akkor felmegy? (Kimenet vagy bemenet a lab?)
(#) Attila86 válasza killbill hozzászólására (») Aug 16, 2015 /
 
Ha egy külső ellenállással felhúzom akkor tápon lesz a láb, viszont érdekes módon ilyenkor is stabil L szintet olvas be a lábról.
A láb természetesen bemenet, azért szeretném felhúzni. Egy nyomógomb van rajta a föld felé.
A hozzászólás módosítva: Aug 16, 2015
(#) potyo válasza Attila86 hozzászólására (») Aug 16, 2015 /
 
Tipikus viselkedés, ha valami analóg funkció engedélyezve maradt a lábon. Ezeket nézd meg, mi van rajta, és hogy azok le vannak-e tiltva. Digitális perifériák nem szoktak engedélyezve lenni, azokat nézném utolsónak.
(#) Attila86 válasza potyo hozzászólására (») Aug 16, 2015 /
 
A lábhoz ez van írva:
Idézet:
„C1IN1-/SDI2/PMA4/RPI119/RG7”

Azaz az 1-es komparátor bemenete, az SPI2 bemenete, és a párhuzamos port egyik bitje van rá kötve.
A komparátor lekapcsolva, mert a CM1CON regiszter CON bitje 0.
Az SPI2 lekapcsolva: SPI2STAT regiszter SPIEN bitje 0.
És a párhuzamos port is lekapcsolva: PMCON PMPEN bitje szintén 0.
A panelon nincs zárlat a láb körül a föld felé, sem máshova. Tönkre nem mehetett a PIC lába mert soha nem kapcsolódhatott oda feszültség sehonnan, hiszen csak egy szimpla nyomógomb van rajta a föld felé. Az errata nem ír hibát ezzel a lábbal kapcsolatosan. Érdekes...
(#) potyo válasza Attila86 hozzászólására (») Aug 16, 2015 /
 
ANSELGbits.ANSG7 bitet megpróbálnám még nullába rakni.
(#) matheattila válasza Attila86 hozzászólására (») Aug 16, 2015 /
 
Mivel ellenőrzöd azt, hogy milyen szintet olvas be (LED változtatással, LCD kijelzéssel, debugger-el)?
Az adott pin-el kapcsolatos regiszterek (4-67 táblázat): TRISG, PORTG, LATG, CNENG, CNPUG, CNPDG és ANSELG.
Alapértelmezetten analog bemenetként van konfigurálva (adatlap 11.2 fejezete) ezért ha te digitális bemenetként akarod használni akkor az ANSELG.ANSG7-et 0-ba kell állítani
Következő: »»   1197 / 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