Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   51 / 153
(#) Wudoou válasza kissi hozzászólására (») Nov 28, 2011 /
 
Bakker TÉNYLEG!De birka vagyok. Nem gondoltam arra, hogy nekem a sorrend nem lényeg!!!!
Köszi szépen!
(#) Wudoou hozzászólása Nov 29, 2011 /
 
Megint lenne egy problémám. Sikerült megcsinálni az átlagolást, most már csak annyi van, hogyha sprintf-fel csinálom, akkor az első helyiértékű számom nem szám hanem valami hülye karakter. A többi jó. Ha a sprintf argumentumában nem írok elő balra igazítást akkor úgy járok, mint tegnap. Viszont akkor helyes a helyiértékű szám. De ha meg igazítok akkor meg nem.
sprintf (buf,"%-10i",x);
Ekkor van az az idióta karakter. Olyan mint egy kszi.
sprintf (buf,"%i",x);
Ekkor meg az a baj, mint tegnap. Esetleg valaki tudna segíteni?? Mit csinálok rosszul?
(#) potyo válasza Wudoou hozzászólására (») Nov 29, 2011 /
 
Mivan akkor, ha "%10i"-t írsz, tehát minusz nélkül?
(#) Wudoou válasza potyo hozzászólására (») Nov 29, 2011 /
 
Hát akkor meg csak a szöveget írja ki, értéket meg nem.
(#) Wudoou válasza Wudoou hozzászólására (») Nov 29, 2011 /
 
Van egy konverziós függvényem ami karakterekké konvertál. Azzal szépen megy.
A bemenete az ADC értéke.
void senddecimal (unsigned char)
{
char temp, temp2;
temp=input;
temp2=temp/100;
lcd_putch('<');
lcd_putch(temp2+'0');
temp=temp%100;
temp2=temp/10;
lcd_putch(temp2+'0');
temp=temp%10;
lcd_putch(temp+'0');
lcd_putch('>');
}
Ezzel szépen kiírja, csak hát nem valami szép.
Itt ezzel miért jó?
(#) Wudoou válasza Wudoou hozzászólására (») Nov 30, 2011 /
 
Megcsináltam soros portra is vagyis nem az LCDre hanem a soros portra küldtem ki az ADC eredményét. Ha printf-fel kiiratom, akkor jó. Ha sprintf-fel előbb beteszem egy bufferba, majd azt puts-sel kiteszem, akkor ugyanaz a hiba, mint LCD-re. Az egyes helyiértékű számaim nem számok, hanem valami karakter. Pedig a buffert kiürítem a használat előtt(csupa 0-val töltöm fel).
Valaki tud ebben valamit segíteni, mert már kezdek megőrülni!!!!!!!!!!!!!!!!!
(#) lidi válasza Wudoou hozzászólására (») Nov 30, 2011 /
 
Puffer tulcsordulás nincs ? Azaz belefér a pufferbe amit beleírsz ? Célszerű lenne úgy tesztelned, hogy a puffert küldöd sorosra is. Csak hogy kiderüljön mi nem jó, a puffer tartalma, vagy az lcd re írás.
(#) vilmosd válasza Wudoou hozzászólására (») Dec 1, 2011 /
 
Es mit teszel a temp valtozoba? Mert azert el kellene nevezni a hivo valtozot is!! Utana azt tenni a temp valtozoba. Lehet hogy mukodne is a fvny.
(#) trudnai válasza Wudoou hozzászólására (») Dec 1, 2011 /
 
Hogyan iratod ki a buffered tartalmat? Ugyanis ha buffer tulcsordulasod van attol meg az elejenek stimmelnie kellene, de ha a kiirato rutinod a lezaro 0-ig megy akkor lehez azt is mar felul irtad es elkezd eszeveszettul irkalni aminek csak a vegeredmenyet latod. (Ja latodm, lcd_puts(), akkor az 0-ig irkal...)

Akkor ahogy lidi irta puffer tulcsordulas lesz es felul irod a lezaro nullat is es emiatt valami memoria szemetettel felul irja az eredeti szovegedet avagy az kiscrollozodik a kepernyorol.

Noveldd meg a buffer meretet, es kiiras elott mindenkepp tegyel kenyszer lezaro nullat a string vegere (sprintf nem biztonsagos fuggveny!)

Tehat az lcd_puts() hivasa elott, sprintf utan:

Ha 20 karakteres az LCD-d:
buf[20] = '\0';

Es termeszetesen a buf 21 karakteres, mert 20 karakter a kiirashoz es 1 a lezaro nulla. Ettol meg sprintf csinalhat neked buffer tulcsordulast de legalabb a megjelenites remelhetoleg jo lesz...
(#) Wudoou válasza vilmosd hozzászólására (») Dec 1, 2011 /
 
Ez csak egy függvény, nem a forráskódból való.
De ha ezzel iratok ki,akkor jó.
Amúgy a temp egy globális változó, amibe kerül bele az adc értéke.
(#) foxi63 hozzászólása Dec 3, 2011 /
 
Hali !
ccs c compilert használok MPLAB alatt. Szeretnék saját .c
és .h állományokat csatolni a projecthez, ha esetleg valaki segítene ebben. Nem a C nyelvvel van problémám.
a ccs c helpje nem ad megoldást, az ott lévő utalás nem működik. (nálam)
(#) vilmosd válasza Wudoou hozzászólására (») Dec 4, 2011 /
 
Nem erted akkor amit irtam. A Te fvenyed igy nez ki.
  1. void senddecimal (unsigned char)
  2. {
  3. char temp, temp2;
  4. temp=input;
  5. temp2=temp/100;
  6. lcd_putch('<');
  7. lcd_putch(temp2+'0');
  8. temp=temp%100;
  9. temp2=temp/10;
  10. lcd_putch(temp2+'0');
  11. temp=temp%10;
  12. lcd_putch(temp+'0');
  13. lcd_putch('>');
  14. }
Itt ugye tipus void, viszont a definicioban szoktuk megadni a hivas parametereit. Ez ugye itt unsigned char. Illik adni egy valtozo nevet pl "void xyz(unsigned char x)", amivel hivod a fvenyt. Tehat ebben a formaban:
  1. xyz(input);
kell a hivast megcsinalni. Viszont ha az "input" egy globalis valtozo akkor a fveny definicio igy kell hogy kinezzen:
  1. void xyz(void)
, tehat nincs tipusa es neve a hivo parameternek. A Te esetedben a fordito akarmit is fordithat, mert nem szabvany szerint irtad a fvenyt.
(#) vilmosd válasza foxi63 hozzászólására (») Dec 4, 2011 /
 
Pl ebben a formaban:
  1. #include "flex_lcd.c"
Ez egy szabvany C includolas amit hasznalunk a CCS C-ben is. Masik megoldas, hogy a "Project" fulon "Add" utasitassal hozzaadod a projecthez a kivant filet.
(#) foxi63 válasza vilmosd hozzászólására (») Dec 4, 2011 /
 
Szia!
Sajnos ezzel kezdtem, de nem megy
Délután leszek, teszek fel képeket...
(#) trudnai válasza vilmosd hozzászólására (») Dec 4, 2011 /
 
Bocsanat, hogy kozbe szolok, de ugyan meg lehet ezt tenni, megis kerulendo! Az include-olas header file-ok beinkludolasara hasznalatos ahol makrokat, fuggveny deklaraciokat, tipusokat, strukturakat es valtozokat definialjuk. Ha mas C-t akarunk hazza biggyeszteni akkor ahogy mondod project file-ban kell megtenni es rabizni a linkerre a tobbit (es akkor rendesen be lehet allitani a globalis valtozok es fuggvenyek elerhetoseget...)
(#) Soós Antal hozzászólása Dec 4, 2011 /
 
Helló mindenki elmélet szinten csinálok egy PIC es vezérlést / MÉG NEM VETTEM MEG A PIC -et és az égetőt/

C nyelven MPLAB IDE 8.10
megírtam a progit
Letöltöttem a következő fordított C18 3.10 full

Sokadik javításra ez lett a végeredmény

Faild hiányzik a projectnev.cof
de ettől még ezt írja
BUILD SUCCEEDED ez gondolom jót jelent

vezerlo.c ből csinált egy vezerlo.o

csak hogy én egy asm kódot szeretnék látni, ill ez a vezerlo.o hex file akkar lenni?

Mit kell tennem hogy a C -> asm kód legyen?
(#) Wudoou válasza vilmosd hozzászólására (») Dec 4, 2011 /
 
Teljesen jogos, amit írsz.
De én csak bevágtam ide ezt a függvényt, hogy ha ezt használom akkor müxik.
Tehát a program elején deklaráció pl
void dec (insigned char x); de x helyett lehet bármi
majd a main után definíció.
A mainben meg hívás.
Ezzel tisztában vagyok, de nem ezzel van a gondom, hanem a sprintf használatával.
Szóval ha arra tudsz valami okosat mondani, azt nagyon szépen megköszönném.
(#) trudnai válasza Wudoou hozzászólására (») Dec 5, 2011 /
 
Amit lidi ill jomagam is mundtunk a buffer tulcsordulassal kapcsolatban, az nem jott be ezek szerint?
(#) Soós Antal válasza Soós Antal hozzászólására (») Dec 5, 2011 /
 
Arra rá jöttem hogy ez nem hex file ha valaki tudna segíteni c-> asm előre i kösz!
(#) foxi63 válasza Soós Antal hozzászólására (») Dec 5, 2011 /
 
MPLAB->wiev fül->Disassembly listing
(#) icserny válasza Soós Antal hozzászólására (») Dec 5, 2011 /
 
Idézet:
„Mit kell tennem hogy a C -> asm kód legyen?”
Nem lesz belőle asm. A c18 fordító a -s opció hatására kiköp valamit, de sok köszönet nincs benne.

Az MPLAB-ban megnézheted a Disassembly ablakot vagy a Program memóríát de attól sem feltételnül leszel boldog.

Az .o az oject fájl, azt már linkelni kell(ene). Valamiért nem sikerült nálad, ezért nem lett belőle .cof és .hex állomány.
(#) trudnai válasza Soós Antal hozzászólására (») Dec 6, 2011 /
 
Amugy minek neked az asm allomany? Mit szeretnel tanulmanyozni benne?
(#) Soós Antal válasza trudnai hozzászólására (») Dec 6, 2011 /
 
Csak tanulás képen de igazából a főgond hogy a hex sincs meg!
Sokan írják hogy a C miatt nem látni a PIC működését igaz én C ben se előre megírt függvényekkel operálok, hanem itt is én állítgatom a regisztereket. Csak az p18F4550.h csatolom.
Még az lcd kiírásnál is saját függvény vágja karakterekre a szöveget ill alakítja át az int típusú számot karakterekké és rakja az egyes kimenetekre bitenként.
De azért megnézegetném az asm is főleg azért hogy esetleg megtudjak írni 1- 2 betétet. bár a késleltetést is for ciklussal csinálom / majd lemérem hány ciklus 1 ms /

Nekem könnyebb lenne úgy tanulni az asm hogy megírom C be aztán meg nézem hogy nézne ugyan ez ki asm be

Esetleg valaki ide írná hogy legalább .o miért nem linkel cof ill hex file -t

Az MPLAB ban MPLINK Object linker nél meg van adva linker helye C:\MCC18\bin\mplink.exe mégse csinálja meg.

Van egy ilyen is azt is próbáltam C:\MCC18\bin\_mplink.exe

azzal se
(#) Soós Antal válasza Soós Antal hozzászólására (») Dec 6, 2011 /
 
ez lesz

MPLINK 4.1, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - linker command file required.
Errors : 1

Release build of project `C:\MCC18\bin\kkk.mcp' failed.

csak akkor megy ha az mplink.exe helyett a mcc18.exe adom meg akkor lesz .o file
(#) Soós Antal válasza icserny hozzászólására (») Dec 6, 2011 /
 
Köszönöm megszületett .lkr file nem volt megadva most már van hex igy már megy a Disassembly listing!
(#) icserny válasza Soós Antal hozzászólására (») Dec 6, 2011 /
 
Idézet:
„Nekem könnyebb lenne úgy tanulni az asm hogy megírom C be aztán meg nézem hogy nézne ugyan ez ki asm ben.”
Ennek is van értelme, erre szolgál a Disassembly ablak. De ha benézel a honlapomra, a PICCOLO projekt első fejezeteiben található leírások és apró példák is hasznosak lehetnek. (feltételezem, hogy a PIC18F4550 érdekel, ha már azt említetted).

Sokan megfeledkeznek arról is , hogy az MPASM makroassembler, tehát az assembly programozást a "szokásosnál" áttekinthetőbb, kulturáltabb, hatékonyabb formában is lehet(ne) művelni.
(#) Soós Antal válasza icserny hozzászólására (») Dec 7, 2011 /
 
EZÚTON IS SZERETNÉK GRATULÁLNI A HONLAPODHOZ!

Miután rájöttem hogy a vezérlés nekem nagyon meredek mindenféle műveleti erősítős diódás hőmérő pótméter stb variálással megoldani és kijelzés akkor sincs és mivel C ben már programoztam jött az ötlet PIC. Ekkor találtam a honlapodra és főleg onnét variáltam C tudásom PIC C18 ra. / még fordítom se volt most jutottam odáig /

A 18F4550 is onnét jött bár valósszínű buktam a mert a hex 36 990 Enable all optimalizálva a Total Commander szerint, de már láttam a ChipCad nél 150 Ft drágában a 18f4525 verziót ami 48 kB Memoríás Láb kiosztás ugyan az csak még az RA7 is megvan de oda meg az RA6 úgyis a kristály megy a 10 analóg bemente meg elég meg 40 MHz is a 48 helyet!

Szerintem ez a legegyszerűbb és legolcsóbb vezérlési megoldás szinte mindenre hiszen a kijelzés egy olcsó LCD vel, a kezelés 2 ? vagy 3 nyomógombbal egy kis menüvel simán megoldható, Plusz a 12 analóg bementtel azt mér az ember amit akar / én hőmt./

Köszönet még egyszer a honlap ért! Tökéletes alap volt az LCD kezelésemnek csak leredukáltam 4 bites módra foglaltság figyelés helyet késleltetés bele a pozícionálást ki venni a gyári függvényeket pl printf / Saját magam vágom karakterekre és rakom rá bitenként az adatvonalra ill. az int típusból és saját függvény csinál karaktereket / és már kész is!

A legjobb a honlapodba a magyar leírás ill kommentek hogy mi mit csinál így nagyon könnyű belőle tanulni.

Gyári függvényekkel pont az a bajom hogy nem tudom mit csinálnak.

U. i
Szerintem az a hogy honlapodon használod a C nyelvet az a legjobb megoldás hiszen ugyan úgy te állítgatod regisztereket mint asm ben, de nem kerül egy if + értékadás százmillió utasításba.

asm az a bajom hogy ezer millió utasítást kell írnia ahhoz ami C be mondjuk csak ennyi i=125;

Ha úgy használom C ahogy honlapodon van akkor nem igaz hogy nem látom mit miért csinál a PIC és emiatt nem tudom kihasználni a képességeit. Szerintem nagyon kevés dologra kellhet ilyen használat mellet asm betét /pl. LCD vezérlő jelnél megtudjam adni az általad irt 2 -3 Nop utasítást mert hát a Delay10TCYx(); is kihagyom ha lehet.


Bocs ha kicsit off de mindenkép megszeretem volna köszöni ill másoknak ajánlani a honlapot!
(#) icserny válasza Soós Antal hozzászólására (») Dec 7, 2011 /
 
Idézet:
„mert a hex 36 990 Enable all optimalizálva a Total Commander szerint”
Ettől még nem kella Dunának/Tiszának menni, mert a HEX formátumban egy bájtot két karakter ábrázol, s még egyéb sallangok is vannak benne. Ennek tehát röhögve bele kell férnie a memóriába!

Ami a C nyelvet illeti: azért ajánlgatják folyton az assembly nyelvet, mert C-ben nem látod, hogy pl. megszakításnál hogyan menti el a szükséges változókat/regisztereket, hogyan kezeli a paraméterek átadását, vagy mit csinál egy szimpla LATAbits.LATA4 = !LATAbits.LATA4 utasításra. De ha ezek fontosak lesznek, utána tudsz nézni, vagy használhatsz assembly eljárásokat vagy betéteket.

Nyugodtan kezdd tehát azzal, ami számodra természetesebbnek tűnik, a többi meg majd kiderül menet közben!
(#) Soós Antal válasza icserny hozzászólására (») Dec 7, 2011 /
 
Köszönöm ez lényeges info!
Vicc hogy értem is amit írtál 1 bájt két karakter de én egyből ChipCad -es összehasonlító táblázatot árlistát kutattam pedig ez tök egyértelmű. Programban is egy csomó hex értékadás írtam, de erre sose jöttem volna rá hogy ez legalább kétszer akkora mint a valós program méret! Már lábakat, regisztereket is hasonlítgattam A / D ill. Timer miatt.

Ha túl nagy lenne a prog akkor a fordító reklamál?

Megszakításnál jelenleg egyenlőre csak az a fontos hogy utána minden mennyen tovább!
RB megszakítás gombok ill. TMR0 idő mérésre Szoftverben számolom a megszakításokat így lesz percem órám napom!
(#) potyo válasza Soós Antal hozzászólására (») Dec 7, 2011 /
 
Idézet:
„Szerintem nagyon kevés dologra kellhet ilyen használat mellet asm betét /pl. LCD vezérlő jelnél megtudjam adni az általad irt 2 -3 Nop utasítást mert hát a Delay10TCYx(); is kihagyom ha lehet.”


Oda pont nem kell asm betét, mert létezik Nop() "függvény", ami valójában egy makró, és egyszerű NOP utasításra fordul.
Következő: »»   51 / 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