Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   126 / 153
(#) kzozo válasza icserny hozzászólására (») Márc 20, 2016 /
 
Köszönöm, este kipróbálom.
(#) usane válasza killbill hozzászólására (») Márc 23, 2016 /
 
Nálam XC16-ba került, nem néztem meg mit optimalizál belőle az ingyenes verió , de kipróbáltam az eddigi funkciók működnek volatile nélkül is. Persze vele raktam a volatile-t mivel később valószínűleg megszakításban s lez használva.
(#) ativagyok hozzászólása Márc 25, 2016 /
 
Sziasztok!
Tápfesz megszűnése esetén szeretném menteni egy port aktuális állapotát beépített EEPROM-ba, megszakítással.
Az EEPROM-ba írást tehetem megszakításba közvetlenül, vagy nem célszerű?
(#) Wezuv válasza ativagyok hozzászólására (») Márc 25, 2016 / 1
 
Én oda tenném.
(#) zenetom válasza ativagyok hozzászólására (») Márc 25, 2016 / 1
 
Szia.
Arra nem árt figyelni, hogy lehetőleg 5V legyen a tápfesz, és lehetőleg ne menjen gyorsan 0-ra le, mert nem fogja tudni végrehajtani az EE írást.
Sajnos már jártam így.
(#) Wezuv válasza zenetom hozzászólására (») Márc 25, 2016 /
 
Nem az a lényeg, hogy hány V a táp, hanem az, hogy az előállítása(nyers tápfesz, regulátor, kondenzátor kapacitások, esetleg a PIC felé külön leválasztott tápág) megfelelően legyenek méretezve.
A hozzászólás módosítva: Márc 25, 2016
(#) zenetom válasza Wezuv hozzászólására (») Márc 25, 2016 /
 
Igaz. De ha mégsincs elég puffer, akkor gyorsan esik a fesz...
(#) ativagyok hozzászólása Márc 25, 2016 /
 
Köszönöm a válaszokat, akkor ott marad.
7805 stabilizátorral van előállítva a táp, jelenleg egy 680µF-os pufferral kísérletezek.
A HLVD feszültségfigyelő regiszter segítségével generálok megszítást. (PIC18F87k22)
A hozzászólás módosítva: Márc 25, 2016
(#) kzozo hozzászólása Márc 28, 2016 /
 
Sziasztok. Egy valós számot kell kijeleznem hétszegmenses kijelzőkön normálalakban. A szám legyen pl: 0.0005412345 . A kijelzőn ennyit szeretnék látni: "5.4 -4". A kitevőt megtudom határozni, de hogyan lehet a számot külön számjegyekre alakítani? Létezik erre függvény?, vagy egyéb módszer? Köszönöm.
(#) Hp41C válasza kzozo hozzászólására (») Márc 28, 2016 /
 
C: printf("%e",float_var); // Ha ismeri a C.
Na nem ismeri:
A számot megvizsgálod, hogy kisebb-e mint 10.
Ha kisebb, elkezded szorozni 10 -zel, addig , míg 1 és 10 közé nem esik, számolod a szorszások számát.
Ha nagyobb, elkezded osztani 10 -zel, addig , míg 1 és 10 közé nem esik, számolod a osztások számát.
kiírod az egész részt egészként.
Pont kiírása.
A törtrészt megszorzod 10 annyiadik hatványával, ahány tizedes jegyet szeretnél, az eredményt kiírod egészként.
Ha szorozni kellett akkor "E-" kiiratása, ha osztani kellett, akkor "E+" kiíratása.
A számolt szorzások / osztások számának kiíratása.
A hozzászólás módosítva: Márc 28, 2016
(#) killbill válasza Hp41C hozzászólására (») Márc 28, 2016 /
 
Idézet:
„C: printf("%e",float); // Ha ismeri a C.
Na nem ismeri”
Hát.. A C ismeri A kérdésben nem szerepelt C fordító megnevezés. Vagy azt mondod, hogy egyik PIC C konyvtar sem ismeri a %e-t?
(#) Hp41C válasza killbill hozzászólására (») Márc 28, 2016 / 1
 
Talán csak néhányan lennénk, akik assemby -ben számolnánk lebegőpontos számokkal. Így feltételeztem, hogy magas(abb) szintű nyelvet használ... Mivel a topik címében a Microchip szerepel, ezekre a fordítókra koncentráltam... Hiába ismeri az AVR ill. a ARM fordító, ha PIC -re kell a megoldás.
A hozzászólás módosítva: Márc 28, 2016
(#) kissi válasza Hp41C hozzászólására (») Márc 28, 2016 /
 
A
Idézet:
„Létezik erre függvény?”
nekem is a C-t sugallja !
(#) kzozo válasza Hp41C hozzászólására (») Márc 28, 2016 /
 
Köszönöm, megpróbálom.
(#) killbill válasza Hp41C hozzászólására (») Márc 28, 2016 /
 
Felreertesz. En csak annyit kerdeztem, hogy egyetlen PIC-es C konyvtar sem tamogatja a %e-t. Mert ez nem C fordító, hanem könyvtár kérdése. Kiprobaltad vagy megnezted, hogy pl. a pic32-hoz jaro library-ben mukodik-e a %e? Szoval igazabol arra lennek kivancsi, hogy mibol vontad le azt a kovetkeztetest, hogy a (PIC) C nem ismeri a %e-t. De ez puszta kivancsisag, nem kotekedni akarok.
A hozzászólás módosítva: Márc 28, 2016
(#) Hp41C válasza killbill hozzászólására (») Márc 28, 2016 /
 
Ezekből a leírásokból:
XC8 V1.33: (DS50002053D) szerepel benne a %f és a %e -is.
C18 V3.47: (hlpC18Lib.chm) nem szerepel benne az egyik sem.
A hozzászólás módosítva: Márc 28, 2016
(#) killbill válasza Hp41C hozzászólására (») Márc 28, 2016 /
 
Akkor mégiscsak ismeri. Legalább is az XC8. A masik meg semmilyen lebegopontos kiirast nem tamogat. Ezt mondjuk meg is ertem. Nekem van olyan konyvtaram ARM-hez is, amiben egy direkt csokkentett tudasu printf is van, pont azert, mert felesleges a kodot novelni olyannal, amit egyebkent nem hasznal az ember. Marpedig a lebegopontos aritmetika az eleg huzos cucc. Egyszer 25 eve en is hasznaltam 68HC11 mikrokontrolleren (assembly-ben irtam meg az egesz float aritmetikat), de ma mar egesz biztos, hogy 32 bites fixpontos aritmetikaval oldanam meg az adott feladatot. Es minden kezdot is arra biztatok, hogy mikrokontrolleren ne hasznaljon lebegopontos szamitast, mert lassu, nagy, es a legtobbszor teljesen felesleges.
(#) usane hozzászólása Márc 29, 2016 /
 
Hello!

Egy kis magyarázatot kérnék, mert már nem tudok gondolkodni a pipától.
Ha egy unsigned long változtót belepréselek egy unsigned int-be akkor miért 32768-nál száll el és miért nem 65535-nél? (XC16)
Egy órát szívattam magam mire rájöttem mi baja, de ha 65535-nél szállt volna el akkor rögtön tudom. Tudtam , hogy a típuskonverziókkal van baj, csak azt hittem valhol számításoknál szállt el.
(#) foxi63 válasza usane hozzászólására (») Márc 29, 2016 /
 
Szia!
Nem szabad elszállnia, a tipuskonverziónak jónak kell lennie.
Esetleg Használj uniont, ekkor nem kell tipuskonverzió .
(GenericTypedefs.h )
(#) killbill válasza usane hozzászólására (») Márc 29, 2016 /
 
Egesz pontosan mi a problema?
(#) usane válasza killbill hozzászólására (») Márc 30, 2016 /
 
Egész pontosan a következőt követtem el.
  1. unsigned int[3] *p = {&OC1R,&OC2R,&OC3R};
  2. volatile unsigned long b;
  3. unsigned char v;
  4.  
  5. main{
  6. while{
  7. //case szerkezet növeli vagy csökkenti "v"-t 0 és 10 között pl: fel,  le gomb(100% prellmentes).
  8. //A "b" timer3 megszakításban változik.
  9.  
  10.         if ((b < (v * 500 )) && (T3ON == 0))
  11.         {
  12.             dir = up;
  13.             T3ON = 1;
  14.         }
  15.         else if ((b > (v * 500 )) && (T3ON == 0))
  16.         {
  17.             dir = down;
  18.             T3ON = 1;
  19.         }
  20.         else
  21.         {
  22.             T3ON = 0;
  23.            
  24.         }
  25.         *p[0] = b;
  26. }
  27. }


T3 megszakításban ez van:

  1. if ((b<50000) && (dir == up)) b++;    
  2.         else if ((b >0) && (dir == down)) b--;
  3.         else dir = 0;
  4.         IFS0bits.T3IF = 0;

A 6. lépésig azaz amikor a "b" 30000 lesz úgy működik ahogy kell.
A 7.-nél nem egyet ugrik hanem rögtön felszalad a 10. lépésig, vagyis csakis 32768-nál szállhat el.
Igaz elfér 16 bitben a "b" max értéke, de korábban 200000 volt azért maradt long.
Azt nem értettem miért 32768-nál van gond miért nem 65535-nél.
A hozzászólás módosítva: Márc 30, 2016
(#) killbill válasza usane hozzászólására (») Márc 30, 2016 /
 
Oszinten szolva nem egeszen ertem, hogy mit jelent a 6. es 7. lepes. De mondjuk feltetelezem, hogy (v * 500 ) az 5000 akart lenni, csak valamiert hianyoznak a nullak.

A (v * 5000) kifejezes meger par sort: A 'v' unsigned char, tehat eleve 'int'-kent kezeli a fordito. Az 5000 szinten 'int'. Ezert a szorzas eredmenye is int lesz, tehat -32768 es 32767 kozotti erteket vehet fel. A 7 * 5000 az mar negativ ertek lesz, ahogy te is kitalaltad.

Szerintem az lesz a megoldas, ha az 5000 helyett 5000u-t irsz. Ekkor az 5000 'unsigned int' lesz, es ezert a 'v'-t is unsignedre fogja alakitani, es a szorzas eredmenye is unsigned lesz.
(#) usane válasza killbill hozzászólására (») Márc 30, 2016 /
 
Igen az 5000 volt, csak azóta módosítottam egy kicsit és azt sikerült beírnom.
Ami a "v"-t illeti igazad van, rá is jöttem később csak nem javítottam már tegnap, viszont amit csináltam az, hogy ha v-t úgy hagyom uchar-nak és a "b"-t unsigned int-nek deklaráltam így is jól működött, ez nem fért már a fejembe miért. Közben már táblát is vettem fel, úgyhogy mindenképpen át kell néznem hol, mi minek van deklarálva. Ami az 5000-et illeti szerintem úgy hagyom, a "v"-t uint-nek deklarálva jó így is, és különben is lehet, hogy 500 marad a végén, vagy csak 50, a táblától függ majd. Mindenesetre kösz a magyarázatot.

Még egy dolog. Emlékeim szerint az XC16-ban ellentétben a 8 bites foordítókkal az unsigned az alap és a signedet szokták jelölni, persze lehet, hogy keverem már valamivel. Tehát ez volt a másik ok amiért értetlenkedtem.
(#) killbill válasza usane hozzászólására (») Márc 30, 2016 /
 
Idézet:
„viszont amit csináltam az, hogy ha v-t úgy hagyom uchar-nak és a "b"-t unsigned int-nek deklaráltam így is jól működött, ez nem fért már a fejembe miért.”
Azert, mert ha 'b' unsigned int, akkor a (v * 5000) eredmenye int-ről unsigned int-re lesz konvertálva, ami valojában semmi, mert marad 16 bit. Ha viszont 'b' unsigned long, akkor a (v * 5000) szorzas eredmenye is át lesz alakitva unsigned long-ga. Ha v = 7, akkor az eredmeny 35000, azaz 0x88b8, ami long-ra konvertalva 0xffff88b8.

Ha v-t nem unsigned char-nak, hanem unsigned int-nek deklaralod, akkor szinten jol fog mukodini, mert akkor a szorzas eleve unsigned lesz, mivel 'v'-bol nem csinal int-et a fordito.
A hozzászólás módosítva: Márc 30, 2016
(#) usane válasza killbill hozzászólására (») Márc 30, 2016 /
 
Ez is világos.
Közben utána néztem utolsó kérdésemnek és mint kiderült valamivel kevertem.
XC16 manual:
Idézet:
„All unspecified
or signed integer data types are arithmetic type signed integer”

Pedig tuti, hogy valamelyik fordítóban ez fordítva működik, csak már nem emlékszem hol.
(#) killbill válasza usane hozzászólására (») Márc 30, 2016 /
 
A C nyelv definicioja (C11) szerint a sima short, int, long es long long az mindig signed. A char eseten a C fordito szabadsaga, hogy signed vagy unsigned lesz. Az explicit modon kiirt signed char es unsigned char megint egyertelmu. Egyes forditoknal parancssori opcioval lehet kivalasztani, hogy a sima char elojeles legyen vagy nem.
A hozzászólás módosítva: Márc 30, 2016
(#) usane válasza killbill hozzászólására (») Márc 30, 2016 /
 
Igen, így kéne, hogy legyen. Mondom már nem emlékszem honnan rémlik, még az is lehet, hogy nem C, bár szerintem a basic-ben is így van. Mindegy is. Frissítettem a memóriámat ezzel az infoval is.
(#) potyo válasza usane hozzászólására (») Márc 30, 2016 /
 
CCS fordítóban alap az unsigned
(#) usane válasza potyo hozzászólására (») Márc 30, 2016 /
 

Tudtam, hogy valamelyikben az az alap. Köszi a megerősítést.
(#) killbill válasza potyo hozzászólására (») Márc 30, 2016 /
 
Idézet:
„CCS fordítóban alap az unsigned”
Mire alap az unsigned? Mindere vagy csak a char-ra?
Következő: »»   126 / 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