Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
 
Témaindító: histu1985, idő: Feb 11, 2006
Témakörök:
Lapozás: OK   144 / 144
(#) benjami válasza tomi52 hozzászólására (») Szept 11, 2019 /
 
Azt nem írtad melyik fordítóhoz (mert eltérnek egymástól a megvalósíthatóság szempontjából).
  1. #define LED           A, 3
  2.  
  3. #define TRISBIT(p, m)         TRIS ## p ## bits.TRIS ## p ## m
  4. #define LATBIT(p, m)          LAT ## p ## bits.LAT ## p ## m
  5. #define PORTBIT(p, m)         PORT ## p ## bits.R ## p ## m
  6. #define GPIOX_MODEPININ(x)    TRISBIT(x) = 1
  7. #define GPIOX_MODEPINOUT(x)   TRISBIT(x) = 0
  8. #define GPIOX_SETBIT(x)       LATBIT(x) = 1
  9. #define GPIOX_CLRBIT(x)       LATBIT(x) = 0
  10. #define GPIOX_LATBIT(x)       LATBIT(x)
  11. #define GPIOX_GETBIT(x)       PORTBIT(x)
  12.  
  13. GPIOX_MODEPINOUT(LED); // LED = kimenet
  14. GPIOX_CLRBIT(LED); // LED = 0
  15. GPIOX_SETBIT(LED); // LED = 1
A hozzászólás módosítva: Szept 11, 2019
(#) tomi52 válasza benjami hozzászólására (») Szept 11, 2019 /
 
Köszi, kielemzem.

Amit én raktam össze, az is működik, csak paraméterként nem lehet használni. Nem tudom, az általad beírtat lehet-e?

Valóban nem írtam a környezetet, mert úgy gondoltam, a makró kérdés minden C-re vonatkozik, nem csak PIC fejlesztő környezetre.

A konfig A-Z-ig: Lenovo T400 notebook, Debian 10 oprendszer, MPLAB-X V5.25, XC32 V2.30 rátöltve a PIC32 Legacy Peripheral Libraries a PIX32MX procikhoz. De ezzel a makro szöszöléssel már régebben is próbálkoztam.
(#) benjami válasza tomi52 hozzászólására (») Szept 11, 2019 /
 
XC32-t nem használtam (és a közeljövőben jó eséllyel ne is fogom, mert áttértem ARM-re), de az XC8 és az XC16 (meg az ARM GCC is) megeszi a fenti paraméterezési módszert (az kimaradt, hogy a 13-15 sor már valamelyik függvényen belüli felhasználását mutatja). Ha a példában szereplő LED-et pl. az RA3 helyett az RC7 lábra szeretnéd kötni, csak az 1. sort kell megváltoztatni:
  1. #define LED           C, 7
(#) tomi52 válasza benjami hozzászólására (») Szept 12, 2019 /
 
Igen, ezt értem. Csak játszogattam arduinoval is, nem tudom, használtad-e, (ha nem,) ott a pinek kaptak egy-egy számot, azt paraméterként át lehet adni a konstruktornak. Az általad adott szerint persze meg tudom oldani, csak amilyen lökött vagyok, szeretném paraméterként, ahogy az arduinoban. Próbáltam visszakövetni, hogyan működik az I2C1, I2C2, de nem tudom teljesen visszakövetni. Belefutok olyan makróba? változóba? amit sehogy nem találok meg, azt nem tudom a környezet mi módon hozza létre. Sem *.h.ban, *.c-ben, *.cpp nem találom meg.
(#) cross51 válasza superuser hozzászólására (») Szept 12, 2019 / 1
 
A do while re egyszerű a válasz így nem tudod beírni feltétel vizsgálathoz.
(#) benjami válasza tomi52 hozzászólására (») Szept 12, 2019 /
 
Annyira nem foglalkoztam arduino-val, de azt tudom hogy sima számokkal lehet megadni a lábakat. Ha nagy és lassú kódot akarsz gyártani magadnak, akkor PIC-re te magad is megvalósíthatod. Amúgy táblázatban vannak a lábszámokhoz tartozó PORT és láb összerendelések (pins_arduino.h), amit a wiring_digital.c-ban levő pinMode, digitalWrite, digitalRead függvények fognak majd felhasználni.
(#) tomi52 válasza benjami hozzászólására (») Szept 12, 2019 /
 
Nem szeretnék nagy és lassú kódot, épp azért gondoltam makróra. Más módon már megoldottam, de az tényleg behozott plusz kódot, ezt szeretném elkerülni.
(#) whalaky hozzászólása Okt 15, 2019 /
 
Sziasztok!
Lehet hogy volt már kérdés, de nem találok rá választ. Hogyan lehet egy tömbben tárolni a PIC I/O lábaira való hivatkozást tömbelemként?
pl.:
  1. int tömb[4] = {LATA0, LATA1, LATB5, LATC2 };

Ha ez így menne és el tudnám érni a pineket mint tömbelem, vagyis a tömb[n] egy i/o lábnak felelne meg sokat lendítene a helyzetemen és a kód újrahasznosíthatóságán is
Nem tudok rájönni hogy mi a megoldás. (XC8 és az igazi az lenne ha egy heder fileban tudnám megoédani a tömb definiálást)
A hozzászólás módosítva: Okt 15, 2019
(#) benjami válasza whalaky hozzászólására (») Okt 15, 2019 /
 
Ez az oldal pont erről szól, olvasd el. A kérdés az, hogy lassú és nagy kódot szeretnél futásidejű láb hozzárendeléssel (mint az arduino esetén), vagy gyors kódot fordításidejű láb hozzárendeléssel (ez utóbbihoz ott példa az oldal tetején, de így nem tudod tömbbe tenni, hanem #define -t kell használni az összerendeléshez).
(#) whalaky válasza benjami hozzászólására (») Okt 15, 2019 /
 
Csak egy észrevétel... Az
Idézet:
„ez az oldal”
hol van?
Mos épp egy hibrid megoldás lenne az aktuális. Lehetőleg gyorsnak kéne lennie. Ha nem tudom tömbbe rakni hát egye fene megoldom define-al, csak úgy valami ronda lesz a kód. De ha nincs más.... PIC16-al közdök és a modulok ki/be menetei ragaszkodnak az adott ládhoz. Ezért gondoltam hogy leteszen egy tömbbe, és a tömb indexe átlátható és kezelhető is.
Ugyan a define sem rossz, de azt kicsit macerásabb ciklusba kezelni, agyonmakrózni meg szintén nem akartam.
Azért "azt az oldalt" közkincsé tennéd? Köszi!
(#) benjami válasza whalaky hozzászólására (») Okt 15, 2019 /
 
Az "ez az oldalra" alatt a "PIC programozása C nyelven, C-Compiler" topic 144. oldalára gondoltam (vagyis arra, ami éppen előtted van, illetve a kezdeménye visszanyúlik az előző oldalra is).
(#) whalaky válasza benjami hozzászólására (») Okt 15, 2019 /
 
BOCS!!
(#) cross51 válasza whalaky hozzászólására (») Okt 15, 2019 /
 
A C nem ad igazi lehetőséget erre.
PIC16-on ez azért mindenhogyan érdekes játék mert nem egy "erőgépről" beszélünk.

Itt a define a legjobban járható út mert azzal is tudsz dinamikus hozzárendelést csinálni csak kell egy config header ami projekt függően configurálható.
(ez C++ nem igazán járható)

A ciklus fogalma arra utal (számomra), hogy mondjuk egy párhuzamos bus szerűséget vezérlenél arra a legjobban perifériával jársz.

Pár software-es megoldás:
  1. typedef struct
  2. {
  3.         volatile uint8_t* const LAT;
  4.         const uint8_t Mask;
  5. } Pin;
  6.  
  7. Pin RA0 = { &LATA, 1 << 0 };
  8.  
  9. void PinSet(Pin* const pin)
  10. {
  11.         *pin->LAT |= pin->Mask;
  12. }
  13.  //...


  1. enum BSP_LED
  2. {
  3.         LED1 = 0,
  4.         LED2 = 1,
  5.         LED3 = 2,
  6.         //...
  7. };
  8.  
  9. volatile uint8_t* LATMap[] =
  10. {
  11.         &LATA,
  12.         &LATA,
  13.         &LATB,
  14.         // ...
  15. };
  16.  
  17. uint8_t MaskMap[] =
  18. {
  19.         1 << 0,
  20.         1 << 5,
  21.         1 << 7,
  22. };
  23.  
  24. void BSP_LedSet(BSP_LED led)
  25. {
  26.         *LATMap[led] |= MaskMap[led];
  27. }
  28. //...


  1. uint8_t RA0 = 0 << 4 | 0;
  2. uint8_t RA1 = 0 << 4 | 1;
  3. uint8_t RA2 = 0 << 4 | 2;
  4. // ...
  5. uint8_t RB0 = 1 << 4 | 0;
  6. uint8_t RB1 = 1 << 4 | 1;
  7.  
  8. void LatSet(uint8_t pin)
  9. {
  10.         volatile uint8_t* LATx = ((volatile uint8_t*)&LATA + (((pin & 0xF0) >> 4)));
  11.         *LATx |= 1 << (pin & 0x0F);
  12. }
  13. //...


Az utolsó eset persze csak akkor működik, ha a LAT register-ek címfolytonosak a memóriában.
Valamint a bank váltás is be zavarhat a képben rég forgott a kezemben 16F nem tudom, hogy ő pointerről tudja e hogy melyik bank-ban kel turkálnia.
(#) whalaky hozzászólása 11:35 /
 
Sziasztok szakértők!
Alakul a project (legalábbis vannak modulok amik működnek vagy igen igéretes) de egy "apróság" nem hagy nyugodni. Nem hiszem el hogy az XC8 (lehet hogy a többi is, eddig nem prábáltam csak a 8 bitestt) fordítóban ne lehetne valahogy eltüntetni a felesleges warningokat amik a karakter kódolás miatt vannak (kép).
Hiába állítom be a projectnej hogy ISO-8859-2 kódolású, nem érdekli.
Már felmerült bennem az is hogy az unsigned char 7 bites....
Tényleg érdekel hogy van e rá valami emberi megoldás hogy aforrás is olvasható maradjon és a fordító se dödörögjön.
Most épp az LCD-nél tartok. Szeretném az üzeneteket legalább közel helyesen megjeleníteni, de ehez saját karakterekre van szükség. Azt szeretném megoldani hogy futás időben cserélje le az ékezetes karaktereket a GGRAM-ra, de a fordító hisztis tőle (és més stringektől is amik ékezetes kaaktereket tartalmaznak).
  1. char replaceTable[] = { 'ü''ö''á''é''í''ó''ő''ú',   'ű', 0xB0  };
  2. char lcdTable[] =     { 0x5F, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

Ha beírom pl az Ű helyett hogy 0xFB azzal nincs baja a fordítónak, de ember legyenaki el tudja olvasni a forráskódot. Megcsinálni ugyan megcsinálja, de ha valahol maradt egy hiba, azt a sok warning közt nem egyszerű megtalálni, és ahogy a project fejlődik egyre csak szaporodnak a gyakorlatilag információ értékkel nem bíró warningok.
Hogyan tudnám ezt kikapcsolni? Nincs száma, csak úgy van, az összes warningot pedig nem akarom elnyomni, mert van ami sokat segít.
Osszátok meg velem az okosságot, mert nem hiszem el hogy nincs, legfeljebb tudatlan vagyok.
(#) whalaky válasza cross51 hozzászólására (») 11:40 /
 
Köszönöm! Ígéretesnek tűnik, de csak később térek rá vissza.
Következő: »»   144 / 144
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu