Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   73 / 153
(#) Bell válasza Bell hozzászólására (») Ápr 30, 2013 /
 
Szia El_Pinyo!
Ezeket a konfigurációs biteket szeretném részletesen megismerni, mert lépten-nyomon elakadok. (Az INT0-al nem boldogulok, pedig úgy tűnik be vannak állítva a szükséges értékek.)
Tudsz javasolni valamilyen irodalmat ehhez?
(#) El_Pinyo válasza Bell hozzászólására (») Ápr 30, 2013 /
 
Kötelező olvasmány minden esetben az adott PIC adatlapja. Enélkül az ember csak sötétben tapogatózik. Tudom, hogy külföldiül van, meg kényelmetlen, hosszú stb. de nélkülözhetetlen a programozás során. Egyébként ez is olyan, hogy az ember minél többet olvas ilyesmiket, annál könnyebben megy. Ezen kívül nagyon ajánlott a felhasznált compiler útmutatóját is nézegetni. Ezen kívül például van icserny fórumtársunknak is több weboldala, ahol nagyon részletesen és magyarul mutatja be az ismeretanyagot (18-as és 24-s szériákhoz). A fórumon több PIC-es témában is rendszeresen linkelve van, érdemes egy kicsit keresgélni.
(#) Bell válasza El_Pinyo hozzászólására (») Ápr 30, 2013 /
 
Igen, ezzel tisztában vagyok, töviről-hegyire elolvastam, amit az adatlapon írtak és amiket találtam. De pl. az előbbi SOSCSRC_DIG- ről sehol sem találtam részleteket, vagy olyasmit, hogy ennek milyen hatása van a bemenetekre.
(A PIC24f16KA102-nél sem a bemenettel, sem a megszakítással nem volt gondom ugyanilyen konfigurációnál.)
(#) El_Pinyo válasza Bell hozzászólására (») Ápr 30, 2013 / 1
 
Én is az adatlapot néztem, csak ezek szerint valamivel hatékonyabban Nyilván némi rutin már van mögöttem is, de ezt a kellő mennyiségű idő és befektetett energia hozza meg. Végső soron itt a fórumon is felteheted a kérdésedet, sok segítőkész tagja van a HE-nek, akik készek segíteni. Egyébként az SOSCRC_DIG a kontrollered .h header fájljának végén található, ahol a konfigurációs szavakhoz tartozó define-ok vannak.
(#) Bell válasza El_Pinyo hozzászólására (») Ápr 30, 2013 /
 
A *.h fájlok nálam valamelyest helyreteszik a dolgokat, így nélkülük nem is kezdek programot írni .
(#) Bell hozzászólása Ápr 30, 2013 /
 
Köszönöm a biztatást, akkor még egy kérdés, megszakítással kapcsolatban és alszom.
RB15-ön felhúzó ellenállás, föld felé nyomógomb, RB8-on LED, soros ellenállás a föld felé.
Eredmény: futtatás után a LED világít, sosem kapcsol ki, a nyomógomb hatástalan.
Mi lehet a hiba? Köszönet!
  1. #include "p24f04kl100.h"
  2.         _FOSCSEL( FNOSC_FRCDIV & IESO_OFF & SOSCSRC_DIG);
  3.         _FOSC (OSCIOFNC_OFF & POSCMOD_EC);
  4.         _FWDT (FWDTEN_OFF);
  5.         _FICD(ICS_PGx2);
  6.  
  7. #define LED LATBbits.LATB8
  8.  
  9. int main(void)
  10. {
  11.         TRISB = 0b1111110011111111;
  12.         LATB = 0xF000;
  13.         TRISA = 0b11111111111111111111;
  14.         LATA = 0x0000;
  15.         IntInit();
  16.  
  17.    IFS0bits.INT0IF = 1;  
  18.         while(1)
  19.         {
  20.         }
  21. }
  22.  
  23. void IntInit(void);
  24. void IntInit(void)
  25. {
  26.         INTCON2 = 0x0000;
  27.         _INT0IF = 0;
  28.         _INT0IP0 = 1;
  29.         _INT0IE = 1;
  30. }
  31.  
  32. void __attribute__((__interrupt__, auto_psv)) _INT0Interrupt(void);
  33. void __attribute__((__interrupt__, auto_psv)) _INT0Interrupt(void)
  34. {
  35.         LED = ~LED;
  36.         IFS0bits.INT0IF = 0;
  37. }
(#) El_Pinyo válasza Bell hozzászólására (») Máj 1, 2013 / 1
 
Az inicializálós résznél szerintem hiányzik még az RB15 digitális bemenetté konfigurálása. Ezt az ANSB regiszter ANSB15 bitjével lehet megtenni. Alapvetően az analóg bemenetként is működtethető lábak reset-nél mindig analóg módban indulnak, ezért kell átállítani őket.
Pl.:
  1. ANSBbits.ANSB15 = 0;
  2. //vagy
  3. _ANSB15 = 0;

Még egy megjegyzés: A függvények deklarációjának mindig az első hívás előtt kell szerepelniük, tehát célszerűen még a main fölé helyezendők. Az interrupt függvényt nem muszáj deklarálni, mert explicit módon nem hívjuk őket.
(#) Bell válasza El_Pinyo hozzászólására (») Máj 1, 2013 /
 
A PIC24F04KL100 talán a legkisebb, legegyszerűbb és legolcsóbb tagja ennek az áramkörcsaládnak és nincs benne A/D konverter.
Arra gondoltam, talán az MPLAB +C30 nem jól kezeli ezt a típust, mert amiket eddig próbáltam, a PIC24f16KA102-n gond nélkül lefutottak. Kevesen használják szerintem, így nincs sok infó hozzá. A szimulátoron például nem működik a TIMER2, de a valóságban igen.
A megjegyzés jogos, köszönöm, nem kényszerültem még a kijavítására.
(#) El_Pinyo válasza Bell hozzászólására (») Máj 1, 2013 / 1
 
Tudom, hogy nincs rajta AD konverter, de a port attól még működhet analóg módon, legalábbis az adatlap nem említi, hogy nem kell foglalkozni a kikapcsolásával. Kipróbáltad úgy is, hogy digitálissá állítod a portlábat?
Gyanítom, hogy a külső interrupt jól van konfigurálva, mert alaphelyzetben 0 a kimeneti láb, majd az init végén kikényszeríted az INT0 megszakítást, így belép az IT rutinba, ami felkapcsolja a LED-et. Azt még érdemes figyelembe venni, hogy a nyomógomb mechanikailag pereg, emiatt több megszakítás is bejöhet a gombnyomás során.
Ha van debuggered, akkor egy töréponttal az IT rutinban megbizonyosodhatsz róla, hogy beesik a megszakítás, vagy nem.
A szimulátorról meg annyit, hogy nem minden eszköz támogatottsága teljes körű. Az installált .\MPLAB IDE\Readmes\Device Support.htm tartalmaz egy táblázatot, ha a felhasznált PIC sora és a SIM oszlop által kijelölt cella sárga, akkor a támogatottság beta szintű, nem kiforrott.
(#) Bell válasza El_Pinyo hozzászólására (») Máj 1, 2013 /
 
A header fájban nincs ANS* és persze nem is ismeri fel. Másik típusnál egyértelmű a prell, de 10 gomnyomásból 3-7 hatásos.
A szimulátor sajnos tényleg nem teljeskörűen támogatott, viszont találtam egy problémát: ha újra aktiválom a megszakítást, nem alszik el a led.
Ezek szerint a megszakítással van gond, ott akad ki.
PicKit3 a programozó, azon biztos lehet debuggolni, utánajárok, mert nem csináltam még ilyet.
(#) _vl_ válasza Bell hozzászólására (») Máj 1, 2013 / 1
 
Idézet:
„A PIC24F04KL100 talán a legkisebb, legegyszerűbb és legolcsóbb tagja ennek az áramkörcsaládnak és nincs benne A/D konverter.”

A/D konverter nincs benne, de analóg funkciók (pl. komparátor) vannak benne. Erre van az ANSA és az ANSB regiszter. Az adatlapban benne is vannak, az is ott van, hogy melyik modellben melyik bitjeik működnek.
A legtöbb PIC-ben van valami analóg funkció, ezért valamilyen néven van bennük analog select regiszter, ami resetnél mindig analóg állásban indul el. Ha úgy általában nem használsz analóg funkciókat, akkor érdemes lehet a programjaidat mindig úgy kezdeni, hogy mindegyik ilyen regisztert kinullázod. Esetleg amelyik lábat analógnak akarod használni, oda raksz explicite egyest.
(#) _vl_ válasza Bell hozzászólására (») Máj 1, 2013 / 1
 
Idézet:
„A header fájban nincs ANS* és persze nem is ismeri fel.”

Akkor valami nem kóser. Esetleg frissebb fordítót kéne nézni.
Nálam (XC16 v1.11 van telepítve), ezek vannak a p24F04KL100.h-ban:
ANSA, ANSB
ANSELA, ANSELB (ezek gondolom ugyanazok, mint az előzőek, csak másik néven)
ill. ugyenezek bitre lebontva.
A hozzászólás módosítva: Máj 1, 2013
(#) El_Pinyo válasza Bell hozzászólására (») Máj 1, 2013 / 1
 
Idézet:
„A header fájban nincs ANS* és persze nem is ismeri fel.”

Én onnan másoltam ki! Véletlenül nem írtad el?
(#) Bell hozzászólása Máj 1, 2013 /
 
Kedves El_pinyo és _vl_!
Leszedtem a C30-at, amit februárban telepítettem. A szóban forgó IC header fájlja 2011. évi volt és nem volt benne semmi, ami az "ANS" karaktersort tartalmazta.
Feltettem az XC16-ot és ezzel minden működik.
NAGYON köszönöm a segítséget és elnézést a tökéletlenkedésért!
(#) El_Pinyo válasza Bell hozzászólására (») Máj 1, 2013 /
 
Nálam C30 3.31-es verzió van telepítve, abban is megtalálható. Korábban valamelyik PIC-es témában olvastam, hogy az XC jelű újabb Microchip C fordítók indokolatlanul nagy méretű kódokat fordítanak. Nem biztos, hogy érdemes erőltetni a használatát, amíg még van alternatíva.
(#) _vl_ válasza El_Pinyo hozzászólására (») Máj 1, 2013 /
 
Leningrádban Volvókat osztogatnak...
Az egyező név ellenére a különféle XC fordítók teljesen más háttérrel rendelkeznek.
Mind az XC16, mind az XC32 megegyezik a Microchip elődökkel (C30 és C32, csak újabb verzió), mivel mindegyik tulajdonképpen egy open-source GCC (ha valaki nagyon elszánt, ott van fönt a forrás a Microchip oldalán, meg lehet próbálni lefordítani).
A probléma az XC8 körül van, mivel 8-bites fordítóból a Microchipnek több is volt, és ezeket egybegyúrták, valamelyik "ős" adottságait örökölte az új XC8. Pl. a 16F és a 18F CPU-k kódja más-más elődből jött. Ezért itt előfordulhat, hogy ha valaki nem az előd fordítót használta korábban, akkor az XC8-ra áttérésnél pórul jár. (Meg ne kérdezzétek tőlem, hogy melyik melyikből jött.)
(#) Hp41C válasza _vl_ hozzászólására (») Máj 1, 2013 /
 
A 16F -ekre való HiTech C -t vásárolta meg a Microchip és a saját C18 -ával gyúrta össze XC8 -nak.
(#) El_Pinyo válasza _vl_ hozzászólására (») Máj 1, 2013 /
 
Nem kétlem, hogy igazad van! Sosem végeztem összehasonlítást, csak rémlett, hogy olvastam a problémát. Ezek szerint csak az XC8-t érinti. Elnézést a téves információért.
(#) Bell válasza El_Pinyo hozzászólására (») Máj 1, 2013 /
 
Februárban a 3.0-ásat tettem fel, de csak mostanában került sor a használatra. Olyat szerettem volna, ahol típuscsaládonként nem kell minden fordító filozófiáját és persze nyűgjeit megszokni. Talán az XC tudja majd ezt.
(#) icserny válasza Bell hozzászólására (») Máj 2, 2013 /
 
Idézet:
„Olyat szerettem volna, ahol típuscsaládonként nem kell minden fordító filozófiáját és persze nyűgjeit megszokni.”
Ez nem annyira a fordítón múlik, hanem inkább azon, hogy a Microchip hogyan hányja össze a fejléc állományokat (pl. mit nevez át, mit hagy ki belőle), vagy az adatlapokban milyen copy-paste eredetű bugyutaságok maradnak benn.
(#) bocios hozzászólása Máj 2, 2013 /
 
Sziasztok!

Folytatom az első SPI kommunikációs program írását, sajnos még nem sikerült működésre bírni.
A környezet még mindig: pic24hj128gp504, mplab 8, c30 compiler
Az spi-t pps-el hajtom meg, arra van kötve a hardwaren.
A kód:
PPS-init:
  1. PPSUnLock;
  2.         PPSInput(PPS_SDI1,PPS_RP9);                  //SDI - RP9         IN
  3.         PPSOutput(OUT_FN_PPS_SDO1,OUT_PIN_PPS_RP22); //SDO - RP22        OUT
  4.         PPSOutput(OUT_FN_PPS_SCK1,OUT_PIN_PPS_RP23); //Spi Clock - RP23  OUT  
  5.         PPSOutput(OUT_FN_PPS_SS1,OUT_PIN_PPS_RP21);  //CS_SD - RP21      OUT
  6.         PPSInput(PPS_SS1,PPS_RP21);
  7.         PPSLock;


Utána semmi különös, egy FSInit() hívás van.

Az SD-SPI.c -ben módosítottam az SPI beállításokat a következőre:
  1. #define SPICON1                         SPI1CON1
  2. #define SPICON1bits                     SPI1CON1bits
  3. #define SPI1CON             SPI1CON  
  4. #define SPISTAT             SPI1STAT  
  5. #define SPIBUF              SPI1BUF
  6. #define SPISTAT_RBF         SPI1STATbits.SPIRBF  
  7. #define SPI1CONbits         SPI1CONbits
  8. #define SPISTATbits         SPI1STATbits
  9. #define SPIENABLE           SPI1CON1bits.CKE
  10. #define SPIBRG              SPI1BRG
  11. #define SPICLOCK                        TRISCbits.TRISC7
  12. #define SPIIN                           TRISBbits.TRISB9
  13. #define SPIOUT                          TRISCbits.TRISC6
  14.  
  15. //chip-detect
  16. #define SD_CD                           0
  17. #define SD_CD_TRIS                      TRISCbits.TRISC5
  18.  
  19. //chip-select
  20. #define SD_CS                       LATCbits.LATC5
  21. #define SD_CS_TRIS                      TRISCbits.TRISC5  
  22.  
  23. //write protect
  24. #define SD_WE                           0
  25. #define SD_WE_TRIS                      TRISAbits.TRISA1


Ezzel kapcsolatban néhány kérdés:
Mi a különbség a Chip-Detect és a Chip-Select között?
Honnan tudom, hogy mi kell az én hardwaremhez?
A write-protect remélhetőleg a 0-val ki van kapcsolva, azaz nem törődik vele.
Egyszerűen írni szeretnék az sd kártyára.

  1. #define USE_SD_INTERFACE_WITH_SPI
  2. #define ALLOW_WRITES
  3. #define SUPPORT_FAT32


Ezt pedig abba a header fájlba tettem, ahová az #include "fsio.h" -t is.

Debugolva a hardware-t arra jutottam, hogy az fsinit hívás, eljut az sd-spi.c -ben található
BYTE MDD_SDSPI_ReadMedia(void) függvényig, ahol van egy else ág:
  1. SPIBUF = 0xFF;                              //Data Out - Logic ones
  2.     while(!SPISTAT_RBF);                     //Wait until cycle complete
  3.     return(SPIBUF);                             //Return with byte read


A while ciklus itt sosem ér véget.
A kérdés, hogy merre nézelődjet mi lehet a gond?
Beállítás nem oké, gondolom én csak már nincs több ötletem.

Köszönöm!
(#) icserny válasza bocios hozzászólására (») Máj 2, 2013 /
 
Idézet:
„Az spi-t pps-el hajtom meg, arra van kötve a hardwaren.”
Mát megbocsáss, de ez szamárság. A PPS függvényekkel csak azt állítod be, hogy melyik lábra mi menjen (Peripheral Pin Remapping). Mint amikor a régi telfonközpontokban a kisasszonyok átdugdosták az összekötő vezetéket az állomások összekapcsolásához.

Nem látom azonban az SPI1 modul engedélyezését és konfigurálását (órajel, üzemmód, stb). Ha a Microchip gyári könyvtári függvényeit használod, akkor ez egy OpenSP1() hívás, ami beállítja SPI1CON1, SPI1CON2 (ha van...) és az SPI1STAT regisztereket.
(#) bocios válasza icserny hozzászólására (») Máj 2, 2013 /
 
Hát igen ez a megfogalmazás nem volt túl konkrét, bocs

Ezt az engedélyezés dolgot én külön sehol sem csináltam.
Letöltöttem a Microchip SD Library -t és egy pdf-et is a Microchip-től.
Ebben le van írva, hogy a projectet miként konfiguráljam és még pár dolog, amit végig csináltam. Majd van egy példakód ami hívja az FSInit()-et, után olvas és ír.
Egyelőre én az FSInit()-et próbálom csak ki, szeretném látni, hogy legalább az működik.

Tehát igen, a Microchip függvényeit használnom. A FSInit függvényben van egy MDD_InitiO hívás ami az SD-SPI.c-ben található MDD_SDSPI_InitIO -ban ezt a pár sort futtatja le:
  1. // Turn off the card
  2.     SD_CD_TRIS = INPUT;            //Card Detect - input
  3.     SD_CS = 1;                     //Initialize Chip Select line
  4.     SD_CS_TRIS = OUTPUT;           //Card Select - output
  5.     SD_WE_TRIS = INPUT;            //Write Protect - input


Ez után egy feltétel:
  1. if(DISKmount(&gDiskData) == CE_GOOD)


A DISKmount fv. hív oda, ahol a while ciklus már nem válaszol.
Megtaláltam azt a részt is amit Te mondtál. Az InitSpiSlow függvény hívja majd meg, de nem az OpenSPI -t hanem az OpenSPIM függvényt, ahol ezeket csinálja:
  1. #elif defined __C30__ //must be PIC24 or dsPIC device
  2.         SPICON1 = 0x0000;              // power on state
  3.         SPICON1 |= sync_mode;          // select serial mode
  4.         SPICON1bits.CKP = 1;
  5.         SPICON1bits.CKE = 0;


majd utána

  1. SPICLOCK = 0;
  2.     SPIOUT = 0;                  // define SDO1 as output (master or slave)
  3.     SPIIN = 1;                  // define SDI1 as input (master or slave)
  4.     SPIENABLE = 1;             // enable synchronous serial port


Tehát akkor elvileg ez megcsinálta, hogy az SPI modult inicializálta?
(#) icserny válasza bocios hozzászólására (») Máj 2, 2013 / 1
 
Én ezeket az elnevezéseket és átnevezéseket nem bírom követni, de úgy látom, te sem, mert a korábbi hozzászólásodban szereplő
  1. #define SPIENABLE           SPI1CON1bits.CKE
sor aligha alkalmas arra, amit szeretnél. Ráadásul nem látom sehol a master mód beállítását (SPI1COn1bits.MASTEN) és az SPI1STATbits.SPIEN bitjének '1'-be állítását. Szerintem ez utóbbira kellene definiálnod az SPIENABLE makrót, nemde?
  1. #define SPIENABLE    SPI1STATbits.SPIEN


Az SPICON1 = 0x0000; sort is át kellene gondolni, annak függvényében, hogy milyen adatsebességet akarsz beállítani. Ha maximális órajelen jár a mikrovezérlő (Fosc = 80 MHz, Fcy= 40 MHz), akkor legalább egy 1:4-es leosztás kell. A mostani 1:8 x 1:64 = 1: 512-es leosztás már enyhe túlzás.
(#) bocios válasza icserny hozzászólására (») Máj 2, 2013 /
 
Köszönöm, megpróbálkozom ezekkel amit írtál.
Megnéztem az említett while ciklus -nál mi van az SPI1CON1 regiszterben és hát eléggé fura igen.. Összehasonlítva a PIC adatlapjával nem azok a bit-ek vannak beállítva amivel engedélyezni lehetne a modult! Még van mit konfigurálnom akkor.
A leosztásnál arra gondolsz, hogy bit 4-2 "SPRE" értékét állítsam át igaz?
(#) icserny válasza bocios hozzászólására (») Máj 2, 2013 / 1
 
Leosztás beállítása: SPRE vagy PPRE bitek. Van olyan leosztási arány, ami kétféle módon is beállítható (pl. 1:4 osztás, 1:8 osztás, 1:32 osztás). Lásd itt, a 4. táblázatban!
(#) bocios válasza icserny hozzászólására (») Máj 2, 2013 /
 
Értem, köszi. Remélem így már továbbjutok.
(#) Bell hozzászólása Máj 12, 2013 /
 
Sziasztok!
Az UART-al ismerkedem és két kérdésem van:
1: hogyan tudom a kiküldött adatokat a szimulátor ablakban megjeleníteni, mert ezt az üzenetet kapom: UART-W0005: Uart is enabled but no output destination has been assigned. (File or Output Window)
2: hogyan lehetséges ugyanezt a printf -el megcsinálni? A printf és hasonlók nem használható. (Object és library fájlok nincsenek a projekthez adva)

Köszönet!

  1. #include <p24f04kl100.h>
  2. #include <libpic30.h>
  3. #include <stdio.h> /* for putc, EOF, stdout */
  4. #include <uart.h>
  5. _FOSCSEL(FNOSC_FRCPLL & IESO_OFF); // Fast RC Oscillator With Postscaler (FRCDIV)
  6. _FOSC (OSCIOFNC_OFF); // OSCO Pin Has Clock Out Function (CLKO), External clock
  7. _FWDT (FWDTEN_OFF); // WDT off
  8.  
  9. void UART1Init(int BAUDRATEREG1);
  10. void UART1PutChar(char Ch);
  11.  
  12. unsigned char HelloString[]={"Helló Világ!"};
  13. int *sptr;
  14.  
  15. int main(void)
  16. {
  17.         OSCCON  =       0; //0x22C0;     //select Primary Oscillator, External XL
  18.         OSCCONbits.COSC=6;
  19.         CLKDIV  =       0x0000;  //do not divide //Set up I/O Port
  20.         CLKDIVbits.RCDIV=0;
  21.         TRISB = 0b1011110011111111;
  22.         LATB = 0x0000;
  23.         UART1Init(3000);
  24. //printf("%3c", 'a');      *** ez itt nem működik ***
  25.         sptr=&HelloString;
  26.         while(*sptr !=0)
  27.                 {
  28.                 UART1PutChar(*sptr);
  29.                 sptr++;
  30.                 }
  31.         while(1);
  32. }
  33.  
  34. void UART1Init(int BAUDRATEREG1)
  35. {
  36.         U1BRG = BAUDRATEREG1;   //set baud speed
  37.         U1MODE  =       0x8003;  //turn on module
  38.         U1STA   =       0x8400;  //set interrupts
  39.         IFS0bits.U1RXIF = 0;
  40. }
  41.  
  42. void UART1PutChar(char Ch)
  43. {
  44.         while(U1STAbits.UTXBF == 1);
  45.         U1TXREG = Ch;
  46. }
(#) Bell válasza Bell hozzászólására (») Máj 12, 2013 /
 
A szimulátor működik, a Debugger -> Settings menűben lehetett beállítani...
(#) AZoli hozzászólása Máj 12, 2013 /
 
Sziasztok!

Itt volt arról szó, hogy miként lehet változót adott memória címre tenni, de struktúrák és unionokkal nem boldogulok, akár változót, akár konstanst akarok definiálni. Hiba nélkül lefordul, csak éppen nem a kívánt helyre kerülnek. Mit kéne másképp csinálni?
Következő: »»   73 / 153
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