Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   72 / 153
(#) watt válasza zoox hozzászólására (») Ápr 7, 2013 /
 
A helpet érdemes nézegetni!
(#) zoox válasza watt hozzászólására (») Ápr 7, 2013 /
 
Sokszor szoktam a HELPET használni csak nem mindig elég beszédes(és nem is mindig müködik a minta progi ,már ha van minta).
(#) icserny válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Idézet:
„de a C-nek nagyon-nagyon sok függvénye van”
Ebben két tévedés van!
1. A CCS C nem valódi C, csak annak látszik...
2. A C nyelvenk nincs sok függvénye, csak kaptál a C fordító mellé egy programkönyvtárat, amelyt vagy használsz, vagy nem.

A függvények leírása a CCS C Referencia Kézikönyvében és a Help-ben megtalálható (mintapéldákkal). Emlékeim szerint jól használhatóan.

A C nyelv utasításai a Kernighan-Ritchie könyvben és a szabványokban megtalálhatók (a C is fejlődik, így van C90 és C99 is, utóbbi leírását lásd itt!
(#) zoox válasza icserny hozzászólására (») Ápr 7, 2013 /
 
Köszi a linket .Akkor ma is tanultam valamit a C-röl.Átnézem a C.s függvényeket és használom a
Idézet:
„programkönyvtárat”
(használom mert lusta fajta vagyok)
(#) icserny válasza zoox hozzászólására (») Ápr 7, 2013 /
 
A programkönyvtárakkal csak két baj szokott lenni:
1. Ha nem azt csinálják, amit a dokumentum szerint csinálniuk kellene (CCS C-nél nem nyilvános a forráskód, tehát legfeljebb a disassembly listából lehet kisilabizálni, hogy mit is csinál).
2. Ha azt csinálják, amit a dokumentáció szerint csinálniuk kell - ami viszont nem feltétlenül az, amire szükséged van...
(#) zoox válasza icserny hozzászólására (») Ápr 7, 2013 /
 
Na igen pont ezt érzem én is.:thumbupróbáltam már több fordítót is de egyenlőre ezzel boldogultam a legjobban.Te milyet használsz?
(#) kissi válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Az RBIF törlése asm-ben is a PORTB olvasására történik. Ha valamiért nem törlődik, akkor újra belép a megszakításba: ez asm-ül és C-ül is így van !
(#) zoox válasza kissi hozzászólására (») Ápr 7, 2013 /
 
RBIF-et ASM-be nekem kell törölni programból(bcf INTCOM,RBIF) ,ha jól emlékszem még az adatlapban is felhívják rá a figyelmet.C ben ezt nem nekem kell megtennem mert elvégzi helyettem a C függvénye de csak akkor ha kiolvasom a PORTB regisztert.Jelen pill-ban ezt tapasztalom ill _vl_ forumtárs világosított fel erről .Az alapproblémám ez volt hogy IT generálodik RB port változásakor de nem tudtam kilépni belőle.ASB-ben az IT-t jól tudtam kezelni ,de C-ben nem jól működött és ezért írtam hogy a C-ben nem ugy kell mint aASM-ben.
Remélem nem írtam sok hülyeséget.....de ez ugy is kiderül
(#) kissi válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Mind a kettő ( RBIF törlése és PORTB olvasása ) jó az adatlap szerint, hogy a CCSC mit csinál, azt nem tudom ( de ha megtenné, akkor működne! ) !
A hozzászólás módosítva: Ápr 7, 2013

PORTB_1.jpg
    
(#) _vl_ válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Akkor tisztázzuk:
- először ki kell olvasni a PORTB-ből a bit értékét, mert ehhez a kiolvasott értékhez képest méri a változást az IC, amíg a legutolsó olvasáshoz képest más az érték, addig folyamatosan generálja az interruptot (1-be állítja az RBIF-et),
- utána ki kell törölni az RBIF-et, mert az magától nem törlődik, és amíg ez 1, addig vissza fog térni az interrupt handlerbe a processzor.
Az, hogy a CCS végtelen mennyiségű beépített függvénye és egyéb okossága pontosan mikor mit is csinál meg ezekből a feladatokból helyetted, azt csak az alkotója tudja, meg jobb esetben a doksiban talán jól le van írva. Rendes C fordító használata esetén a fenti műveleteket pont ugyanúgy kell C-ben is megcsinálni, ahogy assemblyben, csak a CCS próbálja állandóan a feneked alá tolni a széket (még akkor is, amikor éppen nem szeretnéd).
(#) zoox válasza kissi hozzászólására (») Ápr 7, 2013 /
 
Ki fogom próbálni ASM-ben is a csak PORT olvasás és nem törlöm az RBIS-et.
(#) kissi válasza zoox hozzászólására (») Ápr 7, 2013 /
 
Kell törölni, nézd meg _vl_ kolléga hozzászólását ( az olvasással csak a feltétel szűnik meg, de nem fog törlődni a flag ! ) !!
(#) zoox válasza _vl_ hozzászólására (») Ápr 7, 2013 /
 
Idézet:
„kell olvasni a PORTB-ből a bit értékét, mert ehhez a kiolvasott értékhez képest méri a változást az IC”
Akkor most már teljesen értem miért nem lépett ki IT-ből
(#) icserny válasza zoox hozzászólására (») Ápr 8, 2013 /
 
Idézet:
„Próbáltam már több fordítót is de egyenlőre ezzel boldogultam a legjobban.Te milyet használsz?”
PIC18-hoz C18-at, PIC24-hez C30-at.
(#) kontár hozzászólása Ápr 12, 2013 /
 
Elakadtam .Kérem segítsen valaki. A progiba beírtam a problémámat


#include <system.h>
void main ()
{
trisc=255;
trisd=0;
portd = 0b00000000;
while (true)
{

if (portc==0)
portd=0b00000001;
else
portd=0b00001000;
if (portd==0b00001000)
break;
else
delay_s(4);
if (portc!=0b00000010)
portd=0b00001000;
if (portd==0b00001000)
break;


// ide kéne ezt a feltételt tenni
// olyan módon,hogy közbe legyen 30 sec késleltetés
//
// while(1)
// if (portc==0b00000001) ha megfelelt ennek a feltételnek akkor:
// {
// }
// else
// break;


if (portc!=0b00000010) 30 sec mulva ugorjon ide a program
portd=0b00001000;
if (portd==0b00001000)
break;
else
portd=0b00000011;
delay_s(2);
portd=0b00000111;
delay_s(3);
if (portc!=0b000011)
portd=0b00001000;
if (portd==0b00001000)
break;
else
portd=0b00000101;

while (1)
{
if (portc==0b00000011)
{
else
break;
A hozzászólás módosítva: Ápr 12, 2013
(#) watt válasza kontár hozzászólására (») Ápr 12, 2013 / 1
 
  1. cou=30secnek megfelelő lépésszám;  //szimulátorban meg lehet nézni mennyi kell.
  2. while(portc != 0b00000001) && cou-- > 0);
A hozzászólás módosítva: Ápr 12, 2013
(#) kontár válasza watt hozzászólására (») Ápr 12, 2013 /
 
Köszönöm szépen tanulmányozni fogom
(#) kontár válasza watt hozzászólására (») Ápr 12, 2013 /
 
Még nem indult be,de valószínű a while után két darab zárójel "kezdés" kell
(#) watt válasza kontár hozzászólására (») Ápr 12, 2013 /
 
Igen, azt kihagytam.
(#) kontár válasza watt hozzászólására (») Ápr 14, 2013 /
 
Köszönöm a segítséget Watt !
Összejött amit segítettél annyi változtatással,hogy a != helyett == tettem.Lehet,hogy én nem jól fogalmaztam meg a kérdést.A többit magamtól írtam segített a Kónya Kopják könyv meg a flowcode C fordítása (bár ahhoz képest az én C-m sokkal rövidebb és többet tud). A "fejléc"-en kívül a szimulátorral megy a dolog.Csak ! Még egy kérdésem lenne amire nem találtam megoldást. Tehát ahova oda írtam újra kéne indulni a programnak.Mivel az összes bemenet a portc-n van,ha úgy egyszerűbb áttehetem egy másik portra.Mert úgy valószínű nem kell bit operátor alkalmazni.És ha valaki segít előre is köszönöm

#include <system.h>
void main ()
{
trisc=255;
trisd=0;
unsigned long cou = 400000;
while (true)
{

while((portc!=0b00000100) && (portd!=0b00000000));
while (portc!=0b00000000);
portd=0b00000000;

if (portc==0)
portd=0b00000001; //ettől a ponttól kéne megoldani,egészen a program végéig
else // hogyha portc==0b00000100 lesz
portd=0b00001000; // akkor újra induljon a program ,tehát "break"
if (portd==0b00001000)
break;
else
portd=0b00000001;
delay_s(4);
if (portc!=0b00000010)
portd=0b00001000;
if (portd==0b00001000)
break;
while((portc == 0b00000010) && cou-- > 0);


if (portc!=0b00000010)
{
portd=0b00001000;
if (portd==0b00001000)
break;
}
else
portd=0b00000011;
delay_s(2);
portd=0b00000111;
delay_s(3);
if (portc!=0b00000011)
portd=0b00001000;
if (portd==0b00001000)
break;
else
portd=0b00000101;
while (portc==0b00000011);
if (portc!=0b00000011)
portd=0b00001000;
break;
}
}
(#) bocios hozzászólása Ápr 24, 2013 /
 
Sziasztok,

Kezdőként próbálom az SPI kommunikációt egy SD kártya olvasóval felépíteni.
A hardware-n egy PIC24HJ128GP504 -es mikrokontollert található és az SPI pedig RP portokra van kötve, tehát PPS -t kéne beállítanom mielőtt egyáltalán esélyem van az SPI-t használni.
Elsőre szeretnék valami írni a kártyára.

Bekötés a következőképpen néz ki az SD kártya és PIC között SPI busz:
Spi Clock: RP23
SDO: RP22
SDI: RP9
ChipSelect: RP21

Ugyanezen az SPI buszon más eszköz is csücsül.

Elsőnek írtam egy ilyet, a PPS-t szeretném ezzel beállítani:
  1. #include "pps.h"
  2.  
  3. void InitSpi() {
  4.         PPSUnLock;
  5.         PPSInput(PPS_SDI1,PPS_RP9);                  //SDI - RP9         IN
  6.         PPSOutput(OUT_FN_PPS_SDO1,OUT_PIN_PPS_RP22); //SDO - RP22        OUT
  7.         PPSOutput(OUT_FN_PPS_SCK1,OUT_PIN_PPS_RP23); //Spi Clock - RP23  IN  
  8.         PPSOutput(OUT_FN_PPS_SS1,OUT_PIN_PPS_RP21);  //Chipselect SD k. - RP21      IN
  9.         PPSLock;
  10. }


Továbbá letöltöttem a Microchip SD library-t. A projectet beállítottam, fordul is.
Azonban az SD-SPI.c állományban van valami amit nem értek.

  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.TRISC1
  12. #define SPIIN                           TRISCbits.TRISC0
  13. #define SPIOUT                          TRISCbits.TRISC2
  14. #define SD_CD                           0
  15. #define SD_CD_TRIS                      TRISAbits.TRISA1
  16. #define SD_CS                       LATAbits.LATA8
  17. #define SD_CS_TRIS                      TRISAbits.TRISA8  
  18. #define SD_WE                           PORTAbits.RA1
  19. #define SD_WE_TRIS                      TRISAbits.TRISA1


Tehát az SDI,SDO dolgokat itt külön még állítsam be a megfelelő RP -khez rendelve?
Azaz a fentebbi init függvényem még talán felesleges is?

Köszönöm!
(#) icserny válasza bocios hozzászólására (») Ápr 24, 2013 /
 
Idézet:
„Tehát az SDI,SDO dolgokat itt külön még állítsam be a megfelelő RP -khez rendelve?”
Igen, mert a PPS függvényhívásokkal csak a mikrovezérlőn belül "állítod át a váltókat" (hogy mi merre menjen), de ettől még az SD-SPI.c nem lesz konfigurálva. A két beállításnak nyilván összhangban kell állnia.
(#) bocios válasza icserny hozzászólására (») Ápr 25, 2013 /
 
Köszönöm. Sajnos azt nem értem még, hogy a TRIS helyére milyen RPxx dolgot tudnék írni?
A PPS függvényhívásoknál egyértelműen Output,Input dolgokat adtam meg, de TRIS értékeket nem. Gondolom csak keverek valamit.
De ha a SPICLOCK nekem az RP23 -on van akkor mit írok pl. ez helyére:
  1. #define SPICLOCK                        TRISCbits.TRISC1


Tudom, hogy van az RP23-hoz is struktúra, de sajnos még nem látom, hogy abból mikor mi kell. A SD-SPI.c -ben is van ahol TRIS van ahol PORT és van ahol LAT kell neki, gondolom ezekhez az RP23-hoz tartozó struktúrából is találok megfelelőt.
Egy példát megköszönnék összerendelésre.
(#) _vl_ válasza bocios hozzászólására (») Ápr 25, 2013 /
 
Ha TRIS helyére TRIS-t kell mondani.
Az RP23-hoz tartozik egy fizikai láb a chipen, amihez oda van írva egy PORT bit (egy betű meg egy szám, mondjuk RC7). Na azt kell ide beírni.
(#) bocios válasza _vl_ hozzászólására (») Ápr 25, 2013 /
 
Ahm. Na nálam ez így néz ki: RP23/CN17/RC7 (maradva az SPI CLK példánál).
Tehát mivel itt RC7 áll ezért az SD-SPI.c-ben a fenti define így nézzen ki?

  1. #define SPICLOCK                        TRISCbits.TRISC7


És akkor ennek mintájára már PORT és LAT értékeket is meg tudok adni a megfelelő RPxx értékhez.
(#) icserny válasza bocios hozzászólására (») Ápr 25, 2013 /
 
Igen.
(#) Bell hozzászólása Ápr 26, 2013 /
 
Sziasztok!
Megszakítással van gondom, de azt hiszem nem jó helyre írtam a kérdésem. Bővebben: Link
(#) Bell hozzászólása Ápr 30, 2013 /
 
Sziasztok!
NAGYON kezdő vagyok a C-ben is, a PIC24-ben is.
Egy PIC24F04KL100-al próbálkozom, de valamiért nem kezeli a bemeneteket.
Az RA4 portra van kötve egy felhúzó ellenállás, föld felé egy nyomógomb, a RB8-on egy LED soros ellenállással a földre kötve. A szintek megvannak az RA4-en, ha megnyomom a gombot.
Azt szeretném, hogy folyamatosan a nyomógomb állapota jelenjen meg a LED-en, de nem követi a bemenetet, sötét marad. Ha kiveszem a while hurokból az utasítást, akkor világít.
Hol lehet a hiba?
Köszönöm a türelmet és a a segítséget!
Fordító: v8.90 MPLAB C30
  1. #include "p24f04kl100.h"
  2. _FOSCSEL(FNOSC_FRCDIV & IESO_OFF);
  3. _FOSC (OSCIOFNC_OFF & POSCMOD_EC);
  4. _FWDT (FWDTEN_OFF);
  5.  
  6. int main(void)
  7. {
  8.    OSCCON       =       0;
  9.    OSCCONbits.COSC=6;
  10.    CLKDIV       =       0x0000;
  11.    CLKDIVbits.RCDIV=0;
  12.         TRISB = 0b1111111011111111;
  13.         LATB = 0x0100;
  14.         TRISA = 0b11111111111111111111;
  15.         LATA = 0xFFFF;
  16.         while(1)
  17.         {
  18.                 LATBbits.LATB8=PORTAbits.RA4;
  19.         }
  20. }
A hozzászólás módosítva: Ápr 30, 2013
(#) El_Pinyo válasza Bell hozzászólására (») Ápr 30, 2013 / 1
 
Szia!

Én első blikkre azt mondanám, hogy rossz az FOSCSEL konfigurációs szó.
Szerintem így jobb lenne:
  1. _FOSCSEL(FNOSC_FRCDIV & IESO_OFF & SOSCSRC_DIG);
(#) Bell válasza El_Pinyo hozzászólására (») Ápr 30, 2013 /
 
SZUPER!
Nagyon köszönöm!
Bell
Következő: »»   72 / 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