Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   74 / 153
(#) Bell válasza Bell hozzászólására (») Máj 12, 2013 /
 
Azt hiszem printf("%s",sptr); a megoldás, de ez a tok kicsi a feladathoz.
(#) Bell válasza AZoli hozzászólására (») Máj 12, 2013 /
 
Nem a láthatósággal van baj?
  1. int __attribute__((space(psv),address(0x1600))) buf1[15]={9,8,7,6,5};
(#) Bell válasza AZoli hozzászólására (») Máj 13, 2013 / 1
 
Persze a ROM csak konstanst tartalmazhat:
  1. typedef struct tagREG {
  2.   unsigned bit0:1;
  3.   unsigned bit1:1;
  4.   unsigned bit2:1;
  5.   unsigned bit3:1;
  6.   unsigned bit4:1;
  7.   double long f1;
  8.   } REG;
  9. const REG __attribute__((address(0x900))) buf1={0,1,0,1,0,3.1415926};
(#) AZoli válasza Bell hozzászólására (») Máj 13, 2013 /
 
Köszi, sikerült, rossz helyen volt az __attribute__ ... de simán engedte úgy is lefordítani.
(#) watt válasza Bell hozzászólására (») Máj 13, 2013 /
 
Szia!
Neked sikerült lekezelni C18-ban a double long-ot? Nekem csak long méretű (4bájt) változót hajlandó kreálni akkor is, ha a double-t eléteszem. Esetleg valami beállítás kell hozzá? Lefordulni lefordul...
(#) _vl_ válasza watt hozzászólására (») Máj 13, 2013 /
 
A "double", az egy lebegőpontos típus. Szerintem nem azt keresed, hanem a "long long" nevűt. Hogy a C18 tud-e ilyet, azt nem tudom.
(#) potyo válasza _vl_ hozzászólására (») Máj 13, 2013 /
 
Létezik long double is, de tudtommal azt sem ismeri a C18, mint ahogy a long long-ot sem.
(#) watt válasza _vl_ hozzászólására (») Máj 13, 2013 /
 
Igen, kevertem, köszi! De ahogy potyo írja nem ismeri. Könnyű megnézni a watch ablakban hogy hány bájtot foglal, sajnos max a 4 bájtos vátozókat kezeli, legyen az lebegő, vagy sem. A gond, hogy lefordítja hiba nélkül...
Nem mélyedtem bele, de nem lehetne erre lib-et készíteni?
A hozzászólás módosítva: Máj 13, 2013
(#) _vl_ válasza watt hozzászólására (») Máj 13, 2013 /
 
Nyilván lehet, a kérdés, hogy van-e sok értelme egy 8-bites mikrokontrolleren 8-byte-os számokat kezelni. Persze a dolog nagy mértékben függ az elvégzendő műveletektől is, meg hogy mennyire fáj, ha ezek lassúak lesznek.
(#) watt válasza _vl_ hozzászólására (») Máj 13, 2013 /
 
Igazad van. Akkor okoz gondot a 4bájt korlát, ha nem fér bele egy szám, és felbontáscsökkenést okoz, vagy egyéb kerekítési, túlcsordulási problémát. Elég hamar szűk lehet a 4bájt, ha pascalban, kelvinben kell számolgatni...
A hozzászólás módosítva: Máj 13, 2013
(#) Llajti válasza watt hozzászólására (») Máj 13, 2013 /
 
Én azt szoktam csinálni, hogy elosztom, számolok, majd megszorzom pár digittel, nagyságrenddel. Persze ez okoz némi pontatlanságot, de nekem eddig belefért. Ha ez nálad valami miatt nem kivitelezhető és mindenképp szükséged van a nagy tartományra, akkor a 32 bites (pl. CORTEX-M0 magos) mcu-k környékén érdemes szétnézned, mert azokhoz általában van olyan fordító, ami kezeli a 64 bites változókat.
A hozzászólás módosítva: Máj 13, 2013
(#) watt válasza Llajti hozzászólására (») Máj 13, 2013 /
 
Szia! Én is ezt csinálom, megoldható vele. Egyébként már a PIC24-től van 64bites lebegő és egész típus is a C-ben.
(#) potyo válasza watt hozzászólására (») Máj 13, 2013 /
 
Lehet onnan kellene kilesni a libraryből a kódjukat, hátha le lehetne fordítani 8 bitesre is.
(#) _vl_ válasza watt hozzászólására (») Máj 13, 2013 /
 
A 16-bites PIC-ek nekem árazásilag nem jönnek be. Ha már csere, akkor vagy PIC32, vagy valami Cortex M0 (pl. a Chipcad által forgalmazott Nuvotonok igen jó árban vannak).
(#) Bell válasza watt hozzászólására (») Máj 13, 2013 /
 
A C18 ról ezen a helyen (Bővebben: Link) azt írják, hogy nem ismeri, csak a 32 bites float és double típusokat. Én az XC16 ot használom a PIC24F-ekhez, de gondolom az XC8 is hasonló. Érdemes megnézni az újabb fordítókat, és a 16, 32 bites PIC-eket.
(#) Bell hozzászólása Máj 13, 2013 /
 
Keresek egy nagyon egyszerű C nyelvű programot egy ilyen modul (Bővebben: Link) felprogramozásához.
(#) watt válasza potyo hozzászólására (») Máj 13, 2013 /
 
Igazából nem okoz nagy gondot, ha igen, PIC-et cserélek.
Emellett, sok esetben hócipőm tele van a gyári rutinokkal, nem bírom, mikor egy putcUSART1 függvény elágazásokat meg felesleges vizsgálatokat végez, eleve ennek külön függvényhívást szentelni a drága időből, ráadásul sokszor, miután ezt használjuk a legtöbbet... Inkább úgy csinálom, mint ha asm lenne (TXREG1=a; )
(#) watt válasza Bell hozzászólására (») Máj 13, 2013 / 1
 
Ha jól látom ez egy SPI portos WIFI illesztő. Nincs mit felprogramozni rajta(talán néhány belső regiszter beállítása), csak tolni kell bele az adatokat és fogadni, ami jön.
Ezt nézd meg, van letölthető példakód több platformra.
A hozzászólás módosítva: Máj 13, 2013
(#) icserny válasza Bell hozzászólására (») Máj 13, 2013 / 1
 
A Sparkfun oldalán van PIC mintapélda, de Google barátod biztosan mutat többet is. Egyébként a gyári adatlap a kiindulási adat, az SPI kommunikáció pedig akár szoftveresen (bit bang), akár hardveresen egyszerű feladat.
(#) Bell hozzászólása Máj 13, 2013 /
 
Kedves watt és icserny!
Köszönöm!
Nézegettem már néhány dolgot, de ezeket még nem. Szerettem volna elkerülni, hogy bit szinten megismerjem a modul működését és ahány program, annyi fordítót használjak, de úgy tűnik, mindez elkerülhetetlen. XC16-al, PIC24F-el szeretném megcsinálni. Azt hiszem az adatlap és az SPI lelki világa a kiindulópont.
(#) watt válasza Bell hozzászólására (») Máj 13, 2013 /
 
Nem nagy ügy, meglátod...
(#) icserny válasza Bell hozzászólására (») Máj 13, 2013 /
 
Itt találsz dspic-re írt prgramot is. De azt ne várd, hogy sültgalambok röpködjenek! Az adatlapot nem fogod megúszni...
(#) Bell válasza icserny hozzászólására (») Máj 14, 2013 /
 
A sült galambot csak úgy szeretem, ahogyan én készítem
Tehát nekem nem valami kész holmi kell, mert én nem lopni akarok. A nyelvvel és az eszközzel is most ismerkedem, ezért az adatlapon tűrhetően leírtak fizikai reprezentációját szeretném valamilyen programnyelven megfogalmazva látni.
Az adatlapokkal többnyire nincs gondom, csak a szegényes, silány változatokkal.
A hozzászólás módosítva: Máj 14, 2013
(#) szaffo555 hozzászólása Máj 19, 2013 /
 
C nyelvet próbálom tanulmányozni. Ehhez letöltöttem egy RTCC példa programot a a Microchiptől.
Szépen le is fordul, de 2 dolgot nem értek benne.
Miért nem látszik az MPLAB projekt ablakában az rttc.h header files? Azt gondoltam így le sem fordul, nekem kell megkeresnem. Mikor van az, hogy megtalálja magától, és mikor kell manuálisan bebrowsolni?

Másik kérdés az, hogy az rtcc.h ban az alábbi union került definiálásra:
  1. typedef union
  2. {
  3.     struct
  4.     {
  5.         BYTE    year;       // BCD codification for year, 00-99
  6.         BYTE    rsvd;       // reserved for future use
  7.         BYTE    mday;       // BCD codification for day of the month, 01-31
  8.         BYTE    mon;        // BCD codification for month, 01-12
  9.         BYTE    hour;       // BCD codification for hours, 00-24
  10.         BYTE    wday;       // BCD codification for day of the week, 00-06  
  11.         BYTE    sec;        // BCD codification for seconds, 00-59
  12.         BYTE    min;        // BCD codification for minutes, 00-59
  13.     }f;                     // field access
  14.     BYTE        b[8];       // BYTE access
  15.     UINT16      w[4];       // 16 bits access
  16.     UINT32      l[2];       // 32 bits access
  17. }rtccTimeDate;


Ebben a

Ebben a year is byte hosszúságú. Mégis, mikor a szimulátorban futtatom az rtcc.c alábbi sorát:
  1. RtccTimeDate.f.year = 09;


a watch ablakban láthatóan nem lesz a year változó a megadott értékű. Ha átírom pl. max 07 re akkor azt felveszi. Valami a BCD kóddal lehet összefüggésben, de hogyan? Csak byte típust látok. Még az sem egy lehetőség, hogy a felső byte nől egyel, mert az union b, w, l tagjaiban sem látok változást.
És csak érdekesség, hogy a fordító assemblyre a kérdéses sort
  1. 126:                  RtccTimeDate.f.year = 09;                                                         //set year
  2.   058A    6B60     CLRF 0x60, BANKED

így fordítja, tisztán zérusra állítva a regiszter tartalmát.

Mi lehet itt a magyarázat?

rtcc.c
    
(#) icserny válasza szaffo555 hozzászólására (») Máj 20, 2013 /
 
A fejléc állományokat csak azért szoktuk felvenni a projektben, hogy egy esetleges módosítás után az MPLAB tudja, hogy újra kell fordítani a projektet. A gyári fejléc állományokat viszont nem szokás babrálni (néha muszáj, különösen hibát talál bennük az ember) . A fejléc állományoknak valójában a becsatolással (include) lesz közük a projekthez. Az MPLAB akkor "találja meg" a fejléc állományt, ha az benne van a keresési útvonalban.
(#) Bell válasza szaffo555 hozzászólására (») Máj 20, 2013 /
 
Ez a BYTE típus szerintem unsigned char, amit egyszerűen BCD-ként használnak.
Az
  1. RtccTimeDate.f.year = 09;

azért nem jó, mert az oktális 9-et jelentene. Ott 7 a max.
Ha 10-es az alapértelmezett számrendszer, 2013 at így célszerű megadni
  1. RtccTimeDate.f.year = 0x13;
(#) bocios hozzászólása Máj 20, 2013 /
 
Sziasztok,

Én szöveg összefűzésében kérnék segítséget. Szintén, RTCC-ből szedem le az év,hónap,nap adatokat ezt egy char tömbbe szeretném összefűzni, majd így tovább passzolva fájlt létrehozni memóriakártyán
Láttam példát sprintf és strcat -al is, én utóbbival próbálkoztam.
Sajnos a cél tömb mérete nem akar összejönni.
2 szélsőség van:
- egyszerűen kicsi, az strcat "elszáll"
- nagy és többször kerülnek bele az adatok

  1. //RTCC
  2.                         RtccReadTimeDate(&Rtcc_read_TimeDate);
  3.                         BYTE yr  = Rtcc_read_TimeDate.f.year;
  4.                         BYTE mth = Rtcc_read_TimeDate.f.mon;
  5.                         BYTE day = Rtcc_read_TimeDate.f.mday;
  6.  
  7.                         // 1. convert to char array
  8.                         char yrarr[sizeof(yr+1)], mtharr[sizeof(mth+1)], dayarr[sizeof(day+1)];
  9.                         sprintf(yrarr,"%d",yr);
  10.                         sprintf(mtharr,"%d",mth);
  11.                         sprintf(dayarr,"%d",day);
  12.                        
  13.                         char prefix[] = "DataLogger_";
  14.                         char suffix[] = ".log";
  15.                        
  16.                         int fnamelength = sizeof(yrarr)+sizeof(mtharr)+sizeof(dayarr)+sizeof(prefix)+sizeof(suffix);
  17.  
  18.                         char fname[fnamelength+1];
  19.                         // 2. fajlnev osszerakasa: DataLogger_DATUM.log
  20.                         strcat(fname, prefix); //1.prefix
  21.                         strcat(fname, yrarr);  //2.ev
  22.                         strcat(fname, mtharr); //3.ho
  23.                         strcat(fname, dayarr); //4.nap
  24.                         strcat(fname, suffix); //5.suffix


+1 kérdés:
az így létrejött fname dinamikus tömb értékét miért nem látom MPLAB alatt?
se local se watch alatt

környezet:
pic24h128gp504, mplab 8.89, c30

Köszönöm!
(#) Lüke Aladár hozzászólása Máj 20, 2013 /
 
Sziasztok! Hogy tudok egy integet típusú változót az LCD számára megjeleníthető formátumba konvertálni?
(#) foxi63 válasza Lüke Aladár hozzászólására (») Máj 20, 2013 /
 
Szia!
ha a szám negatív ( előjelet a legfelső bit hordozza), kettes komplemensével kell dolgozni, ha pozitív, akkor csak ez:
Először átalakítod binárisan kódolt decimális számmá, (egy byte csak 0-9 ig vehet fel értéket) így kapsz belőle 5db számot (max.: 06 05 05 03 05) majd átalakítod őket ASCII karakterekké azaz mindegyikhez hozzáadsz 48-at, és mehetnek a számok az LCD-re.
üdv: Foxi
A hozzászólás módosítva: Máj 20, 2013
(#) potyo válasza Lüke Aladár hozzászólására (») Máj 20, 2013 /
 
Legegyszerűbb az itoa függvényt használni, ha elérhető. Az nagyjából ugyanazt csinálja, amit foxi63 írt.
Következő: »»   74 / 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