Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   138 / 153
(#) Wezuv válasza Kovidivi hozzászólására (») Márc 26, 2017 /
 
A for-ban lévő változót deklaráljam volatile-nek?
(#) Wezuv válasza Kovidivi hozzászólására (») Márc 26, 2017 /
 
Ahol van for ciklus, ott működik a volatile, mivel van változó, de ahol csak egy nop van, ott nincs mire értelmezni. Ott csak a fenti megoldás működik. Az __attribute egyébként is korrektebbnek tűnik, mert jobban olvasható.
A másik kérdés nyitva maradt, mert mi van, ha egy rutinban csak néhány sort akarunk kiemelni az optimalizálás alól? Valami pragma lesz a megoldás, de nem találom a hogyant.
(#) Kovidivi válasza Wezuv hozzászólására (») Márc 26, 2017 /
 
Ha nincs változó, akkor nop helyett berakhatsz valtozo++;valtozo--; ez pontosan két utasítás. A valtozo legyen volatile. Régóta programozok, de ilyenre még sosem volt szükségem. Bármilyen időzítést meg tudtam oldani interrupttal, nagy pontossággal, esetleg a beépített delay.h-val minden meg lehet oldani. Minek feltalálni a spanyolviaszt, ha már létezik rá megoldás?
A hozzászólás módosítva: Márc 26, 2017
(#) rolandgw válasza Wezuv hozzászólására (») Márc 26, 2017 /
 
Nem PIC hanem Cortex, de GCC. Így néz ki a nop:
  1. __attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void)
  2. {
  3.   __ASM volatile ("nop");
  4. }
(#) Wezuv válasza Kovidivi hozzászólására (») Márc 26, 2017 /
 
TFT driverhez kell egy nop...
(#) Wezuv válasza rolandgw hozzászólására (») Márc 26, 2017 /
 
Köszi, kipróbálom, bár ez is egy függvénynek néz ki.
Az én függvényem most így néz ki.
  1. void __attribute__((optimize("-O0"))) WriteData_PMP_WR_sub(uint16_t data){
  2.     asm ("nop");    //5ns
  3.     PMDIN = data;  
  4. }
(#) picipic hozzászólása Okt 26, 2017 /
 
Ha már volt erről szó, akkor elnézést.

Most kezdtem Assemblerről áttérni HI-TECH PIC C-re. A próba progik már lefutnak, hiba nélkül.
(PIC 16F628A-al próbálkozom)

Próbáltam Pickit2-vel be is égetni a PIC-be. Az is simán lement, de a program nem a memória elejére kerül, hanem a 0x7c2 címen kezdődik. Az első címen egy utasítás található: Goto 0x7c2
A program végén meg ez: Goto 0x00.
Ez gyakorlatilag a Program Memória vége. Az előtte lévő rész tök üres.

Kérdésem: Mit kell ellenőriznem ill. beállítanom, hogy a progi a pr. memória elejére kerüljön. (úgy, mint az Assembler progik esetében történt)


picipic
(#) Hp41C válasza picipic hozzászólására (») Okt 26, 2017 /
 
Magas szintű nyelvek esetében nem kell foglalkozni a program elhelyezésével. Csak, ha már nagyon tele írtad...
A hozzászólás módosítva: Okt 26, 2017
(#) Zsora hozzászólása Ápr 21, 2018 /
 
Én egyébként (PIC24 )assemblyben programozok, a C-t messziről kerülöm, de most egy teszthez írtam egy rövidke C (XC16)programot. Hibákat dob rá a fordító, de nem tudom hogy miért. Tudna valaki segíteni?

CP2.png
    
(#) Hp41C válasza Zsora hozzászólására (») Ápr 21, 2018 / 1
 
A C-ben mindent előre kell definiálni.
1: Vidd a main elé a rutin1 függvény blokkját.
2: A function prototype megadása a main előtt:
  1. unsigned int rutin1(unsigned int aaa);
(#) Zsora válasza Hp41C hozzászólására (») Ápr 21, 2018 /
 
Kipróbáltam mindkét módot és működnek.
Nagyon szépen köszönöm a segítséget!

(PC-n Visual Basic .NET alatt programozok, ott a sorrend nem fontos, ezért nem is gondoltam hogy itt problémát okoz.)
(#) whalaky hozzászólása Máj 24, 2018 /
 
Sziasztok!

Kezdő (amatör) vagyok C-ben, de nagyon lelkes
Találtam a neten egy minta programot de nem működik.

  1. BYTE _esp8266_waitResponse( void ) {
  2.     unsigned char so_far[6] = {0,0,0,0,0,0};
  3.     unsigned const char lengths[6] = {2,5,4,9,6,6};
  4.     unsigned const char * strings[6] = {"OK", "ready", "FAIL", "no change", "Linked", "Unlink"};
  5.     unsigned const char responses[6] = {ESP8266_OK, ESP8266_READY, ESP8266_FAIL, ESP8266_NOCHANGE, ESP8266_LINKED, ESP8266_UNLINK};
  6.     unsigned char received;
  7.     unsigned char response;
  8.     unsigned int i;
  9.     BOOL continue_loop = TRUE;
  10.  
  11.     while (continue_loop) {
  12.         received = _esp8266_getch();
  13.         for (i = 0; i < 6; i++) {
  14.             if (strings[i][so_far[i]] == received) {
  15.                 so_far[i]++;
  16.                 if (so_far[i] == lengths[i]) {
  17.                     response = responses[i];
  18.                     continue_loop = FALSE;
  19.                 }
  20.             } else {
  21.                 so_far[i] = 0;
  22.             }
  23.         }
  24.         continue_loop = FALSE;
  25.     }
  26.     return response;
  27. }


A hiba a
  1. if (strings[i][so_far[i]] == received) {
sorral van de nem tudok rájönni hogy hogyan kéne egyszerűen gyorsan. Nem jól olvassa a konstans stringeket, így azok karaktereit sem. Ezek a mutatók a sírba tesznek.
Segítsetek valami iránymutatással!
Köszönöm!
Ja! Ha fontos C18.
A hozzászólás módosítva: Máj 24, 2018
(#) killbill válasza whalaky hozzászólására (») Máj 24, 2018 /
 
Ravasz fuggveny, de hibas. A for() utan, a 24. sorban miert van a continue_loop = FALSE sor? Az elso beerkezett karakter utan vissza fog terni, raadasul inicializalatlan ertekkel. Ezert mondjuk egy rendes C fordito szolna is...

A konyvek nem feltetlenul javasoljak, de ebben a fuggenyen en siman ugy irnam meg a 17. sort, hogy return responses[i]; Felesleges a response valtozo. Mivel megtalaltad, amit kerestel, teljesen felesleges a for()-nak tovabb mennie.

Amugy nem latok benne egyeb logikai hibat. A C18-on szivtam pointerekkel, valami nem rendesen mukodott veluk, de mar nagyon regen volt.
(#) killbill válasza Zsora hozzászólására (») Máj 24, 2018 /
 
C-ben sem fontos a sorrend, csak elobb deklaralni kell a fuggvenyt (egy prototype-pal), mielott hivatkoznal ra. Ha nem deklaralod elore es ugy hivatkozol ra, akkor int tipusunak fogja implicit modon deklaralni a fordito.
(#) Wezuv válasza killbill hozzászólására (») Máj 24, 2018 /
 
Én még az nem értem, hogy ez hogyan nézné meg minden karakter egyezőségét, ha a so_far[i] értéke mindig 0. Ennyi erővel egy karaktert (a kezdőt) is elég lenne ellenőrizni, de szerintem a for ciklus pont ezért lenne, hogy minden karakter egyezik-e, csak ez nem történik meg, ha jól látom.
(#) whalaky válasza killbill hozzászólására (») Máj 24, 2018 /
 
A 27,. sor azért van mert még nincs kidolgozva a fgv. Ami a 17. sort illeti igazad lehet, de a bibi nem ott van hanem a 14. sorban. A recived értéke jó , de a strings[i][so_far[i]] -t hibásan értékeli.
A response azért kell hogy a string tekljess hosszát vizsgálja ne csak az első byte-ot (még nem tudom hogymik lesznek, de el tudon képzelni hogy van/lesz ON, OK, OFF stb.
(#) whalaky válasza Wezuv hozzászólására (») Máj 24, 2018 /
 
A 15. sorban lépteti a so_far értékét.
(#) Wezuv válasza whalaky hozzászólására (») Máj 24, 2018 /
 
Lép az i-edik, de utána a i is növekszik, ami megint egy 0-ra mutat.
(#) killbill válasza whalaky hozzászólására (») Máj 24, 2018 /
 
Nem ertem, amit mondasz. Ez a program a 24. sor nelkul mukodne rendesen. A 24. sor azt eredmenyezi, hogy meghivod a fuggvenyt, megvar egyetlen egy karaktert, egyszer vegigfut a for(), majd kilep a while-bol es visszater egy olyan valtozo ertekevel, aminek nem adtal erteket sehol. Ezert mondtam, hogy a program hibas, es hogy a C forditonak illene szolnia, hogy inicializalatlan valtozo erteket hasznalod. Ha a 24. sort kiveszed, akkor addig fog menni a while, amig a hat string kozul valamelyik be nem erkezik. Magyarul azt csinalna, amit te szeretnel. Es ehhez lenne egyszerusites, ha a 17. sorban rogton visszaterne a responses[i] ertekevel, ahelyett, hogy betolti ugyanezt az erteket a response nevu valtozoba majd egy FALSE feltetel miatt kilep a while-bol es utana visszater a response valtozo ertekevel.
(#) Wezuv válasza killbill hozzászólására (») Máj 24, 2018 /
 
Szerintem az eredeti szándék nem csak a kezdő betű detektálása volt, ezért van az egyik tömbben a hossz is letárolva.
(#) killbill válasza Wezuv hozzászólására (») Máj 24, 2018 /
 
A so_far[i] (magyarul: eddig) tomb azt mondja meg, hogy a hat lehetseges string-bol eddig hany karakter erkezett be:
amikor bejon egy O betu, akkor a so_far[0] 1 lesz.
Ha bejon egy K, akkor a so_far[0] 2 lesz.
Ha bejon egy 'r' betu, akkor so_far[0] 0 lesz, viszont so_far[1] 1-re ugrik.
Amikor a so_far[i] == lengths[i], akkor az azt jelenti, hogy az i-edik string jott be karakterenkent.
A hozzászólás módosítva: Máj 24, 2018
(#) killbill válasza Wezuv hozzászólására (») Máj 24, 2018 /
 
Persze, hogy nem. Ez a fuggveny addig var, amig a hat string-bol az egyik be nem erkezik teljes egeszeben. Ha bejott, akkor visszaadja a string-hez tartozo kodot a responses tombbol.
(#) Wezuv válasza killbill hozzászólására (») Máj 24, 2018 /
 
Értem, köszi!
(#) whalaky válasza killbill hozzászólására (») Máj 24, 2018 /
 
Na akkor mégegyszer.
Kivettem a 24. sort, de a jeleségen nem változtat, mivel a 14. sorban az if (strings[i][so_far[i]] == received) mindíg false vagyis nem találja meg.
Tanácstalan vagyok. Nem működik.
Hogy tudnám kiiratni akár a strings[i] akár a strings[i][so_far[i]] értéket hogy lássam mit nem talál?
A hozzászólás módosítva: Máj 24, 2018
(#) Hp41C válasza whalaky hozzászólására (») Máj 24, 2018 /
 
A 4. sorban miért van * strings[6] ?
(#) killbill válasza Hp41C hozzászólására (») Máj 24, 2018 /
 
Mert hatelemu a tomb. Az 5. sorban van az utolso ket string.
(#) whalaky válasza Hp41C hozzászólására (») Máj 24, 2018 /
 
Mert egyenlőre ez a 6 lehetséges válasz van, ebből keresné ki hogy melyik jött, de gondolom a kérdés nem erre vonatkozott .
(#) killbill válasza whalaky hozzászólására (») Máj 24, 2018 /
 
Azt sajnos nem tudom, hogy hogyan tudod kiiratni. Debugger? Sorosvonal? Kijelzo? Valami csak van, amire lehet karaktereket kuldeni.
(#) killbill válasza whalaky hozzászólására (») Máj 24, 2018 /
 
Valami remlik, hogy a C18 rosszul kezeli a const-ot. Nem ugyanugy kezeli oket, mint a nem const-okat, es ettol nem is igazi C. Ezt a C18 leirasa taglalja, mar egyszer volt itt rola szo.
(#) whalaky válasza killbill hozzászólására (») Máj 24, 2018 /
 
Soros portra próbáltam eredménytelenűl...
  1. sprintf( buffer, "recived: %c strings %s \r\n", received, strings[i]  );
  2.  putsUSART( buffer );

a kimenet "recived: O strings"
Következő: »»   138 / 153
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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