Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   48 / 153
(#) lokátoros válasza zenetom hozzászólására (») Szept 22, 2011 /
 
Nincs mit.
Még egy tipp, ha változókat kell szorozni:
  1. unsigned int x1, x2;
  2. unsigned long y;
  3. x1 = 12345;
  4. x2 = 1852;
  5. y = (unsigned long)x1  * x2;


Igy a szorzás előtt konvertálja az a x1 változót. Nem túl szép ha sokszor kell tipust kényszeríteni, de hatásos.
(#) zenetom válasza lokátoros hozzászólására (») Szept 22, 2011 /
 
Float típusú számításoknál is hasonló a helyzet?
(#) lokátoros válasza zenetom hozzászólására (») Szept 22, 2011 /
 
Az Ansi C standard szerint a float a művelet előtt double-lé konvertálódik és azt eredmény is az lesz.

A C18 esetében azt hiszem a double mérete akkora mint a float, de lehet hogy tévedek.
(#) zenetom válasza lokátoros hozzászólására (») Szept 22, 2011 /
 
Idézet:
„A C18 esetében azt hiszem a double mérete akkora mint a float”

Ez elvileg így van... :yes:
(#) watt válasza zenetom hozzászólására (») Szept 22, 2011 /
 
Teljesen. Én is ebben a cipőben járok mostanság, miután polinom együtthatókkal kell dolgoznom.
Például, ha egy long típust, float változóba akarsz osztani, elég ennyi:
  1. szam_float=(float)szam_long/10;
(#) zenetom válasza watt hozzászólására (») Szept 22, 2011 /
 
Most próbálom a float típust elkerülni, mert elég nagy gubancot csináltam.
Szerk.: bár nem ide tartozik, de van olyan PIC, amiben hardveres osztó van?
(#) lokátoros válasza zenetom hozzászólására (») Szept 22, 2011 /
 
A PIC32 családban 32bites szorzó-osztó van.
(#) zenetom válasza lokátoros hozzászólására (») Szept 22, 2011 /
 
No még egy indok, amiért ki kéne próbálni a PIC32 típust.
(#) watt válasza zenetom hozzászólására (») Szept 22, 2011 /
 
Ha jól rémlik a dsPIC-ekben is van.
A float elég erőforrás igényes, de nem vészes, elég gyors a PIC, csak zabálja a program memóriát ha sok a művelet.
(#) mammut hozzászólása Okt 7, 2011 /
 
Üdv!

Újra elővettem a régi ledmátrixomat, mert már valamit kellene kezdenem vele...
A HI-TIDE HI-TECH C PRO 9.60PL2 fordítóját használom, a cél ic PIC16F59.
A problémám az, hogy folyamatosan hibával bombáz a fordító, pedig eredetileg 16F57 volt a vezérlője mégis ráment a program.
(1253) could not find space (18 bytes) for auto/param block [C:\Program Files\HI-TECH Software\PICC\PRO\9.60\sources\wmul.c]
Az eredeti program a led.c, az átírt pedig a main.c .
Valaki megtudná nézni mi lehet a gond?

Köszönöm!
(#) icserny válasza mammut hozzászólására (») Okt 7, 2011 /
 
Nincs hely a RAM memóriában!
(#) trudnai válasza mammut hozzászólására (») Okt 7, 2011 /
 
Idézet:
„const unsigned char CoName[224]={”

Csak egy otlet: Nem tudom ennel a forditonal konkretan hogyan van, de van olyan PIC fordito ahol kulon meg kell adni a 'rom' kulcsszot is, nem eleg neki a 'const' hogy ROM-ba keruljon a tabla.
(#) mammut válasza trudnai hozzászólására (») Okt 8, 2011 /
 
Egy kisebb fajta fordulat a dologban, hogy a pointer függvénynél levő cnt_flag kivétele csökkenti eggyel a hiányzó byte-ok számát.
value=*(CoName+(guide<<0)-(guide<<0)+cnt_flag);
Viszont mostmár nincs probléma, lefordul a program, majd műszaki javításokat kell végeznem az élesztés előtt.
Ezzel a HI-TIDE-al sosem voltam kibékülve, mindig más szituációt hoz egy forráskódnál, most kibővítettem az eredeti nyomógomb és állapotgép kezeléssel és mégis lefordul a program, megcsonkítva viszont sipákol.
Lehet, hogy ez a 45 napos PRO próbaverzió átka.

Kb. 2010-es hsz-emben írtam erről a dologról, még akkor az volt a problémám, hogy nem megy a teljes kijelző felület elérése, minden 7. sor után egy sort kihagy, vagyis folytatja a kijelzést.
A gyári dokumentációt csatolom.

Ha esetleg valaki tudna egy kis transzformációs segítséget adni, hogy ezt a programot meg lehet-e assembly-ben írni, támogatnám.

Köszönöm a segítségét minden szak fórumtársnak!>>>>
(#) Ideiglenes hozzászólása Okt 8, 2011 /
 
Miután már többször átbogarásztam a leírást és mégsem találtam a megfelelő választ, ezért a kérdésemet felteszem ide is, hátha valaki járatos a témában. Nagyon régóta az SDCC fordítót használom, ugyanis ott világosan látszódik, mire fordítja le a C sorokat a program, amiből viszont szintén kiviláglott, hogy a korábban megírt assembly rutinjaimat hogyan tudnám beilleszteni objektum szinten a PIC programjába, meg hogy milyen módon férhetek hozzá C-s változókhoz az assembly rutinban, illetve assembly változókhoz a C-rutinokban.
PIC váltás miatt azonban ( az SDCC nem támogatja még a 16F1xxx sorozatot ), előszedtem a HITech fordítóját. Ott már mindent C-ben kellett megírnom, egyrészt az idő rövidsége miatt, másrészt meg nem látok assembly listát, ami segítene az illesztésben.
Kérdés tehát, hogy hogyan lehetne rávenni a HITech fordítót, hogy assembly listát generáljon, illetve melyik dokumentáció taglalja a paraméterátadásokat, változónév használatokat külső objektumok és a HITech C kódja között?
(#) watt válasza mammut hozzászólására (») Okt 8, 2011 /
 
Mindent meg lehet írni ASM-ban. Hogy meg tudod-e, azt nem tudhatjuk. Ha ilyen dolgokat csinál egy fordító, akkor váltani kell. Nekem a gyártó oldaláról letöltött Hi-Tech C semmi ilyesmit nem csinál!
(#) watt válasza Ideiglenes hozzászólására (») Okt 8, 2011 /
 
A fordító készít egy *.lst fájlt. Ebben minden tökéletesen megvan.
(#) watt válasza watt hozzászólására (») Okt 8, 2011 /
 
Ja és van egy *.as is...
(#) MPi-c válasza Ideiglenes hozzászólására (») Okt 8, 2011 /
 
Idézet:
„melyik dokumentáció taglalja a paraméterátadásokat, változónév használatokat külső objektumok és a HITech C kódja között?”

A PIC10/12/16 User's guide valamint a PIC18 manual is 3. fejezetben a "MIXING C AND ASSEMBLY CODE" részben leírja.
Idézet:
„hogyan lehetne rávenni a HITech fordítót, hogy assembly listát generáljon”

watt válasza plusz .as kiterjesztéssel ezt megteszi, illetve MPLAB-ben a Disassembly Listing-gel szépen megnézhető...
Látom írás közben az ".as" is felmerült...

disass.png
    
(#) Ideiglenes válasza MPi-c hozzászólására (») Okt 8, 2011 /
 
Köszönöm a válaszokat.
(#) peti13 hozzászólása Okt 8, 2011 /
 
Sziasztok! Szerintem ebbe a topicba még belefér a kérdésem. Azt szeretném megtudakolni, hogy amikor C18-al usart-on akarok adatot küldeni, akkor ugye ezt a parancsot használom : putrsUSART("szöveg") és ez még megy is, remekül, de ha egy számot, vagy egy számot tartalmazó változót akarok elküldeni vele pl.: putrsUSART(10) akkor egy halom értelmetlen karaktert rak be. Szóval nem tudjátok, hogy milyen függvénnyel lehet egy értéket elküldeni a PIC-nek usart-on? Előre is köszönöm!
(#) zenetom válasza peti13 hozzászólására (») Okt 8, 2011 /
 
Szia!
Tedd idézőjelek közé, így: putrsUSART("10");
Valószínűleg az ASCII kódot küldte ki. Ha ASCII kódban akarod kiküldeni, akkor két karaktert kell elküldeni, az "1"-et és a "0"-át így:
  1. putrsUSART(49);    / az "1" ascii kódja: 49 (decimálisan!)
  2. ...
  3. putrsUSART(48);    / a "0" ascii kódja: 48 (decimálisan!)
(#) icserny válasza peti13 hozzászólására (») Okt 9, 2011 /
 
Ha ragaszkodsz a karakterfüzért küldő függvényhez, akkor a numerikus adatokat előbb szöveggé kell alakítani, nem feledkezve meg a szöveget lezáró nulláról sem.

Én inkább a karakterenkénti küldést használom, s a számok kiírásához egy ilyen függvényt használok:
  1. /** Decimális kiíratás adott számú tizedesjegyre.
  2.  * \param data a kiírandó szám (előjelesen)
  3.  * \param ndigits a kiírandó tizedesek száma
  4.  */
  5. void outdec(long data, uint16 ndigits) {
  6. static char sign, s[12];
  7. uint16 i;
  8.   i=0; sign='+';
  9.   if(data<0) { sign='-'; data = -data;}
  10.   do {
  11.     s[i]=data%10 + '0';
  12.     data=data/10;
  13.     i++;
  14.     if(i==ndigits) {s[i]='.'; i++;}
  15.   } while(data>0);
  16.   _usart_putc(sign);
  17.   do{
  18.     _usart_putc(s[--i]);
  19.   } while(i);
  20. }


Az első paraméter a kiírandó szám (előjeles 32 bites egész), a második paraméter a levágandó tizedesek száma. Például, ha a feszültség mV egységekben van megadva, akkor

outdec(3300,3) hatására +3.300 íródik ki. Ha a hőmérséklet tizedfokokban adott, akkor
outdec(273,1) hatására +27.3 íródik ki.
(#) watt válasza peti13 hozzászólására (») Okt 9, 2011 /
 
Nos, első körben azt kéne tudni, hogy mit akarsz elküldeni. A 10 értékét(azaz a bájt ami átmegy hex 0x0A legyen), vagy az 1 és 0 karaktert egymás után. Ez utóbbinak nem sok értelme van szerintem, mert a forgalmat jelentősen növeli. Ha átküldöd a 10-et, mint szám, akkor az majd a PIC-ben alakíthatod át kijelzendő digitenkénti karakterkódokká. Az értéket a putcUSART-al tudod küldeni egyenként.

Annyit még megjegyzek, hogy a putcUSART egy agyrém! Ha megnézed a gyári kódot, akkor láthatod, hogy egy sorért, a TXREG=változó -ért egy szubrutint alkottak. Ez borzasztóan erőforrás igényes és abszolut felesleges tortura. Tudom, először a lényeg, hogy működjön, de gondoltam adok egy löketet, hogy érdemes mögé nézni a dolgoknak. A while (BusyUSART()); hasonló agyrém. A while(!TXSTAbits.TRMT) ugyanazt csinálja. Ha készítesz hozzá egy definíciót így: #define TX_Redy TXSTAbits.TRMT akkor ilyen formában lehet használni subrutinhívás nélkül:
  1. while (!TX_Redy);// Adás készenlétre várakozik
  2.  TXREG=(RS485_Buffer[CIM]);  // Cím elküldése a Központnak
(#) watt válasza watt hozzászólására (») Okt 9, 2011 /
 
Csatoltam két képet, látható, hogy az ajánlott verzió két utasításra fordítódik, a másik pedig nem is számolom és a CALL-t nem is említem! :bummafejbe:
(#) peti13 válasza icserny hozzászólására (») Okt 9, 2011 /
 
Beillesztettem a kódod, és kis alakítással sikerült küldeni számot, szóval köszönöm szépen! Watt: Igazából a puTTY nevű konzol programmal küldök a pic-nek egy hex kódot, és utána rávenni a hogy egy értéket, valami 0-255-ig küldjön vissza nekem. Ez úgy tűnik most már működik is. Csak az a bajom, hogy áttérnék visual basic-ben írt programra, magyarul onnan küldeni az infót a pic-nek csak az meg valamiért nem akar működni, de az már nem ide tartozik Köszönöm a segítségeteket!
(#) watt válasza peti13 hozzászólására (») Okt 9, 2011 /
 
A bajt én ott látom, hogy nem világos számomra, hogy tisztában vagy-e az elküldött bájtok információ tartalmával! Tudsz válaszolni a korábbi hozzászólásomban feltett kérdésimre? Mert a VB-vel pont másképp érdemes infót cserélni, mint most teszed.
(#) peti13 válasza watt hozzászólására (») Okt 9, 2011 /
 
Csak azt kérdezted, hogy mit akarok elküldeni én pedig mondtam hogy egy számot nullától 255-ig. Nem tudom amúgy, hogy hogy érdemes VB-ben adatot küldeni, de ahogy én akartam csinálni, az végül is sikerült.
(#) trudnai válasza peti13 hozzászólására (») Okt 9, 2011 /
 
Szerintem watt ugy erti, hogy Te atalaitod szovegge amit atkuldesz amit a masik oldalon vissza alakitasz. Es, hogy ez a modszer noha mukodik, feleslegesen foglalja a CPU idot es terheli a kommunikacios csatornat (hisz egy byte helyett 3-at kuldesz at egy szamhoz amennyiben atalakitod karakter lancca...).

Amugy az itoa() es atoi() fuggvenyek miert nem voltak jok?
(#) watt válasza peti13 hozzászólására (») Okt 9, 2011 /
 
255-öt el lehet küldeni úgy, hogy 0x32("2"), 0x35("5"), 0x35("5"), és úgy is, hogy 0xFF. Ez utóbbihoz semmi nem kell, csak TXREG=0xFF;
(#) peti13 válasza watt hozzászólására (») Okt 9, 2011 /
 
Ahh, így értem Hát igen, a másik megoldás tényleg jobb, majd még próbálkozom más módszerrel, ezen a pic-en úgyis csak "gyakoroltam" Majd egy másik pic-re kell a tényleges jól működő kódot megírnom, akkor bizonyára máshogy fogom csinálni, mert ez a mostani egy agyrém. Működik nagyjából, de nagyon össze vissza van meg zavaros. Mindenesetre, köszönöm a segítséget, biztos zaklatlak még titeket
Következő: »»   48 / 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