Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   135 / 153
(#) Wezuv válasza killbill hozzászólására (») Okt 5, 2016 /
 
Igen, ez egy TCP/IP, harmony "segítség". Próbálom elszeparálni, ami sikerült is, csak ezt nem értettem miért. Köszönöm a magyarázatot!
(#) cross51 válasza killbill hozzászólására (») Okt 5, 2016 /
 
De erre az xc32-ld alatt a remove unsued sections is jó (mármint a nemhasznált fv.-kre).
(#) Wezuv válasza cross51 hozzászólására (») Okt 5, 2016 /
 
Ha csak az volt bepipálva, nagy lett a kód.
(#) benjami válasza cross51 hozzászólására (») Okt 5, 2016 /
 
Az ha jól tippelek, csak azokat szedi ki, amiről a fordító is el tudja dönteni, hogy nem lesz használva. Azt, hogy másik modulból egy függvény fel lesz-e használva, arról csak a linker fog tudni, így azt kell felokosítani.
(#) Wezuv válasza benjami hozzászólására (») Okt 6, 2016 /
 
Vagy van olyan eset, ahol indokolt a programmemóriát feleslegesen foglaló kódrész? Talán akkor, ha több fejlesztő akarja egymás függvényei használni, de akkor nem a lefordított kódot küldik el. Nem tudom miért nincs ez alapértelmezésben beégetve a fordítóba...
(#) killbill válasza cross51 hozzászólására (») Okt 6, 2016 /
 
Igazabol mindkettot meg kell adni ahhoz, hogy kidobalja oket. A linker csak akkor tudja kiszedni a nem hasznalt fuggvenyeket, ha mindegyik kulon-kulon section-ben van. Kulonben nem tudna, hogy meddig tart a fuggveny.
(#) killbill válasza Wezuv hozzászólására (») Okt 6, 2016 /
 
Idézet:
„Nem tudom miért nincs ez alapértelmezésben beégetve a fordítóba...”
Azert mert nem szokas 220 kilobyte-nyi felesleges kodot irni. Minek irnal ennyi felesleges fuggvenyt? Az ilyesmit konyvtarakkal szokas megoldani, nem pedig ugy, ahogy a mikrocsip csinalja. Ennek meg az a modja, hogy minden fuggveny egy file, es a sok leforditott fuggvenyt egy konyvtarba osszerekja a konyvtaros (librarian vagy archiver, valoszinuleg: xc32-ar.exe). Ezek utan, egyreszt nem kell minden alkalommal az osszes fuggvenyt ujbol leforditani, masreszt a linker csak azokat teszi a vederedmenybe, amire a programod hivatkozik. Az osszes strcpy, strcat, sin, cos, es tarsai ilyen konyvtarbakban vannak. Igy kellett volna megcsinalniuk a tcp/ip, usb es egyeb reszeket is.
(#) benjami válasza killbill hozzászólására (») Okt 6, 2016 /
 
Az a baj a libbel, hogy majd minden chiphez külön libet kellene csinálni, mert ahány típus annyi féle periféria (azért is van ennyi #ifdef a forrásban), nem beszélve arról, hogy rengeteg dolog van, amit nekünk kell beállítani (pl. USB-nél milyen osztály, mekkora buffer stb.). Így sajnos lehetetlenség LIB-be befordítani, mert úgy járunk, mint pl. az XLCD könvtári függvényeivel, ahova bedrótozták melyik lábakhoz kell kötni a kijelzőt.
(#) Wezuv válasza killbill hozzászólására (») Okt 6, 2016 /
 
Abban egyetértünk, hogy lehetnének ügyesebbek is a microcipnél, de ha már ilyenek, akkor ez a funkció ha alapból be lenne kapcsolva, semmit nem zavarna, mert ha ügyesen írjuk a progit, akkor nem kotor bele, ha nem, akkor pont jól teszi, ha belekotor. Szóval én ez nem kapcsolnám ki és nem is fogom még a saját kódjaimnál sem. Legfeljebb kíváncsiságból mert ha nagyobbat fordít kikapcsolva, akkor béna kódot írtam, pontosabban valamit megírtam, amit nem is használok.
(#) killbill válasza benjami hozzászólására (») Okt 6, 2016 /
 
Igen, ebben lehet igazsag. Nem mindent lehet megoldani driver-ekkel. Ettol fuggetlenul, azert lehetne sokkal jobbat is csinalni. Volt szerencsem hibakat javitani mind a TCP/IP, mint az USB stack-jukben. Borzalmas nagy takolmany az egesz, se fule, se farka.
(#) killbill válasza Wezuv hozzászólására (») Okt 6, 2016 / 1
 
Ennel vannak rosszabbak is. Pl. en mindent -Wall -Werror gcc opciokkal forditok (ARM-re, AVR-re, Linuxra), ami annyit tesz, hogy minden aprosagert szol a fordito, ami nagyon hasznos. Ezt probaltam mplab alatt is annakidejen, de nem lehetett, mert a gyari mikrocsip kodban tobbszaz warning volt. Ha nem kellett a kodba mikrocsip cucc, akkor igy forditottam. Eleinte zavaro, hogy mindenert szol, aztan kiderul, hogy megeri, mert nagyon sok debuggolast lehet megsporolni vele. Persze van par dolog, amit nem hagyok neki, pl. a nem hasznalt valtozokert nem akarom, hogy szoljon, megadom -Wno-unused opciot, es mar nem is szol erte. Ha egy fuggveny static, es nem hasznalja senki, akkor a gcc magatol is kiszedi, ha be van kapcsolva az optimalizacio. Ha nem static, akkor a C fordito nem szedheti ki, mert nem tudhatja, hogy mas forrasbol fogjak-e hasznalni. Ezert es masert is erdemes a fuggvenyeket static-nak deklaralni, ha mas forrasbol nem hasznalod.
(#) Wezuv válasza killbill hozzászólására (») Okt 6, 2016 /
 
Nálam is be van kapcsolva minden hiba és figyelmeztetés, nincs is gond, ha fokozatosan felépítve készül a progi, de amikor össze kell fésülni egy ilyen stack-el, az már tud generálni jó néhány fegyelmeztetést. Erre még az is jön, hogy nem mindegy melyik fordítóval fordítom. Az v1.40 warning nélkül fordítja a TCP/IP forrást, az 1.42 már nem hagyja szó nélkül a memset és társait, mondván, nem kopatibilis. Saját forrásuk könyörgöm!
  1. memset(&sSysTmrObject, 0, sizeof(sSysTmrObject));

  1. warning: incompatible implicit declaration of built-in function 'memset' [enabled by default]

A hozzászólás módosítva: Okt 6, 2016
(#) killbill válasza Wezuv hozzászólására (») Okt 6, 2016 / 1
 
A hibauzenet lenyegeben azt jenelti, nincs prototype a memset() fuggvenyhez (implicit declaration) , azaz hianyzik az #include <string.h> a forras elejerol. Az implicit declaration az, amikor egy fuggvenyt ugy deklaralsz, hogy meghivod. Ez megengedett a C nyelvben, de nem javasolt.
(#) Wezuv válasza killbill hozzászólására (») Okt 6, 2016 /
 
Attól eltekintve, hogy látszik, vannak ilyen jellegű hiányosságaim a C nyelv ismeretében, felmerül a kérdés, a két eltérő verziójú fordító miért nem egyformán kezeli azt, ami ezek szerint alap kérdés? Valamint a microchip fejlesztők miért nem ismerik a C alapjait, vagy ha igen, miért nem mutatnak példát annak mintaszerű használatáról? A kérdés, természetesen költői...
Pótoltam a gyári forrásban a hiányokat (#include <string.h>
#include <stdio.h>), Köszi!
A hozzászólás módosítva: Okt 6, 2016
(#) Attila86 hozzászólása Okt 14, 2016 /
 
Van egy ilyen programrészletem:
  1. u16 i;
  2.     u8 *m;
  3.     m=&ProgramInfo;
  4.     for(i=0;i<sizeof(ProgramInfo);i++)  //A "ProgramInfo" struktúra beleírása az EEPROM-ba:
  5.     {
  6.         DataEEWrite(*m++,50+i);
  7.     }

A "ProgramInfo" egy struktúratömb és mellesleg így néz ki:
  1. typedef struct
  2. {
  3.     char Nev[10];
  4.     u8  Darabszam;
  5. }EgysegTipusInfo_type;
  6.  
  7. EgysegTipusInfo_type ProgramInfo[20];

A fenti ciklusban a PIC a struktúratömbböt beleírja az EEPROM-ba, annak 50. memóriacímétől kezdve. A DataEEWrite() függvény u8 típusú (unsigned char) értéket vár, az "m" nevű mutató ezért u8 típusú. A dolog szuperül működik a gyakorlatban, viszont a fordító warningot dob a "m=&ProgramInfo;" sorra:
Idézet:
„warning: assignment from incompatible pointer type”

Hogyan kellene ezt megoldani warning nélkül?
A hozzászólás módosítva: Okt 14, 2016
(#) cross51 válasza Attila86 hozzászólására (») Okt 14, 2016 /
 
Esetleg próbáld meg az m = &ProgramInfo[0]-al.
(#) killbill válasza Attila86 hozzászólására (») Okt 15, 2016 / 1
 
A "Programinfo" az "EgysegTipusInfo_type *" tipusu, amit nem toltheto be "u8 *" valtozoba. Ezert kell egy cast-olas:
  1. m = (u8 *)Programinfo;

Es nem kell az &, mert ha tombrol van szo, akkor a tomb neve siman leirva (sem [], sem &) a tomb cimet jelenti.
A hozzászólás módosítva: Okt 15, 2016
(#) killbill válasza cross51 hozzászólására (») Okt 15, 2016 /
 
Az char * lesz, ami meg mindig nem u8 *.
(#) killbill válasza killbill hozzászólására (») Okt 15, 2016 /
 
Bocs, ez nem igaz, ezt elirtam. Az "&Programinfo[0]" tipusa ugyanaz, mintha csak annyit irnal, hogy "Programinfo" mindenfel & es egyebek nelkul. Es az tovabbra sem "u8 *". Mindenkeppen cast-olni kell, hogy ne legyen warning.
(#) cross51 válasza killbill hozzászólására (») Okt 15, 2016 /
 
Most, hogy olvasom a castolást, lehet előbb rendesen végig kellet volna olvasnom, valahogy kimaradt a típus dolog a fejemből.
(#) Attila86 válasza killbill hozzászólására (») Okt 15, 2016 /
 
Köszönöm, így már jó!

A következő kérdésem:
Van egy kétdimenziós tömbböm, mely így néz ki:
  1. static char VLCD[MAX_MAGASSAG][MAX_SZELESSEG+1];      //Virtuális LCD létrehozása

Jelenleg ő egy globális változó, és szeretném ha ez nem így lenne. Két függvényen belül van használva, a Menu() függvényben és a vlcd2tft() függvényekben. A vlcd2tft() függvény kizárólag a Menu() függvényben van meghívva, ezért azt szeretném ha a kétdimenziós tömb deklarációja átkerülne a Menu() függvényen belülre. Azt nem tudom csak, hogy ebben az esetben hogyan kellene átadni a tömb adatait a vlcd2tft() függvénynek?
Tehát szerintem kb így nézne ki az egész:
  1. static void vlcd2tft(char* VLCD[MAX_MAGASSAG][MAX_SZELESSEG+1])        
  2. {
  3.     ...
  4. }
  5.  
  6. void Menu(void)
  7. {
  8.     char VLCD[MAX_MAGASSAG][MAX_SZELESSEG+1];   //Virtuális LCD létrehozása
  9.     ...
  10.     vlcd2tft(&VLCD[0][0]);
  11.     ...
  12. }

A program így lefordul ugyan, de hülyeségeket csinál.
(#) cross51 válasza Attila86 hozzászólására (») Okt 15, 2016 /
 
Én csináltam egy kis kódot
  1. char val;
  2. char tomb[5][5];
  3.  
  4. void f(char v[5][5])
  5. {
  6.    
  7.     for (char i = 0; i < 5; i++) {
  8.         for (char j = 0; j < 5; j++) {
  9.             val = v[i][j];
  10.         }
  11.     }
  12. }
  13.  
  14. void main(void)
  15. {
  16.    
  17.     for (char i = 0; i < 5; i++) {
  18.         for (char j = 0; j < 5; j++) {
  19.             tomb[i][j] = i+j;
  20.         }
  21.     }
  22.  
  23.     f(tomb);
  24.    
  25.     while(1)
  26.     {
  27.  
  28.     }
  29. }


Nálam hibátlanul ment.
Kicsit nálad belekavarodtam VLCD-kbe, nem lehet hogy valahol scope probléma van?
(#) Wezuv válasza Attila86 hozzászólására (») Okt 15, 2016 /
 
Ennek mennie kéne, más baj lesz ott.
(#) killbill válasza Attila86 hozzászólására (») Okt 15, 2016 /
 
Ha a Menu() fuggvenyben igy deklaralod a VLCD tombot, akkor az a stack-en lesz eloallitva. Biztos, hogy ez a cel? Elegendo a vlcd2tft(VLCD); nem kell az & meg a ket 0-s index.
A vlcd2tft() deklaraciojaba meg nem kell a *, mert akkor az azt jelentene, hogy a kapott pointer (VLCD) egy char mutatokat tartalmazo tomb cime. De a valosagban egy char-okat tartalmazo tombrol van szo. Elvileg erre hibauzenetet kellett volna kapnod. A warning is hibauzenet, nem szabad folotte elsiklani. Es eleg csak megadni a masodik indexet, tehat:

static void vlcd2tft(char VLCD[][MAX_SZELESSEG+1])
A hozzászólás módosítva: Okt 15, 2016
(#) Wezuv válasza killbill hozzászólására (») Okt 15, 2016 /
 
Idézet:
„A vlcd2tft() deklaraciojaba meg nem kell a *,”

Az attól függ, hogy a függvényen belül mire használja. Ha egy pointernek ad értéket, akkor kell a *.
A hozzászólás módosítva: Okt 15, 2016
(#) killbill válasza Wezuv hozzászólására (») Okt 15, 2016 /
 
Jelen esetben a VLCD parameter mindenkeppen pointer a [] jelek miatt, a * csak azt donti el, hogy pointerekre mutato pointer vagy char-okra mutato pointer. Az viszont nagyon nem mindegy.
A hozzászólás módosítva: Okt 15, 2016
(#) Attila86 válasza killbill hozzászólására (») Okt 16, 2016 /
 
Pontosan úgy van ahogy írtad. Köszönöm ismét!
(#) Lamprologus hozzászólása Okt 17, 2016 /
 
Használhatok-e ilyen függvényhívást?

  1. Homerseklet=Olvasd_be_a_homersekletet(Homerseklet);


Magyarul azt szeretném elérni, hogy ha hibás a kiolvasott érték ( pl DS18B20 CRC hiba, vagy egyéb érzékelőnél mondjuk túl nagy az eltérés az előző méréshez képest) akkor a függvény visszatérési értéknek a paraméterként megkapott értéket, azaz az előző értéket adja vissza!
A hozzászólás módosítva: Okt 17, 2016
(#) Attila86 válasza Lamprologus hozzászólására (») Okt 17, 2016 /
 
Én ilyesmiket úgy szoktam csinálni hogy a függvény visszatérési értéke signed char, és hiba esetén negatív számmal tér vissza. A negatív szám egyben hibakód is lehet. Ha nincs hiba akkor pedig a mérési eredmény a visszatérési érték. Azaz:
  1. signed char a;
  2. a = Olvasd_be_a_homersekletet();
  3. if(a>0) Homerseklet = a;

De úgy is lehet hogy a függvénynek a változó címét adod át (amúgy is azt kell ha azt szeretnéd hogy a függvény megváltoztathassa!) és a függvényt úgy írod meg hogy hiba esetén ne módosítsa a változót. Ez esetben nem is kell egyenlővé tenni a változót a függvény visszatérési értékével hiszen a függvény 'magától' átírja:
  1. Olvasd_be_a_homersekletet(&Homerseklet);

És azt is lehet amit te írtál, azaz hiba esetén azzal tér vissza a függvény amit kapott, ha nincs hiba akkor pedig mással.
A hozzászólás módosítva: Okt 17, 2016
(#) szuperman hozzászólása Okt 17, 2016 /
 
Sziasztok!

Egy MAX7219-es ict próbálok működésre bírni, de sehogy sem akar össze jönni. Segítene valaki? Az adatlap alapján ezt a kódot sikerült össze raknom:
  1. #define _XTAL_FREQ 4000000
  2.  
  3. // BEGIN CONFIG
  4. #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
  5. #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
  6. #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
  7. #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
  8. #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
  9. #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
  10. #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
  11. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  12. //END CONFIG
  13.  
  14. #include <xc.h>
  15. #include <pic.h>
  16.  
  17. #define DIN PORTBbits.RB2
  18. #define LOAD PORTBbits.RB3
  19. #define CLK PORTBbits.RB4
  20.  
  21. int my_pow(int a, int k) {
  22.         if(k == 0) {
  23.                 a = 1;
  24.         } else {
  25.                 int i = 1; int sv = a;
  26.                 for(; i < k; i++) {
  27.                         a *= sv;       
  28.                 }
  29.         }
  30.                
  31.         return a;
  32. }
  33.  
  34. void send_byte(char byte) {
  35.         for(int i = 0; i < 8; i++) {
  36.                 int mask = my_pow(2,i);
  37.                 DIN = (byte & (mask << i)) != 0;
  38.                 CLK = 1;
  39.                 CLK = 0;
  40.         }
  41. }
  42.  
  43. void SPI_Write2(char MSB, char LSB) {
  44.         LOAD = 0;
  45.         send_byte(LSB);
  46.         send_byte(MSB);
  47.         LOAD = 1;
  48. }
  49.  
  50. void main(void) {
  51.         TRISBbits.TRISB0 = 1;
  52.         TRISBbits.TRISB1 = 1;
  53.         TRISBbits.TRISB2 = 0;
  54.         TRISBbits.TRISB3 = 0;
  55.         TRISBbits.TRISB4 = 0;
  56.        
  57.         DIN = 0;
  58.         LOAD = 1;
  59.         CLK = 0;
  60.    
  61.         SPI_Write2(0x09, 0x00);         // Decoding off
  62.     SPI_Write2(0x0A, 0x0F);         // Brightness to intermediate
  63.     SPI_Write2(0x0B, 0x07);         // Scan limit = 7
  64.     SPI_Write2(0x0C, 0x01);         // Normal operation mode
  65.     SPI_Write2(0x0F, 0x00);         // Normal mode
  66.        
  67.     SPI_Write2(0x01, 0xFF);         // Clear row 0.
  68.     SPI_Write2(0x02, 0x00);         // Clear row 1.
  69.     SPI_Write2(0x03, 0x00);         // Clear row 2.
  70.     SPI_Write2(0x04, 0x00);         // Clear row 3.
  71.     SPI_Write2(0x05, 0xFF);         // Clear row 4.
  72.     SPI_Write2(0x06, 0x00);         // Clear row 5.
  73.     SPI_Write2(0x07, 0x00);         // Clear row 6.
  74.     SPI_Write2(0x08, 0x00);         // Clear row 7.
  75.     SPI_Write2(0x0F, 0x00);         // Disable display test
  76.        
  77.     while (1) {
  78.        
  79.     }
  80. }


A kapcsolás pedig Proteusban készült. Feltöltöm.

Előre is köszönöm!
Következő: »»   135 / 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