Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   11 / 118
(#) sysy válasza brugo hozzászólására (») Márc 16, 2008 /
 
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ó.
(#) brugo hozzászólása Márc 17, 2008 /
 
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 !!!
(#) potyo hozzászólása Ápr 16, 2008 /
 
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...
(#) potyo válasza potyo hozzászólására (») Ápr 16, 2008 /
 
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)
(#) deguss válasza potyo hozzászólására (») Ápr 16, 2008 /
 
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.

  1. #type  short=1, int=16, long=32


továbbá az alábbiak egyikével ki lehet választani a defaultot
  1. #type unsigned
  2. #type signed
(#) deguss válasza potyo hozzászólására (») Ápr 16, 2008 /
 
Szia potyo!

Oly sokat segítesz másoknak, most én próbálok neked.
  1. //ROM-konstans a 0x4444-es programmemória címen, értéke decimális 2008
  2. #rom  0x4444={2008} //0x07D8
  3. ...
  4. main(){
  5. //változó deklarálása és initializáslása dec. 2009-re
  6. int i2 = 2009;
  7.  
  8. //pointer a programmemória 0x4444-es címére
  9. int rom *ptr;
  10. ptr = 0x4444;
  11.  
  12. //i2 változó felülírása a programmemória 0x4444-es címén lévő értékkel.
  13. i2 = (int)*ptr;
  14.  
  15. //i2 tartalma ez után dec 2008 lesz.
  16. }


Így lehet kiolvasni a programmemóriát is. Remélem tudtam segíteni.

(#) MPi-c válasza potyo hozzászólására (») Ápr 17, 2008 /
 
Üdv!

Nekm ez így pl. működik:
  1. const char Hnap[][*]= {" Hé "," Ke "," Sze"," Csü"," Pé "," Szo"," Va "};
  2.        
  3. printf(lcd_putc,"%s",Hnap[HetNapja]);
(#) potyo válasza deguss hozzászólására (») Ápr 17, 2008 /
 
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.
(#) potyo válasza deguss hozzászólására (») Ápr 17, 2008 /
 
Kösz a próbálkozást, de igazából nem jutottam előrébb.

Megmutatom, mit csináltam C18-ban:
  1. rom unsigned char hatar0[]={"<1u     "};
  2. rom unsigned char hatar1[]={"1u-10u  "};
  3. rom unsigned char hatar2[]={"10u-100u"};
  4. ...


Majd egyszerűen meghívom így: LCD_putrSTR(hatar0);

A függvény így néz ki:
  1. void LCD_putrSTR(rom unsigned char * ptr)
  2. {
  3.         while (*ptr)
  4.                 LCD_buffer[p++]=*ptr++;
  5. }


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é.
(#) deguss válasza potyo hozzászólására (») Ápr 19, 2008 /
 
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.
(#) Ven hozzászólása Ápr 30, 2008 /
 
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?
(#) potyo válasza Ven hozzászólására (») Ápr 30, 2008 /
 
A gyári Microchip C fordító létezik erre a kontrollerre is. Link
(#) Ven válasza potyo hozzászólására (») Ápr 30, 2008 /
 
Köszi!
Nem tudod honnan tudnék letölteni hozzá kis okosítást?
(#) potyo válasza Ven hozzászólására (») Ápr 30, 2008 /
 
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.
(#) Ven válasza potyo hozzászólására (») Máj 1, 2008 /
 
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!
(#) potyo válasza Ven hozzászólására (») Máj 2, 2008 /
 
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.
(#) pepe33 hozzászólása Jún 12, 2008 /
 
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 !

a.txt
    
(#) trudnai válasza pepe33 hozzászólására (») Jún 12, 2008 /
 
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...
(#) pepe33 válasza trudnai hozzászólására (») Jún 13, 2008 /
 
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 !
(#) trudnai válasza pepe33 hozzászólására (») Jún 13, 2008 /
 
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:
  1. #include <16F628A.h>                             // 16f628
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP                  // xt 4mhz
  3. #use delay(clock=040000000)                      // 4mhz
  4. #use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B2)   // soroport 9600,8,1,n
  5. #define relay5v PIN_B3                           // 5V relé  B3-ason
  6. #define relay9v PIN_B5                           // 9V relé  B5-ön
  7.  
  8. void main()                                      //
  9. {  
  10.     int seradat;                                  // változók beállitása
  11.  
  12.     output_bit( relay5v, 1);                      // relék kikapcsolt állapotban
  13.     output_bit( relay9v, 1);                      // ( ha kimnet 0 akkor meghuznak)
  14.  
  15.     printf("ATI\r");                              // sorosportra karakterek küldése
  16.     delay_ms(500);                                // 500 ms várakozás
  17.     printf("ATH\r");                              // sorosportra karakterek küldése
  18.     delay_ms(500);                                // 500 ms várakozás
  19.  
  20.     while (TRUE)                                  // főciklus amiben várja a sorosport adatot
  21.     {                                             //
  22.         if (kbhit())                              // sorosport bejövö adat figyelése
  23.         {                                         // bejott valami?
  24.             seradat = getc();                     // karakter beolvasása a bufferből
  25.             if ( 'R' == seradat )                 // ha a beérkezett karakter "R" akkor I = 1
  26.             {
  27.                 output_bit( relay5v, 0);
  28.                 output_bit( relay9v, 0);
  29.                 delay_ms(5000);
  30.                 output_bit( relay9v, 1);
  31.                 delay_ms(50000);
  32.                 output_bit( relay5v, 1);
  33.             }
  34.         }
  35.     }    
  36. }

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.
(#) pepe33 válasza trudnai hozzászólására (») Jún 13, 2008 /
 
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 ......
(#) trudnai válasza pepe33 hozzászólására (») Jún 13, 2008 /
 
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).
(#) pepe33 válasza trudnai hozzászólására (») Jún 13, 2008 /
 
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.
(#) raron válasza pepe33 hozzászólására (») Jún 13, 2008 /
 
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...
(#) pepe33 hozzászólása Jún 17, 2008 /
 
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ó.
(#) potyo válasza pepe33 hozzászólására (») Jún 17, 2008 /
 
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.
(#) trudnai válasza pepe33 hozzászólására (») Jún 17, 2008 /
 
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.
(#) pepe33 válasza trudnai hozzászólására (») Jún 17, 2008 /
 
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.
(#) trudnai válasza pepe33 hozzászólására (») Jún 18, 2008 /
 
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...
(#) pepe33 válasza trudnai hozzászólására (») Jún 22, 2008 /
 
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);
}
}
}
}

Következő: »»   11 / 118
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