Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   111 / 153
(#) foxi63 válasza benjami hozzászólására (») Ápr 12, 2015 /
 
Szia!
Mivel char word és Dword is van a mentési értékek között,
én készítenék egy struktúrát, és az egészet elmenteném eepromba. Bekapcsoláskor pedig abból visszatölteném a struktúrába. A nevével hivatkozhatnál rá. Egy komparátorral érzékelni lehetne a tápfesz eltűnését, és elmenthető az adat űjra az eepromba. (esetleg)
A hozzászólás módosítva: Ápr 12, 2015
(#) don_peter hozzászólása Ápr 13, 2015 /
 
Srácok kérnék egy kis segítséget.
Bit tologatásról lenne szó.
Van egy változó amiben a biteket akarom balra tolni, de a bajom az, hogy ha elkezdem tolni balra, akkor értelemszerűen nullákkal tölti fel a még ismeretlen biteket.
Mutatom a példát:
0b11111110, ha ezt elkezdem balra tolni így fog kinézni:
0b11111100, ez ebben a formában nekem nem jó.
Itt a jó megoldásnak amit használnék, ennek kellene lennie:
0b11111101, és minden további balra léptetésnél a belépő bitnek 1-nek kellene lennie.
Ezt, hogy tudom megoldani?
Előre is köszi..

Elfelejtettem, hogy ciklusban lenne így automatikusnak kellene lennie:
  1. OSZLOP = (0xFE<<i);
A hozzászólás módosítva: Ápr 13, 2015
(#) don_peter válasza don_peter hozzászólására (») Ápr 13, 2015 /
 
Közben megoldottam így, de persze nem a legszebb:
  1. OSZLOP = 0xFE;
  2. for(i=0; i<8; i++){
  3.     OSZLOP = i==0 ? OSZLOP : (OSZLOP<<1)|1;     // Léptetjük az oszlopok szintjét
  4. }
A hozzászólás módosítva: Ápr 13, 2015
(#) don_peter hozzászólása Ápr 13, 2015 /
 
Ma úgy látszik ilyen napom van, nem pörög az agyam, vagy csak igen lassan.
Következő problémába botlottam:
Van egy másodperc számlálom, ami char típusú és 0-tól 9-ig számol.
0,1,2,3,4,5,6,7,8 és 9, tehát rendesen előre számol.
Az lenne a gondom, hogy ezt nem tudom megfordítani.
Tehát megfordítva így nézne ki: 0,8,4,C,2,A,6,E,1,9
Tehát amikor 1-et mutat a másodperc a 0x08-at kellene kiküldenie, ha viszont 5 mutat akkor a 0x0A-t.
Hogy tudom ezt megoldani?
Így néz ki ez kódban:
  1. SR74HC595(mp_1);

Itt az mp_1-ben a másodpercek pörögnek 0-9-ig.
Előre is köszi a segítséget.
(#) zenetom válasza don_peter hozzászólására (») Ápr 13, 2015 /
 
Ha lehet pazarolni az erőforrást (és mivel C, ezért úgyis mindegy ), én inkább beraknám egy tömbbe (ezt így kell írni?), és a másodperc lenne a tömb index..
Egyébként kellett egy kis idő, míg leesett, hogy csak az alsó nibblét akarod tükrözni önmagában. Hiába na, este van.
(#) don_peter válasza zenetom hozzászólására (») Ápr 13, 2015 /
 
Igen ez a táblás indexelés jó ötlet, de el akartam kerülni, mert a felső 4bit is majd lesz használva egy másik részéhez a programnak..
Bár ez nem lenne akadálya..
(#) zenetom válasza don_peter hozzászólására (») Ápr 13, 2015 /
 
Idézet:
„Bár ez nem lenne akadálya..”

Nem bizony. Kimaszkolod és kész.
(#) don_peter válasza zenetom hozzászólására (») Ápr 13, 2015 /
 
Igen, de most még is ezt választottam, ehhez a feladathoz most ez is teljesen jó:
  1. SR74HC595((mp_1>>3)|((mp_1>>1)&2)|((mp_1<<1)&4)|((mp_1 << 3)&8));
(#) zenetom válasza don_peter hozzászólására (») Ápr 13, 2015 /
 
Ez kicsit mondjuk pazarlóbb..
(#) killbill válasza don_peter hozzászólására (») Ápr 14, 2015 /
 
  1. unsigned char oszlop;
  2.  
  3. // oszlop indul 1-rol, aztan 2, 4, 8 ... 128, es amikor 0, akkor megall a ciklus
  4. // igy nincs szukseg az 'i' valtozora.
  5.  
  6. for(oszlop = 1; oszlop; oszlop <<= 1){
  7.     // a ~oszlop 0xfe-tol indul .. egeszen 0x7f-ig megy, szepen vandorol benne a 0
  8.     ... = ~oszlop;  
  9. }
A hozzászólás módosítva: Ápr 14, 2015
(#) don_peter válasza killbill hozzászólására (») Ápr 14, 2015 /
 
Köszönöm, de az i változót is használom a ciklusban másra.
A legrosszabb esetben, ha kevés lesz az erőforrás ami nem valószínű , táblába rendezem és indexelem a dolgot..
(#) killbill válasza don_peter hozzászólására (») Ápr 14, 2015 / 1
 
Ettol meg hasznalhatod az 'i' valtozot. Beleteheted a for-ba igy:
  1. for(oszlop = 1, i = 0; oszlop; oszlop <<= 1, ++i)

De mar onmagaban attol rovidebb es gyorsabb lesz a forditott kod, hogy a for ciklusban a feltetelvizsgalat nem az 'i''-t hasonlitja ossze 8-cal, hanem az oszlopot nullaval.

Ebben az esetben a tablazatos megoldas nem eredmenyez jobb kodot, mert egy 8 bites PIC-en egy sima shift-elesnel es egy negalasnal a tablazatkezeles sokkkkkal bonyolultabb.
A hozzászólás módosítva: Ápr 14, 2015
(#) don_peter hozzászólása Ápr 15, 2015 /
 
Van egy programom, még kb 1 éve írtam.
Mivel a C18 és később kiderült, hogy a Hi-Tech10-12-16 fordító sincs megfelelően felkészítve a lebegőpontos számok kezelésére, legalább is a printx() függvényeket tekintve, írnom kellett egy tizedes számokat is megjeleníteni képes illetve átalakítani képes rutint.
Mivel nem volt jobb ötletem, úgy oldottam meg, hogy a rutin előbb szétszedi darabokra, átkonvertálja char típusra majd egy tömbbe bele teszi.
A végén egy globális változóba (tömbbe) belemásolom és string-ként ki tudom íratni.
Eddig nem kellett érdemben használnom, de most jó lenne, mert pont egy olyan projekten dolgozom ahol minimum 2tizedes pontossággal látnom kellene a mért adatokat.
Most megnézve a programot, működik is rendesen, de baromira pocsékolja az erőforrást.
Amennyiben lenne jobb és hatékonyabb, gyorsabb megoldás szívesen tanulnék belőle és használnék korszerűbb rutint ehhez.

A kód így néz ki:
  1. volatile unsigned char szamok[10] = {0};
  2. void float_to_str_tomb(float szam, char maxtizedes){
  3.         char i = 0, j = 0, tizedes = 0;
  4.         unsigned char temp[10] = {0}, sign = ' ', vezetonulla = 0;
  5.         unsigned long intszam = 0;
  6.    
  7.         if(szam < 0)            // ha negativ szamunk van
  8.         {
  9.                 szam = 0 - szam;
  10.                 sign = '-';
  11.         }
  12.         if (szam > 0 && szam < 1)       // ha nullaval kezdodik a szam akkor 1
  13.         {
  14.                 vezetonulla = 1;
  15.         }
  16.         if (szam-(int)szam >= 0 && (int)szam < 10000)   // +/- egesz vagy tort Ès kisebb mint 10e
  17.     {
  18.                 while((szam-(int)szam != 0) && i != maxtizedes) // ha tortszam, "maxtizedes" ertekig
  19.         {
  20.                         szam = szam * 10;
  21.                         i++;
  22.         }
  23.        
  24.                 tizedes = i;
  25.                 intszam = (int)szam;
  26.                 i = 0;
  27.        
  28.                 while(intszam > 0)              // addig osztunk amig nagyobb intszam mint nulla, minden szamjegyet tarol
  29.         {
  30.                         temp[i] = intszam % 10;
  31.                         intszam = intszam / 10;
  32.                         i++;
  33.                 }
  34.                
  35.                 --i;                            // vissza·ll az utolso szamjegyre (ami az elso lesz)
  36.                
  37.                 if (sign == '-')        // elojel beszurasa
  38.                 {
  39.                         szamok[j] = '-';
  40.                         ++j;
  41.                 }
  42.        
  43.                 if (vezetonulla == 1)           // vezeto 0 es tizedespont beszurasa
  44.                 {
  45.                         szamok[j] = '0';
  46.                         ++j;
  47.                         szamok[j] = '.';
  48.                         ++j;
  49.                 }
  50.        
  51.                 while(i > -1 && (maxtizedes+3)!=j)      // lanc megforditasa es tizedespont beszurasa
  52.                 {
  53.                         szamok[j] = temp[i] + 48;               // konverzio ASCII-re
  54.                         ++j;
  55.            
  56.                         if (i == maxtizedes && i != 0 && vezetonulla != 1)
  57.                         {
  58.                                 szamok[j] = '.';
  59.                                 ++j;
  60.                         }
  61.                         --i;
  62.                 }
  63.         }
  64. }

Előre is köszi..
(#) Hp41C válasza don_peter hozzászólására (») Ápr 15, 2015 / 1
 
A szám 100 -szorosának egész részét konvertáld át karakterláncba és a kiírásnál az utolsó két karakter előtt írj ki egy pontot.
(#) don_peter válasza Hp41C hozzászólására (») Ápr 15, 2015 /
 
Most így oldottam meg:
  1. void _tortszam(float szam){
  2.         unsigned char i;
  3.         unsigned short adat;
  4.         adat = szam*100;
  5.    
  6.     for(i=0; i<5; i++){
  7.                 if(i==2){tortszam[i]='.'; i++;} // Tizedespontot kitesszük
  8.             tortszam[4-i] = adat % 10 + '0';
  9.             adat = adat / 10;
  10.     }
  11. }

Erre gondoltál te is elvileg..
(#) pipi válasza don_peter hozzászólására (») Ápr 15, 2015 / 1
 
Hali!
biztos szükséges a lebegőpötty?
Én kerülöm ahol csak lehet, a számot szorzom 100-al, int vagy long-ot használok amibe belefér, megcsinálom amit kell egészekkel, kijelzéskor pedig vagy saját rutin vagy a printf-el a szám/100, és a szám modulo 100 ...
ha nagyobb pontosság kell akkor 100 helyett ezer....
(#) don_peter válasza pipi hozzászólására (») Ápr 15, 2015 /
 
Igen, feszültség mérést akarok, és ott bizony van törtszám..
Mármint a végeredményben amit ki kell jeleznem...
(#) zenetom válasza killbill hozzászólására (») Ápr 15, 2015 /
 
Idézet:
„a tablazatkezeles sokkkkkal bonyolultabb”

Miért is?
(#) kissi válasza don_peter hozzászólására (») Ápr 15, 2015 / 1
 
Szia!

2,2/20=0,11 <-- ez float, sok számolással, nehéz aritmetikával !
Osztandó szorozva 100-al:
220/20=11, az eredményt osztjuk 100-al ( ami csak annyit jelent, hogy a tizedesvesszőt FIXEN, ELŐRE TUDVA 2 jeggyel előbb jelezzük ki ! ), ugyanúgy 0,11 és ez sokkal gyorsabb, egyszerűbb műveleteteket eredményez !

Remélem sikerült rávilágítanom a helyes útra ?!
(#) killbill válasza zenetom hozzászólására (») Ápr 15, 2015 /
 
Mert a 8 bites PIC utasitaskeszlete enyhen szolva szegenyes. Emlekeim szerint a retlw az egyetlen lehetoseg a flash-bol adat felolvasasara, azokbol meg csak ugy lehet tablat csinalni, ha 256 szohataron vannak. Ez kulon macera. Vagy ez mar nem igy van? De, ha van mas megoldas a flash olvasasra, akkor az biztos komplikaltabb, mint egy shift es egy negalas utasitas. De az is lehet, hogy tevedek, volt mar ilyen.
(#) zenetom válasza killbill hozzászólására (») Ápr 15, 2015 /
 
Ez igaz a 16F-es PIC-ekre, ott tényleg elég szegényes az utasításkészlet, bár ezesetben szerintem még a RETLW is használható lenne, esetleg annyit lehet kifogásolni, hogy a verem is használva lesz, a PC miatt..
Nade nem úgy a 18F-nél. Be lettek vezetve a táblakezelő utasítások, amivel elég hatékonyan lehet olvasni, és írni a programmemóriát. Ráadásul elég gyors, mert 2 ciklusidő alatt kiolvas bárhonnan, a 21 bites címről. Ráadásul lehet pre és és postinkrementálást-dekrementálást végezni a mutatóval, amihez nem kell külön utasítás. Szóval rendkívül hasznos dolog.
(#) pipi válasza don_peter hozzászólására (») Ápr 15, 2015 /
 
Hali!
Milyen feszültségmérő az aminek float a kimenete?
Egész szám lesz az, csak a konvertálásod után lehetne float, de azt meg minek, konvertáld úgy hogy az eredmény*100 legyen
vagy még inkább számolj milivoltban, jelezz ki xxx/1000 pötty xxx%1000
Lásd Kissi válaszát is
A hozzászólás módosítva: Ápr 15, 2015
(#) don_peter hozzászólása Ápr 15, 2015 /
 
Köszi srácok, Hp41C rávilágított a lényegre..
(#) killbill válasza zenetom hozzászólására (») Ápr 16, 2015 /
 
Akkor mea culpa. Nem tudtam, hogy a 18-as sorozatnak vannak ezek az utasitasai.
(#) Hp41C válasza zenetom hozzászólására (») Ápr 16, 2015 / 1
 
Az advanced midrange -ben új lehetőség van a táblázat kezelésére:
- retlw -s táblázatokhoz brw (relatív ugrás WREG tartalma alapján),
- ha az FSRxH regiszter legfelső bitje 1, akkor az indirekt műveletek a program memóriát érik el.
A hozzászólás módosítva: Ápr 16, 2015
(#) zenetom válasza Hp41C hozzászólására (») Ápr 16, 2015 /
 
Ezek a 12F1xxx PIC-ek (?).
Közben megnéztem, valóban, ez gyakorlatilag hellyettesíti a 18F-es táblaolvasó utasítást, jónak tűnik.
(#) tomi52 hozzászólása Ápr 25, 2015 /
 
Linux, MPLAB-X, XC8, free licence.
Sehogy nem sikerül cpp-t használnom. Én vagyok a béna, vagy ez nem megy az XC8-ban?
(#) potyo válasza tomi52 hozzászólására (») Ápr 25, 2015 /
 
Mi az a cpp?
(#) icserny válasza tomi52 hozzászólására (») Ápr 25, 2015 /
 
Tudomásom szerint az XC8 csak C, nem pedig C++. Egyedül a PIC32 kapcsán emlegetnek C++ fordítót (XC32++).
(#) tomi52 válasza icserny hozzászólására (») Ápr 25, 2015 /
 
Köszönöm a választ!
Kezdtem én is sejteni. Csak akkor igazán csinálhattak volna a fordítótól függően megjelenő menüpontokat. Mert a menüpontok megengedik, hogy cpp-t hozzak létre, igaz, egyből hiányol is dolgokat.
Következő: »»   111 / 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