Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   97 / 118
(#) akos_b válasza vicsys hozzászólására (») Feb 4, 2014 /
 
Értem, akkor ez a baj. Ezen a PICen az nincs. Köszönöm.
(#) djsms hozzászólása Feb 12, 2014 /
 
C forráskódban megadott double-t mivel kellene helyettesíteni ccs-ben?
(#) icserny válasza djsms hozzászólására (») Feb 12, 2014 /
 
Az attól függ, hogy milyen fordítóhoz készült forrásról van szó. Mikrovezérlőknél a double többnyire csak float-ként van kezelve. Ha 64 bites pontosság kell, akkor float64-gyel kell próbálkozni. (legalábbis Google barátod ezt súgta nekem)
(#) sysy válasza djsms hozzászólására (») Feb 12, 2014 /
 
Szerintem "long long" lesz ami neked kell.
(#) potyo válasza sysy hozzászólására (») Feb 12, 2014 /
 
A long az egész típus, a float/double meg lebegőpontos. Persze ettől még simán lehet neki jó a long is, épp valamelyik nap láttam egy figurát, hogy erővel float-ot akart használni, miközben a feladatról húsz méterről ordított, hogy csak mindent megszorzunk százzal, és sokkal jobb megoldás valamilyen egész típus használata...
(#) djsms válasza icserny hozzászólására (») Feb 12, 2014 /
 
Erről lenne szó: http://www.sci.fi/~benefon/rscalc.c
(Bocs, telefonról nem megy a link beszúrás )
Nekem csak a napkelte és napnyugta kiszámítása kell majd belőle.
A hozzászólás módosítva: Feb 12, 2014
(#) icserny válasza djsms hozzászólására (») Feb 12, 2014 /
 
Ettől nem lettem okosabb. Azt kell eldöntened, hogy elég-e a 6-7 értékes jegyet tároló számábrázolás, vagy ennél több kell. Ha másképp nem megy, akkor futtasd PC-n double és float változatban is a programot, s hasonlítsd össze a végeredményeket!
(#) retek2345 hozzászólása Feb 13, 2014 /
 
Hali!
Valaki csinált már esetleg CCS és labview segítségével PIC-PC között ethernet kommunikációt?
(#) messer hozzászólása Feb 16, 2014 /
 
Helló! Ti hogyan oldanátok meg ha egy 8 bites értékkel kellene vezérelni egy 10 bitest van erre valami elmés megoldás a c-ben vagy egyszerűen szorozzam fel 4-el?
Válaszotokat előre is köszönöm.
(#) icserny válasza messer hozzászólására (») Feb 16, 2014 /
 
  1. data10bit = data8bit<<2;
(#) potyo válasza messer hozzászólására (») Feb 16, 2014 /
 
Más megoldás nincs. Esetleg ki lehet olyannal egészíteni, hogy az alsó két bitet a felső két bittel azonosra teszed, akkor ha 0 van a "bemeneten", akkor 0 lesz a kimenet is, ha 100% a bemenet, akkor 100% lesz a kimenet is. Ez pl. PWM-nél nem rossz dolog. Tehát icserny példájánál maradva:
  1. data10bit=((uint16)data8bit<<2)+(data8bit>>6);


uint16-ra castolás akkor kellhet, ha a data8bit változód csak 8 bites. Most hogy ccs-ben pontosan hogy van az uint16, azt nem tudom, ezt már neked kell kitalálnod.
(#) Hp41C válasza messer hozzászólására (») Feb 16, 2014 /
 
Nem kell ide szorzás, 16 bites léptetés, stb:
  1. typedef union _WORD_VAL
  2. {
  3.     unsigned int Val;
  4.     struct
  5.     {
  6.         unsigned char LB;
  7.         unsigned char HB;
  8.     } bytes;
  9. }WORD_VAL;
  10.  
  11. {
  12.   WORD_VAL data10bit;
  13. ..
  14.   data10bit.bytes.HB = (data10bit.bytes.LB = data8bit) & 0x03;
  15. ..
  16. }
A hozzászólás módosítva: Feb 16, 2014
(#) Hp41C válasza Hp41C hozzászólására (») Feb 16, 2014 /
 
No ezt jól elírtam:
data10bit.bytes.HB = (data10bit.bytes.LB = data8bit) & 0x03;
helyett
data10bit.bytes.LB = (data10bit.bytes.HB = data8bit) & 0x03;
data10bit.bytes.LB <<=4;
CCPR1L = data10bit.bytes.HB;
CCP1CON ^= (data10bit.bytes.LB ^ CCP1CON) & 0x30;
(#) messer hozzászólása Feb 17, 2014 /
 
Köszönöm szépen megnézem őket "megértem" és jövök, ha kérdésem van.
(#) sysy válasza retek2345 hozzászólására (») Feb 17, 2014 /
 
"Whalaky" nevű fórumtársunk csinált ilyet.
Keresd meg, szerintem fog segíteni neked.
(#) sysy válasza messer hozzászólására (») Feb 17, 2014 /
 
Hp41C fórumtársunk hozzászólásait nyugodtan ignorálhatod, mert láthatóan rossz topicba van bejelentkezve.
(#) sysy válasza messer hozzászólására (») Feb 17, 2014 /
 
Amit a potyó írt, hogy eltolod balra két bittel az értéket és a legfelső két bitet bemásolod a legalsó két bitbe, az tetszik.
(#) Hp41C válasza sysy hozzászólására (») Feb 17, 2014 /
 
Ugyan azt írtam, mint potyó, csak két ciklust hagytam ki belőle - lehet ebben a C -ben más a szintaxis...
Akkor lépésenként:
(data10bit.bytes.HB = data8bit); felső byte-ba a 8 bites érték megy - ez kerül majd a CCPR1L -be. (bankváltásokat nem tekintve csak 2 utasítás).
data10bit.bytes.LB = (data8bit) & 0x03; csak az alsó két bit marad meg - (csak 2 utasítás)
data10bit.bytes.LB <<=4; (csak egy swapf cím,f lenne, de a fordító mindig letörli az eredmény alsó 4 bitjét, igy 2 utasítás)
CCP1CON ^= (data10bit.bytes.LB ^ CCP1CON) & 0x30; a CCP1CON regiszter 5. és 4. bitjét a kívánt értékre állítja (bankváltásokat nem tekintve csak 4 utasítás). Ez 12 utasítás a CCPR1 resiztereibe töltéssel együtt.
Az ((uint16)data8bit<<2) rész csak 6 utasítás, a (data8bit>>6) egy 6-szor lefutó ciklus, ami minimum 6 utasítás. Azaz bankváltásokat nem tekintve minimum 12 utasításba kerül, de még nincs betöltve a CCPR1 regisztereibe. Nyugodtan el lehet felejteni...
(#) messer válasza potyo hozzászólására (») Feb 17, 2014 /
 
Idézet:
„uint16-ra castolás akkor kellhet, ha a data8bit változód csak 8 bites. Most hogy ccs-ben pontosan hogy van az uint16, azt nem tudom, ezt már neked kell kitalálnod.”


Ki tudnátok nekem fejteni ezt az uint16-os dolgot, mert a ccsc helpben nem találok róla semmit sem.
(#) messer válasza Hp41C hozzászólására (») Feb 17, 2014 /
 
Kicsit megkever a ccp1Con meg a ccpr1 hogy jönnek ezek be?
Az lenne nekem a lényeg hogy adott egy érték ami 8bite legyen a neve data8bit és ebből kellene varázsolni egy 10bites értéket aminek legyen a neve data10bit. Persze úgy szeretném hogy legyen 0 és 100% is mivel én is pwm-et szeretnék vezérelni vele.
(#) potyo válasza messer hozzászólására (») Feb 17, 2014 /
 
A lényeg, hogy ha a data8bit változód csak 8 bites, akkor a data8bit<<2 művelettel elveszted a két felső bitet, mert a C alapból olyan, hogy az eredményt is ugyanakkora bítszélességen képzi, mint amilyen széles a legszélesebb operandus. Ezért kell a data8bit változót 16 bitesre castolni, akkor nem veszik el a két felső bit. A castolás történik az (uint16)data8bit kifejezéssel, a kérdés csak az, hogy CCS-ben hogy hívják a 16 bites előjel nélküli (unsigned) típust, ezt kell megnézned.
(#) sysy válasza potyo hozzászólására (») Feb 17, 2014 /
 
long!

long Data10Bit;

Data10Bit=(long)Data8Bit<<2;
A hozzászólás módosítva: Feb 17, 2014
(#) p_istvan válasza messer hozzászólására (») Feb 17, 2014 /
 
Idézet:
„Kicsit megkever a ccp1Con meg a ccpr1 hogy jönnek ezek be?
.... mivel én is pwm-et szeretnék vezérelni vele.”

Talán mert a CCP1CON és CCPR1 regiszterek értékeivel értékeivel lehet a PWM-et modulálni, fölösleges egy változót közbeiktatni, ha közvetlenül is lehet értéket adni nekik.
Bővebben: Link
(#) Hp41C válasza messer hozzászólására (») Feb 17, 2014 /
 
Idézet:
„Data10Bit=(long)Data8Bit<<2;”

Ennek egy aprócska baja van: nem tudja előállítani a 100% -ot, mivel a két alsó bit mindig 00. Úgy küszöbölhető ki, hogy a 8 bites értékből "pótoljuk" a hiányzó két bitet. Potyo a legfelső két bittel pótolta, én a két legalsóval, de bármelyik kettővel lehet... Az a lényeg, ha a 8 bites érték 0x00, akkor a 10 bites két legaló bitje is legyen 00, ha a 8 bites érték 0xFF, akkor a 10 bites két legaló bitje legyen 11.
(#) djsms hozzászólása Feb 17, 2014 /
 
Sziasztok!

Összeraktam próbapanelen Topi leírása és programja alapján a 433MHz-es analóg adó-vevő párost. Valamennyire működik is, de nem jól. Adó oldalon sorban küldök négy karaktert (a, b, c majd d)
A vevőn viszont a következő számok jelennek meg: 105 106 105 102
Minden ciklusban ez van, szóval nem egyszerű zavarról van szó.
Mi lehet a hiba?
A Topi féle m_manchester.c-t változatlanul hagytam, az adó és vevő programot írtam át minimálisan, illetve Nokia 5110 lcd-t használok, de gondolom ez nem lehet baj Baudot is próbáltam már más értékeken, de mindenhol ez az eredmény.
  1. #include <rfado.h>
  2. #use rs232(baud=2400,xmit=PIN_C3,rcv=PIN_C2,stream=radio,INVERT)
  3. #include <m_manchester.c>
  4. void main()
  5. {
  6.    int i;
  7.    while(TRUE)
  8.    {
  9.          m_send("a");
  10.          delay_ms(500);
  11.          m_send("b");
  12.          delay_ms(500);
  13.          m_send("c");
  14.          delay_ms(500);
  15.          m_send("d");
  16.          delay_ms(500);        
  17.          output_low(PIN_A5);
  18.          delay_ms(1000);
  19.          output_high(PIN_A5);
  20.          delay_ms(1000);
  21.       //TODO: User Code
  22.    }
  23.  
  24. }

  1. #include <rfvevo.h>
  2. #include <5110.c>
  3. #use rs232(baud=2400,xmit=PIN_C2,rcv=PIN_C3,stream=radio,INVERT)
  4. #include <m_manchester.c>
  5. void main()
  6. {
  7.    nokia_init();
  8.    printf(nokia_printchar,"Init 1");
  9.    while(TRUE)
  10.    {
  11.       //TODO: User Code
  12.      
  13.     int i;
  14.  
  15.  
  16.  
  17.  
  18.     if(kbhit(radio)) {
  19.       i = m_get();
  20.       if (!receive_error){
  21.     // ha érkezett adat, és nem hibás
  22.          printf(nokia_printchar,"%d",i);
  23.       }
  24.     }//ha érkezett adat
  25.  
  26.  }
  27.    }
(#) messer válasza Hp41C hozzászólására (») Feb 18, 2014 /
 
Köszönöm szépen mindenkinek a segítséget, és visszafelé hogyan működik a dolog, ha pl 12bites adatot szeretnék 8 bitesre?
(#) Hp41C válasza messer hozzászólására (») Feb 18, 2014 / 1
 
  1. typedef int16 <ahogy_a_CCS_hívja_a_16_bites_típust>;
  2. int16 data12bit;
  3. unsigned char data8bit;
  4. data8bit = (data12bit >> 4); // Az alsó 4 bit elvész
(#) messer válasza Hp41C hozzászólására (») Feb 18, 2014 /
 
Köszönöm.
(#) messer hozzászólása Feb 18, 2014 /
 
Hello, Pic-el 4 dali eszközt akarok vezérelni ehhez írom a kommunikációt 4 I/O lábon szeretném küldeni ki az adatokat. Kérdésem az volna hogy szeretnék egy uiverzális függvényt írni aminek a bemenő paramétere lenne meghívásnál egy I/O láb. tehát mikor küldöm az adatokat elég legyen csak a port-ot és azt hogy magas vagy alacsony legyen. Ezt CCSC-ben hogyan lehet megvalósítani?
(#) messer hozzászólása Feb 18, 2014 /
 
  1. #include <18F25K80.h>
  2. #define dout1   pin_b2
  3. int write_startbit (int a);
  4. int write_1(int b);
  5. int write_1(int b)
  6.         {
  7.         output_low(b);
  8.         delay_us(416);
  9.         output_high(b);
  10.         delay_us(416);
  11.         }
  12. int write_startbit(int a)
  13.                 {
  14.                 write_1(a);
  15.                 }
  16. void main(){
  17. while(1){
  18.         {
  19.         write_startbit(dout1);
  20.         }
  21.                 }
  22. }

Ezt sikerült alkotni, de nem vagyok biztos benne, hogy ez a szép okos elmés megoldás.
Következő: »»   97 / 118
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