Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   62 / 153
(#) Peppe válasza wolf84 hozzászólására (») Szept 22, 2012 /
 
Amikor egy tömböt lefoglalsz az a memóriába valahova bekerül előtte és utána is vannak adatok. Ha 7 nél többet írsz bele akkor is ott lesznek a memóriában csak a 7.dik cím után.Magyarul a tömb egy memória címre mutató pointer.
valami[7] 0x2000 címtől kezdődik és a 0x2006 címig tart. de ha nem figyelsz akkor te kérheted a valami[45] tömb elemét is. Csak a kezdő címe a fix.

valami[0] 0x2000
valami[1] 0x2000+1
.
.
.
.
valami[20] 0x2000+20
(#) fordkapcs válasza fordkapcs hozzászólására (») Szept 22, 2012 /
 
Senki nem tud tippeket adni, vagy ennyire rossz volt a kérdés?
(#) vicsys válasza fordkapcs hozzászólására (») Szept 22, 2012 /
 
Az lehet a gond, hogy olyat kérdeztél mint ha: "Melyik autó a legjobb? vagy Melyik kaja a legfinomabb?" Nincs tuti recept. Tudod: kinek a papné, kinek a paplan...
(#) wolf84 válasza Peppe hozzászólására (») Szept 22, 2012 /
 
oké a címzés értem amúgy assemblyvel kezdtem, csak nem olyan régen próbálkozok a c-vel mert csak hamarabb össze lehet hozni a dolgokat csak van 1-2 két érdekes dolog...

csak azt nem értem a lcd_out ,hogy olvassa ki a többi karaktert

unsigned char Lcd_temp1[6];
signed char K1[7]; // 1 számláló kezdõ érték

res1 = atol(K1); // itt möködik
LongIntToStrWithZeros(res1, Lcd_temp1); // elmentem a késõbbi ellenõrzéshez
LCD_Out(1, 1, Lcd_temp1) ;

mert itt a lcd_temp1 tudja hol a vége addig olvas kezdőcím+7 karakter de a ha lcd kiíratom akkor még kapok plusz 4 darab nullát

de nem ez is a gondom hanem atol csak enter ellenőrzésnél működik később már nem bírom át alakítani hogy helyes eredményt kapjak...
(#) trudnai válasza fordkapcs hozzászólására (») Szept 22, 2012 / 1
 
Hasznaldd a C18-at: Azt a Microchip keszitette es rengeteg mintaprogramot fogsz talalni a neten. De azt jaasolnam ne "minel gyorsabban" probalj meg valamit kesziteni, hanem inkabb alaposan tanulmanyozd a PIC architekturajat -- meroben mas a filozofia, mint a PC-n.
(#) vilmosd válasza fordkapcs hozzászólására (») Szept 22, 2012 / 1
 
Tippet tudunk adni, de nem biztos hogy Neked ez jo lesz. A PIC programozasa az nem egy PC programiras. Eloszor is nagyon meg kell tanulni a PIC felepiteset es mukodeset. Ezt talan ASM programozassal lehet elsajatitani eleg hathatosan. Utana lehetne elkezdeni valami komolyabb projektet. Akkor kell majd elovenni valami C nyelvjarast. Eleg nagy a valasztek, mind arban, mind komplexitasban. Persze vannak demo verziok is, amiben ki lehet probalmi a programozas alapjait. Komolyabb projekthez azert a teljes verziokat kell hasznalni, mert a demok altalaban korlatozottak, mint idoben, mint program meretben, mint optimalizacioban. A 12 bites AD felbontashoz talasz a 18F sorozatban tobb peldanyt is. A MCHP honlapjan van egy specialis eszkozkereso, amiben lehet alligatni a keresesi felteteleket. 12 bites a PIC18F4423, a 18F46K80. Alkalmazhato kulso AD is A MCHP gyart tobbfele felbontasut, egeszen 22 bitig. A modernebb PIC-ek altalaban tartalmaznak UART-ot, tehat ezzel nincs problema, csak az UART felprogramozasaval.
(#) _vl_ válasza wolf84 hozzászólására (») Szept 22, 2012 /
 
Idézet:
„mert itt a lcd_temp1 tudja hol a vége”

Nem tudja. Amikor az LCD_Out függvénynek a "tömböt" átadod, akkor valójában csak és kizárólag a tömb első elemének a címét adod át. Nem az egész tömböt, nem a méretét, pláne nem a tartalmát. Csak a címét.
C már csak így működik. A függvény kap egy címet, onnantól tudja számítani, hogy melyik elem hol van. De hogy hány elem van, azt csak akkor tudhatja, ha azt is egy külön paraméterben átadod (pl. nézd meg a PC-den az snprintf függvény leírását).
(#) diablo hozzászólása Szept 25, 2012 /
 
Üdv újra!

Egy egyszerű kérdés. Melyik kód fut le gyorsabban?
Ez:
  1. //Timer1 megszakítás:
  2. ...
  3. {
  4. ...
  5. if(iPWM & (1 << 0)) CCP1CONbits.CCP1Y = 1;
  6. else CCP1CONbits.CCP1Y = 0;
  7. if(iPWM & (1 << 1)) CCP1CONbits.CCP1X = 1;
  8. else CCP1CONbits.CCP1X = 0;
  9. ...
  10. } //megszakítás vége

Avagy ez:
  1. //Deklarációs rész:
  2. ...
  3.         union
  4.         {
  5.         int Data;
  6.                 struct
  7.                 {
  8.                         unsigned Bit0 : 1;
  9.                         unsigned Bit1 : 1;
  10.                 } Bits;
  11.         } _iPWM;
  12. #define iPWM _iPWM.Data
  13. #define iPWM_Bit0 _iPWM.Bits.Bit0
  14. #define iPWM_Bit1 _iPWM.Bits.Bit1
  15. ...
  16. //Timer1 megszakítás:
  17. ...
  18. {
  19. ...
  20. CCP1CONbits.CCP1Y = iPWM_Bit0;
  21. CCP1CONbits.CCP1X = iPWM_Bit1;
  22. ...
  23. } //megszakítás vége


A második megoldás több program memóriát foglal, csak nem tudom, hogy pontosan mit csinál mikor átmásolja a biteket a CCP1CON regiszterbe, így bizonytalan vagyok, hogy melyik a gyorsabb.
A hozzászólás módosítva: Szept 25, 2012
(#) _vl_ válasza diablo hozzászólására (») Szept 25, 2012 /
 
Nézd meg az assembly kimenetét a fordítónak (kérjél tőle .LST fájlt), és számold ki. Ez ugyanis nagy mértékban a használt CPU, fordítóprogram, és optimalizációs beállítások függvénye lesz.
Nem írtad, hogy milyen CPU, de pl. PIC32 széria esetén a CCP1CONSET/CLR/INV használata mindig gyorsabb, mint a bitbűvészkedés.
(#) diablo válasza _vl_ hozzászólására (») Szept 25, 2012 /
 
És azt hogy kell kérni MPLAB-ban? Meg ez az optimalizálás is érdekelne, hogy azt hogy kell csinálni.
Akkor azt mondod, hogy az első megoldás gyorsabb lehet vagy írjak bele egy assembly betétet?

szerk:
A program mappájában van egy lst fájl, de ebből a sok zagyvaságból hogy találom meg azt a részt?
A hozzászólás módosítva: Szept 25, 2012
(#) _vl_ válasza diablo hozzászólására (») Szept 25, 2012 /
 
Idézet:
„de ebből a sok zagyvaságból hogy találom meg azt a részt?”

Mondjuk rákeresel a függvény nevére?
(#) diablo válasza _vl_ hozzászólására (») Szept 25, 2012 /
 
Most rákerestem, de nem lettem okosabb, mert nem is tudom, hogy mit csinál.
  1. 2704                           ;main.c: 128: if(_iPWM.Data & (1 << 1)) CCP1CONbits.CCP1X = 1;
  2.   2705  0276  1CA2                      btfss   (__iPWM),(1)&7
  3.   2706  0277  2A79                      goto    u311_21
  4.   2707  0278  2A7A                      goto    u311_20
  5. ...
  6.   2718                           ;main.c: 129: else CCP1CONbits.CCP1X = 0;
  7.   2719  027C  1297                      bcf     (23),5  ;volatile
  8.   2720  027D  2A7E                      goto    i1l2999


  1. 2703                           ;main.c: 132: CCP1CONbits.CCP1X = _iPWM.Bits.Bit1;
  2.   2704  0279  18A2                      btfsc   (__iPWM),1
  3.   2705  027A  2A7C                      goto    u314_21
  4.   2706  027B  2A80                      goto    u314_20

Na melyik a gyorsabb?
(#) El_Pinyo válasza diablo hozzászólására (») Szept 25, 2012 /
 
Az MPLAB fejlesztői környezetben van egy olyan, hogy Stopwatch. Szimulátorral kombinálva egyértelműen megmondja, hogy mennyi idő, illetve utasításciklus telik el pl. két breakpoint között.
(#) netnet.hu hozzászólása Szept 28, 2012 /
 
Helló, adódott egy kis gond. Az LCD kijelzőn csak 3 számjegy jelenik meg.
Vagy az ADC olvasásában követek el hibát, vagy az itoa-ban szerintem.
A vas PIC18F14K22, C18 4 bites az LCD busz

Itt a main:
  1. void main (void)
  2. {
  3. int result; // result of adc conversion between 0 and 1023
  4. char lcdout[10]; // ascii formatted format of result
  5. ADCON1=0x07;                            //make PORTA digital as control portpins are  PORTA
  6. OSCCON = 0b01110111;
  7. //OSCCONbits.IDLEN = 0b0;
  8. //OSCCONbits.IRCF = 0b111;
  9.  
  10. //AN0-t be fogjuk állítani analóg bemenetnek
  11.         ADCON1 = 0b00001110;//VSS,VDD ref. AN0 analog only
  12.         ADCON0 = 0x00;//clear ADCON0 to  channel 0 (AN0)
  13.         ADCON2 = 0b00001000;//ADCON2 setup: Left justified, Tacq=2Tad, Tad=2*Tosc (or Fosc/2)
  14.         ADCON0bits.ADON = 0x01;//Enable A/D module
  15. XLCDInit();                             //initialize the LCD module
  16.  XLCDDisplayOnCursorOff();
  17. XLCDPutRomString("AN0 = " );
  18. XLCDL2home();
  19.         while(1)
  20.         {
  21.                 ADCON0bits.GO_DONE = 1;//Start A/D Conversion
  22.                
  23.                 while(ADCON0bits.GO_DONE != 0);//Loop here until A/D conversion completes
  24.                 result = ((ADRESH<<8)+(ADRESL));
  25.                 itoa(result,lcdout,10);
  26.                 XLCDPutRamString(lcdout);
  27.                 XLCDL2home();
  28.         }
  29.  
  30. while(1);
  31. return ;
  32. }


Kérek szépe segítséget!
A hozzászólás módosítva: Szept 28, 2012
(#) miklosch hozzászólása Szept 30, 2012 /
 
HI-TECH C-ben akadt egy kis problémám. Szeretnék egy 8 bites számot felbontani bites változókra. Jelenleg ez egy bit esetén így működik:
  1. if (adatcmd&0b00010000) RA4 = 1;
  2.         else RA4=0;

Ehelyett úgy szeretném megoldani, hogy a bites változó legyen egyenlő a 8 bites változó adott bitjével, de egyenlőre sehogy nem sikerül. Valakinek ötlete van rá, hogy hogyan kéne beírni?
Ez így sajnos nem működik:
  1. RA4 = adatcmd&0b00010000;
(#) kissi válasza miklosch hozzászólására (») Szept 30, 2012 /
 
Szia!

Miért nem használsz struktúrát ?!

Steve
(#) miklosch válasza kissi hozzászólására (») Szept 30, 2012 /
 
Azért nem használok struktúrát, mert a 8 bites szám egy függvény bemenő paramétere, jelen esetben az LCD-re kiírandó karakter. Ezt kell kiküldeni a port lábakra 4 bites módban. A portok nem sorba vannak, ezért kell felbontani bitekre.
(#) vicsys válasza miklosch hozzászólására (») Szept 30, 2012 /
 
Valami ilyesmi nem lenne jó?
  1. int8 encodetable[ 31 ] = {
  2.       /* '0' */   0b00000011,
  3.       /* '1' */   0b10011111,  
  4.       /* '2' */   0b00100101,  
  5.       /* '3' */   0b00001101,
  6.       /* '4' */   0b10011001,
  7.       /* '5' */   0b01001001,
  8.       /* '6' */   0b01000001,
  9.       /* '7' */   0b00011111,
  10.       /* '8' */   0b00000001,
  11.       /* '9' */   0b00001001,
  12.       /* '-' */   0b11111101
  13. ....
(#) miklosch válasza vicsys hozzászólására (») Szept 30, 2012 /
 
Ennyire nem szeretném túlbonyolítani. Igazából annyit szeretnék elérni, hogy a fordító elfogadja egy sorban azt, hogy egy bit egyenlő egy bájt adott bitjével.
(#) miklosch válasza (Felhasználó 15355) hozzászólására (») Szept 30, 2012 /
 
Köszönöm, de a fordító ezt sem szereti.
Nem teljesen így próbáltam, de nagyon hasonlít a Tiédhez:
  1. RA4 = adatcmd&0b00000001;
  2. RA5 = adatcmd&0b00000010;
  3. RC0 = adatcmd&0b00000100;
  4. RC1 = adatcmd&0b00001000;
(#) El_Pinyo válasza miklosch hozzászólására (») Szept 30, 2012 /
 
Szia!
Így próbáld:

  1. typedef union{
  2.         struct{
  3.                 unsigned d0:1;
  4.                 unsigned d1:1;
  5.                 unsigned d2:1;
  6.                 unsigned d3:1;
  7.                 unsigned d4:1;
  8.                 unsigned d5:1;
  9.                 unsigned d6:1;
  10.                 unsigned d7:1;
  11.         }bits;
  12.         unsigned char data;
  13. }LCD;
  14.  
  15. void valami_fgv1( LCD lcd_data )
  16. {
  17.     RA4 = lcd_data.bits.d0;
  18. }
  19.  
  20. //Masik lehetoseg:
  21. void valami_fgv2( LCD* lcd_ptr )
  22. {
  23.     RA4 = lcd_ptr->bits.d0;
  24. }
  25.  
  26. void main( void )
  27. {
  28.     LCD lcd_data;
  29.  
  30.    lcd_data.data = 0xF0;        // igy lehet bajtosan hozzaferni
  31.    valami_fgv1( lcd_data );    // fgv1 hivas    
  32.    valami_fgv2( &lcd_data ); // fgv2 hivas
  33. }
(#) El_Pinyo válasza miklosch hozzászólására (») Szept 30, 2012 /
 
Ha így próbálod, azt sem szereti?
  1. RA4 = ( unsigned )( adatcmd & 0b00000001 );
(#) miklosch válasza El_Pinyo hozzászólására (») Szept 30, 2012 /
 
Ezt a formát megeszi a fordító, de ezt a figyelmeztetést adja: "Warning [750] D:\Munka\programok\AJK12UI1\lcd.c; 17. constant operand to || or &&", de a működése nem jó. A többit hamarosan próbálom. Köszönöm!
(#) El_Pinyo válasza El_Pinyo hozzászólására (») Szept 30, 2012 /
 
Kiegészíteném a korábbit:
  1. RA5 = ( unsigned )( (adatcmd >> 1) & 1 );   // 1-es helyértékű bit
  2. RC0 = ( unsigned )( (adatcmd >> 2) & 1 );   // 2-es helyértékű bit
(#) p_istvan válasza miklosch hozzászólására (») Szept 30, 2012 /
 
És így:
RA4 = !!(adatcmd&0b00000001);
(A hasonló az nem ugyanaz...)
(#) _vl_ válasza miklosch hozzászólására (») Szept 30, 2012 /
 
  1. RC0 = adatcmd&0b00000100;

Ez így nem tud működni, akárhogy erőlteted.
Az RC0 tartalma 0 vagy 1 lehet. Az adatcmd & 0b100 értéke 0 vagy 4 lehet. A 4-ből 1-et kell csinálnod, hogy működjön - ahogy mutatták neked:

  1. RC0 = adatcmd >> 2;
vagy
  1. RC0 = (adatcmd & 0b100) ? 1 : 0;


Én a legutolsó verziót használnám, mert tuti jó (optimális) kód lesz belőle.
A hozzászólás módosítva: Szept 30, 2012
(#) El_Pinyo válasza miklosch hozzászólására (») Szept 30, 2012 /
 
Véletlenül nem írtad el?
Csak mert logikai ÉS ill. VAGY operátor nem volt használva, csak a bitenkénti & művelet.
(#) miklosch válasza _vl_ hozzászólására (») Szept 30, 2012 /
 
Nagyon köszönöm mindenkinek a segítséget, a megoldás az alábbi, így hibátlanul működik:
  1. bit1 = (adatcmd & 0b00010000) ? 1 : 0;
  2. bit2 = (adatcmd & 0b00100000) ? 1 : 0;
  3. bit3 = (adatcmd & 0b01000000) ? 1 : 0;
  4. bit4 = (adatcmd & 0b10000000) ? 1 : 0;
(#) miklosch válasza El_Pinyo hozzászólására (») Szept 30, 2012 /
 
Köszi, ez is működik, csak ez figyezmeztetéssel ("Warning [750] D:\Munka\programok\AJK12UI1\lcd.c; 22. constant operand to || or &&").
Kód:
  1. bit1 = ( unsigned )( (adatcmd >> 4) & 1 );
  2. bit2 = ( unsigned )( (adatcmd >> 5) & 1 );
  3. bit3 = ( unsigned )( (adatcmd >> 6) & 1 );
  4. bit4 = ( unsigned )( (adatcmd >> 7) & 1 );
(#) emmzolee hozzászólása Okt 1, 2012 1 /
 
Hello
Bocs a kicsit offért.

Találtam itthon egy olyan alkatrészt. PALCE20V8Q-25PC/4 Gondolom valami kontroller féle lehet.
Itt az adatlapja. Bővebben: Link
Szerintetek mit lehet vele kezdeni? Tudtok róla mesélni?
Kössz.
Következő: »»   62 / 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