Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
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:
De valójában ez van benne:
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.
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.
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:
A pic32 magja egy RISC processzor (MIPS m4k), ami jellemzoen minden muveletet regisztereken vegez es azon felul van load meg store.
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:
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!
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...
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. „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” 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:
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:
Ez mindjart egyszerre tobb bitet is beallit vagy torol.
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.” 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!
Rosszul mondtam, a bit-mezőknek nincs előjelük, mindig unsigned-ek.
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.
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...
Köszi a válaszokat! Egyébként van C topic is...
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 Idézet: 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. „Egyébként van C topic is...”
Szia!
Erre gondoltam: PIC programozása C nyelven, C-Compiler Általános nincs, de ide szerintem belefér bármi, ami PIC és C.
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.
Szerintem ezzel nincs semmi gond, emiatt ne fájjon a fejed.
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.
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:
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?
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.
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?
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:
Szerintem ennyi kellene. De stabil alacsony szint van a lábon.
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?
Ha egy ellenallassal megprobalog felhuzni tapra, akkor felmegy? (Kimenet vagy bemenet a lab?)
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
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.
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...
ANSELGbits.ANSG7 bitet megpróbálnám még nullába rakni.
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 |
Bejelentkezés
Hirdetés |