Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Ja, igen. Aki felinstallálta a 4.065 verziót, annak nem kellett ez. De ide feltettem neked.
sysy Bővebben: Link Remélem így már jó lesz, Brugó.
Kitünő ! Köszönöm ! A nagy Master of Reality adjon neked sok egészséget, hogy minél többet tudjál minket megőrvendeztetni !!!
Na itt egy példa, hogy miért utálom a CCS fordítót:
int1 Defines a 1 bit number int8 Defines an 8 bit number int16 Defines a 16 bit number int32 Defines a 32 bit number char Defines a 8 bit character float Defines a 32 bit floating point number short By default the same as int1 Int By default the same as int8 long By default the same as int16 Ki volt az az állat, aki így csinálta? Minden tisztességes fordítóban a short 8 bitet, az int 16 bitet, a long 32 bitet jelent!!! És ráadásul itt ha nem írjuk oda, akkor az alapértlemezett az unsigned, míg más fordítókban a signed az alapértelmezett...
Meg tudja valaki mondani, hogy lehet rom területen elhelyezett tömbre mutatót létrehozni? Pl. van ez:
const unsigned char str1[]={"abcde"}; const unsigned char str2[]={"fghij"}; és szeretném pl. a fentiek egyikét egy függvény bemenő paramétereként elhelyezni, pl. lcd_kiir(str1); Az nagyon nem szimpatikus megoldás, hogy másoljam át egy ram-ban található tömbbe a tartalmát, és küldjem azt át a függvénynek. ----------------------- C18-nál ez annyiból áll, hogy rom unsigned char str1[]={"abcde"}; rom unsigned char str2[]={"fghij"}; és a függvény prototípusa meg egyszerűen lcd_kiir(rom unsigned char * ptr)
Lehet hogy körülményes, de ha egyszer átállítja az ember, és mindig azt a headert használja, úgy alakíthatja, ahogy akarja.
továbbá az alábbiak egyikével ki lehet választani a defaultot
Szia potyo!
Oly sokat segítesz másoknak, most én próbálok neked.
Így lehet kiolvasni a programmemóriát is. Remélem tudtam segíteni.
Üdv!
Nekm ez így pl. működik:
Nekem az a bajom, hogy miért nem az az alapértelmezett, mint a többi fordítóban, aztán ha úgy tetszik, akkor állítsd át másra.
Kösz a próbálkozást, de igazából nem jutottam előrébb.
Megmutatom, mit csináltam C18-ban:
Majd egyszerűen meghívom így: LCD_putrSTR(hatar0); A függvény így néz ki:
Az LCD_buffer egy tömb, amiből egy másik, időnként meghívott rutin pakolgatja ki az LCD-re a karaktereket, amikor a kontroller "ráér". A hármas verzióju CCS-ben úgy nézem, ezt nem lehet megcsinálni. Most elővettem a négyes verziót, ebben már látom, hogy működik a rom kulcsszó, el is fogadja azt, amit írtam, csak ez meg nagyobb kódot generál, és enélkül is szoros már a helyzet. Egy 16F627-be kéne beleférni, aminek már így is majdnem tele van a progammemóriája, és a printf is újabb 60 utasítást tesz hozzá, ami már bőven túl van a határon, tovább optimalizálni meg már nemigazán tudom a kódot. Ami ötletem volt, azt már mind megcsináltam, hogy beleférjen. Egyébként kapacitásmérő lesz a dologból. Ha kész lesz, akkor majd igyekszem feltenni a kapcsolások közé.
Ezt meg tudom erősíteni, a CCS printf és variációi egy nagy szemét, akár ha csak pl. soros portra használja az ember, iszonyat kódot generál.
Sokkal jobb a saját rutin ilyenkor.
Sziasztok!
Egy olyan kérdésem lenne, hogy dsPIC30F4013-ra milyen C fejlesztő környezet van? Esetleg az újabb CCS valamelyike tudja már ezt a fajtát is?
A gyári Microchip C fordító létezik erre a kontrollerre is. Link
Köszi!
Nem tudod honnan tudnék letölteni hozzá kis okosítást?
Egyelőre nem, de biztos lehet találni hozzá. De a 60 nap után is működik, csak némi optimalizálást tilt le, valamivel nagyobb kódot ad, szóval nyugodtan kezdd el használni.
Elkezdek vele foglalkozni. Bár mondjuk kíváncsi lennék mennyivel lesz nagyobb a program így. Ha mégis tudsz szerezni, akkor szólj, please! Köszi!
A 60 nap alatt kitudod próbálni. Leveszed az optimalizálásokat, csak a level1-et hagyod meg, és megnézed úgy mekkorára fordít.
Sziasztok , lenne egy kis gondom C programozásilag.
Nem tudom jó helyen kérdezek-e. Sajnos még igen kezdő vagyok C ügyben , de megpróbáltam szerkeszteni egy kis programot, de sajnos teljesen nem működik úgy ahogy kellene , és sajnos nem teljesen értem mért. Ha lenne valaki aki rá tudna világítani a program hiányosságaira nagyon megköszönném! A progi lényege: sorsportról vár egy karakter, ha megvan kapacsolgatná a reléket, majd újra figyeli a sorsportot. Előre is köszönöm mindenkinek !
Szia ammateur,
Megis hogyan kellene viselkednie, es ehhez kepest hogy viselkedik - mert ezt elfelejtetted leirni PROBLEMA: Az if(seradat = "R") ket szempontbol sem jo. Az egyik, hogy mivel egyetlen egyenloseg jel van, az azt fogja neked okozni, hogy a seradatot feltolti egy ertekkel. Es itt a masik problema is, hogy idezojeleket hasznaltal aposztrof helyett, tehat az "R" egy string tipus lesz (char*) es nem char, tehat a seradatba a string cime kerul be.... helyesen if(seradat == 'R') lenne, de picit lejjebb irok meg egy kis kiegeszitest ehhez. Ami igy nekem meg szemet szurt, hogy a 'seradat' es az 'i' nincs inicializalva, emiatt hulyesegeket csinalhat - badarsag arra alapozni, hogy az nulla alapbol, az lehet neha igy van, foleg teszt soran, aztan a valosaban valahol egyszer nem ugy lesz es soha nem jossz ra majd mi okozza a hibat. A masik, hogy a seradattol fuggoen kisse furan egy while ciklusba lepsz, amit nem egeszen ertek miert igy csinaltad, es egyaltalan miert kella while, de rendben, igy akartad, mukodik igy is. Viszont a seradat megmarad R-nek, es ha igy pollozgatsz akkor lehet egy darabig mindig igaz lesz a feltetel amig a getc meg nem hivodik ujra. Amugy ez csak egy javaslat, hogy az if-ek es mindenfele ciklusok moge mindig tedd ki a {} jeleket megha meg is engedi a szintaktika annak elengedeset, mivel annak elhagyasa sok problemahoz vezethet. Ugyanigy az if-nel sokszor ugy szokas a feltetelt megadni, hogy: if ( 'R' == seradat ) { .... } ugyanis ebben az esetben ha megint veletlen egyetlen = jelet hasznalsz akkor a fordito szintaktikai hibaval kiakad...
Nagyon szépen köszönöm.
Hogy mért igy csináltam ? Mert fogalamam sem volt hogy lehetne mg másképp.. Korábban BASIC ben irogattam ,de tulságosan hamar elértem a nyelv korlátait, főleg a sorosportal voltak problémák , nem fogta meg rendesen az adatokat ... Kijavítom a hibákat és megpróbálom ismét !
Most vettem eszre, hogy neked a while(TRUE) utan van egy pontosvesszo, ez egy masik tipikus hiba. Sajnos ilyenkor a ciklus torzse ures, es onmagaban forg tekerni, igy a soros port kezelesig el sem jut. A szintaktika ezt ismet csak megengedi mert ilyenkor a ciklus torzsnek gondolt blokk egy sima blokk lesz, ami tokeletesen megfelel a C definicionak.
Megprobaltam atirni a programodat:
Namost, ha megnezed, akkor nem kell az if R utanra segedvaltozot hasznalni, ami utan egy egyszer vegigfuto while-be esik az egesz, siman egy blokkba be lehet tenni az if feltetel igaz agaba eso kodblokkot. Nem tudom figyeled-e az indentalast (sor-kiigazitast)? Ha jol indentalsz konyeben attekintheto a program, pl latod, hogy az if ill while blokkoknak megvan-e a lezaro kapcsos zarojele... ill hogy melyik kihez tartozik - olyan programnyelv is letezik ahol az indentacio szoros resze a szintaktikanak es el sem fogadja a fordito, hogy ha rossz karakter poziciora helyezed a dolgokat, de ebbe most ne menjunk bele, eleg ha odafigyelsz ra.
Sajnos még igy sem müködik.
A hiába hívom a rákapcsolt mobilt nem reagál. Közben észrevttem hogy a 4mhz az egyel kevesebb nulla és kijavítottam , megcseréltem az RX, TX lábakat is ..... #use delay(clock=004000000) // 4mhz #use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1) // soroport 9600,8,1,n (RB1 RX, RB2 TX) Amúgy a mobiltelefon közvetlen van rákötve a picre , 470 ohm ellenálásokkal az RX,TX ágakon. De gondolom ezzel nem lehet probléma , mert a BASIC ben írt programom, ha megcsöngetem a telefont , megcsinálja a kapcsolást , de csak 1x , aztán már nem második alakalommal nem reagál ......
Hogy oszinte legyek meg soha sem csinaltam interface-t mobilhoz, igy nem tudom elektronikusan hogy illik ra csatlakozni. En azt gyanitottam 3V-os interface lehet ezeknek, de lehet tevedek, ennek Te bizonyara utana neztel.
Szoval a pontosvesszot kivetted a while(TRUE) mogul? Kellene ratenni debug ledeket, vagy egy masik sorosat ami a PC fele kommunikalgat, hogy elkuldje amit vett. Pl. ha azt a programot veszed alapul amit csinaltam a Tiedbol, akkor egy led kigyulladhatna ha bemeny a while(TRUE) -ba (tehat ugye akkor mar biztos a pontosvesszo nem zavar be). Aztan meg egy mikor a kbhit igaz lesz. Aztan meg egy mikor 'R' betut vesz - azt el is altathatod a blokk vegen... kbhit() utan is legyen egy delay, az amugy sem art szerintem. Ha LED-del debuggolod akkor nyugodtam egy 250ms-et betehetsz, amugy sacc / kb 1-2ms. Ami gnd lehet kesobb, hogy az 'R' vetele utan sok varakopzas van, es igy a tobbi vett karakter elveszhet, es ha a hibat nem kezeled le lehet nem fog jol mukodni az rs232 rutinod. En sajnos nem CCSC-ben programozom minden nap, ugyhogy ennyire nem ismerem a fuggvenyeit, meg kellene nezni a doksit mi van ilyenkor. Tehat jon az 'R', tana jonne a "ING" is, de mivel R utan tul sokat varsz az rs232 modul magaba fordul amig a hibat le nem kezeled es nem fogad tobb karaktert... Igy a "DISCONNECT" sem erzekelheto mar - valami ilyesmire gondolok. Haladj lepesrol lepesre (ezert irtam igy le a debug ledeket, hogy lasd mikor akad el a dolog).
Az MPLAB ba egy az egyben beillesztettem a programot kicsit fentebb biertál.
Aztán kicsit később észrevettem hogy az RX és TX pin meg volt forditva a programban ,azt visszirtam, majd arra figyeltem fel hogy a 4MHZ az nem 4000000 volt. Megprobálom ezt a ledes dolgot, nem kell sokat csinálni hozzá ,mert relékhez ledek is vannak kötve, majd azokat kapcsolgatom és figyelem hogy meddig jut el a program. Az illesztéssel nem hiszem hogy baj lenne, mert ugyanarról a feszültségről megy a telefon is , meg a PIC is , igy nem kell jelszintet illeszteni szerintem. Majd este ujrapróbálkozom.
Ha van egy kis időd, érdemes lenne dokumentációkat olvasni és Assembly-ben megírni a programot. Sorosportot szerintem egyszerűbb abban kezelni...
MPLAB szimulátorban futtatva a programot arra a megálapytásra jutottam , hogy a "if (kbhit())" vizsgálatot mindig igaznak veszi, mert az utána következő részeket mindig végrehajtódnak.
Próbáltam betenni if (kbhit()==1) -et de valamiért igy sem jó.
Szerintem azért veszi mindig 1-nek, mert az a külső esemény hatására kell, hogy megváltozzon. A szimulátorban pedig nincs a külső esemény beállítva, hogy arra reagálhatna.
Az if (kbhit()) és az if (kbhit()==1) nem mindig jelentik ugyanazt, de ezesetben igen.
Ugy nezem, hogy mivel nem a hardveres labakat hasznalod az RS232-re, a kbhit akkor ad igaz erteket, ha a start bit bejott - hw-es modul hasznalata eseten ha mar bejott az egesz adatcsomag. Namost azt hiszem, hogy epp forditva vannak a jelszintek mint amit alapban az rs232 komm varna a PIC oldalon, ezert be kellene allitani egy INVERT flaget a #use rs232 hoz.
A 16F628A nak adatlap szerint az RB1 és RB2 a sorosportja.
Ha a jelző bit fordítva működik akkor talán a legegyszerübb ha : if (kbhit()!=1) et használok . Majd kipróbálom. De ha valaki tud valahol egy müködő sorosport fogadó rutint akkor azt is megköszönném.
Valoban, akkor mas a gond. A kbhit es forditott jelszintek nem egeszen igy van amugy ahogy mondod. A kbhit a doksi szerint ketfelekepp tud mukodni, maskepp mukodik ha hardveres usart modult hasznal, es maskepp ha szoftvereset. Ha hardveres, akkor megvarja mig beerkezik egy teljes byte es utana jelez, utana lesz csak kbhit igaz egeszen addig ameddig ki nem olvasod pl getch-val. A szoftveres modult hasznalva ezzel szemben mar a start bit megerkezesekor a kbhit beall, es azt gondoltam hogy nalad szoftveres modul van es mivel a jelszintek forditottak a stop bit helyett start bit szinten van a jel es ennek erzekelese miatt neked mindig kghit igaz lesz... De ha ardvereset hasznalsz nem tudom mi van ott, elmeletileg mikor a buffer kiurul es nincs bejovo adat akkor annak ott nem szabad folyton igaznak lennie. De azzal, hogy a lekerdezes feltetelet megvaltoztatod attol a logika uyanaz marad, ezert nem segit ez, csak az segitene ha INVERT-be rakos a portot... Szoval nem tudom mi van ott neked, es miert allandoan igaz a kbhit, ezt ki kell deritened - merd meg a jelszinteket is azert - ha maskepp nem kapcsold ki az RS232 modult es nezd meg mi a helyzet. En csak tapogatozni tudok, szoval valahogy mericskelj es szisztematikusan gyujtogesd az infokat amiket tudsz errol az egeszrol hatha ossze all a kep - pl vesd ossze a basic ben megirt firmware-eddel is, mert azt irtad azzal mar majdnem mukodesre birtad... ugy ertem mericskeld meg egyik ill masik firmware-el a labakat, hatha kiderul valami beallitasi problema...
Sajnos nem boldogultam a CCS forditval, valamit nem jól csináltam ezek szerint.
Megprobáltam a mikroelektronikás c forditóval, elsőre müködött, igy néz ki a kód : unsigned short i; void main() { TRISB = 2; PORTB = 0; //B3 és B 5 USART_init(9600); // initialize USART module Delay_ms(1000) ; // (8 bit, 9600 baud rate, no parity bit...) while (1) { if (USART_Data_Ready()) { // if data is received i = USART_Read(); // read the received data if (i == 'R') { PORTB = 0; Delay_ms(1000); PORTB = 40; Delay_ms(1000); } } } } |
Bejelentkezés
Hirdetés |