Fórum témák
» Több friss téma |
Bakker TÉNYLEG!De birka vagyok. Nem gondoltam arra, hogy nekem a sorrend nem lényeg!!!!
Köszi szépen!
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?
Mivan akkor, ha "%10i"-t írsz, tehát minusz nélkül?
Hát akkor meg csak a szöveget írja ki, értéket meg nem.
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ó?
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!!!!!!!!!!!!!!!!!
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.
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.
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...
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.
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)
Nem erted akkor amit irtam. A Te fvenyed igy nez ki.
Pl ebben a formaban:
Szia!
Sajnos ezzel kezdtem, de nem megy Délután leszek, teszek fel képeket...
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...)
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?
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.
Amit lidi ill jomagam is mundtunk a buffer tulcsordulassal kapcsolatban, az nem jott be ezek szerint?
Arra rá jöttem hogy ez nem hex file ha valaki tudna segíteni c-> asm előre i kösz!
MPLAB->wiev fül->Disassembly listing
Idézet: 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.„Mit kell tennem hogy a C -> asm kód legyen?” 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.
Amugy minek neked az asm allomany? Mit szeretnel tanulmanyozni benne?
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
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
Köszönöm megszületett .lkr file nem volt megadva most már van hex igy már megy a Disassembly listing!
Idézet: 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).„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.” 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.
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!
Idézet: 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!„mert a hex 36 990 Enable all optimalizálva a Total Commander szerint” 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!
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!
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. |
Bejelentkezés
Hirdetés |