Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   34 / 153
(#) atis28 válasza watt hozzászólására (») Márc 2, 2011 /
 
Rendben, köszi!
Közben rájöttem, hogy végül is ez a kód, amit az előbb írtam, egy sorba is beírható, így a rövid ideig történő "kinullázást" el is lehet kerülni. Bár nem szép, de ha nincs más megoldás, marad ez a maszkolás.
(#) trudnai válasza atis28 hozzászólására (») Márc 2, 2011 /
 
Tedd egyetlen sorba!

  1. PORTB = ( PORTB & 0xF0 ) | 0x0_;


De makrot is gyarthatsz ra ha az egyszerubb neked:

  1. #define ALSO(p,b) p = (p & 0xF0) | ((b) & 0x0F)
  2. #define FELSO(p,b) p = (p & 0x0F) | ((b) & 0xF0)
  3.  
  4. ALSO ( PORTB, 0x06 );
  5. FELSO ( PORTA, 0x10 | 0x20 | 0x30 );
(#) icserny válasza atis28 hozzászólására (») Márc 3, 2011 /
 
Idézet:
„Ezzel csak az a gond, hogy egy nagyon rövid időre ugyan, de a lábak alacsony jelszintet adnak majd, mielőtt az új értéket megkapnák.”

A legtisztességesebb módszer a kizáró vagy kapcsolattal történő módosítás, ami konkurens folyamatoknál is használható. Például vegyük azt a helyzetet, hogy interrupton matatsz bizonyos biteket, a főprogramban pedig ugyanazon regiszter más bitjeit. Kínos volna, ha a főprogramban beolvasom a regisztert, közben az interrupt módosítja bizonyos bitjeit, én pedig a saját bitek módosítása után visszaírnám a többi bit RÉGI értékét! Az alábbi inline "függvény"-ben szereplő formula megoldja ezt a gondot:
  1. #define ChangeBits(reg,val,mask) reg ^= ((reg^val) & mask)

A példádat ezzel így kell írni:
  1. ChangeBits(PORTB,n,0xF0);

Természetesen az RMW probléma miatt a PORTB nem a legszerencsésebb példa, ezért vezették be a PIC18-tól fölfelé a LATA, LATB, stb. hozzáférést a kimeneti adatbufferhez.

PIC24/dsPIC33-hoz pedig ebben a topikban található a téma diszkussziója és egy lehetséges megoldása.
(#) atis28 válasza trudnai hozzászólására (») Márc 3, 2011 /
 
Így van, az utolsó hozzászólásomban írtam is, hogy egy sorba is írható ez a kifejezés, így a rövid ideig történő kinullázást is elkerüljük. A makrós megoldás viszont tényleg szép, hiszen ezt a számomra "csúnya" kódot legalább csak egyszer kell leírni...
(#) El_Pinyo hozzászólása Márc 16, 2011 /
 
Sziasztok!
A feltételes fordítási direktívákkal gyűlt meg a bajom, de végül is sikerült orvosolni a problémát. Mivel elég furcsa a hibajelenség, gondoltam megosztom veletek.
A projektem több forrásfájlból áll. A gondot az #if defined(...) direktíva lezárásaként szolgáló #endif direktíva jelentette. A main.c forrás végén elhelyezett #endif direktíva csak akkor nem okozott fordítási hibát, ha a direktíva után volt egy soremelés is. Ha pl. a soremelés kimaradt, vagy a soremelés után egysoros komment volt, akkor különböző hibákkal leállt a fordítás. Nem tudom, hogy ez bug avagy feature, de szerintem ez nagyon nem jó így.
A rendszer:
MPLAB IDE 8.63
C18 Compiler 3.36
(#) pipi válasza El_Pinyo hozzászólására (») Márc 16, 2011 /
 
Tipikus elkövetési hiba szerintem a C programozóknál, főleg include fájloknál.
Valahogy úgy felfogható, ha a fájlokat egybemásolod,
akkor ugye a 2. fájl első sora, az első fájl utolsó sorába folytatásként másolódik be, és a fordító eszerint "értelmezi" azt az utolsó sort...
(#) El_Pinyo válasza pipi hozzászólására (») Márc 16, 2011 /
 
Szia!
Köszönöm a választ, bár szerintem félreérted (vagy én nem értelek meg rendesen).
Az én olvasatomban a válaszod csak arra az esetre korlátozódik, amikor az #endif után nincs soremelés. Viszont akkor is kiakad a fordító, ha van soremelés, de utána pl. komment helyezkedik el.
Valami ilyesmire gondolok:
  1. void main(void)
  2. {
  3. mindenféle kód
  4. }
  5.  
  6. #if defined(valami)
  7. különböző függvények
  8. #endif
  9.  
  10. //valami komment

Ekkor fordítási hibát dob. Szerintem nem kéne, hogy kiakadjon erre. Egyébként #if #endif nélkül mindig jól fordított, akár volt soremelés, akár nem.
(#) potyo válasza El_Pinyo hozzászólására (») Márc 16, 2011 / 1
 
A forráskód utolsó sora mindig egy újsor karakter kell, hogy legyen, függetlenül, hogy az utolsó előtti sor csak komment vagy valós utasítás.

Amúgy én sem értem, hogy a fordítóprogramok miért nem tesznek a fájlok végére a feldolgozás során sajátmaguktól egy plusz újsor karaktert.
(#) El_Pinyo válasza potyo hozzászólására (») Márc 16, 2011 /
 
Na erre látod nem gondoltam, pedig így, hogy említed nekem is beugrott. Köszönöm a válaszodat.
(#) kissi válasza potyo hozzászólására (») Márc 16, 2011 /
 
Idézet:
„Amúgy én sem értem, hogy a fordítóprogramok miért nem tesznek a fájlok végére a feldolgozás során sajátmaguktól egy plusz újsor karaktert.”
Szerintem azért, hogy ne lehessen "véletlenül" fordítani, csak a megfelelő szabályok betartásával! Ugyanígy nem fogadja el például, ha a megjegyzésnek csak az elejét jelölöm (/* ) és így érne véget a program ( pedig néha jól jönne ), ez is biztosítja, hogy ne "bambulhassak el", oda kelljen figyelni.

Ez csak a magánvéleményem volt

Steve
(#) potyo válasza kissi hozzászólására (») Márc 17, 2011 /
 
A kommentelésben igazad van, ugyanakkor ha a fájl végére betenne egy újsor karaktert, akkor nekem nincs elképzelésem róla, hogy ez bármilyen problémát is felvetne. Gondolom olyat senki se akar szándékosan csinálni, hogy egyik fájlban elkezdi a kommentet // jelekkel, majd másik fájlban fejezi azt be.
(#) watt hozzászólása Máj 12, 2011 /
 
Sziasztok!
Látszólag tök egyszerű kérdésem van, de én a pdf-ek böngésésével nem találtam meg a választ.
Szóval hogy lehetne constanst alkotni a rom-ba, hogy egy számot adok a karakterek elé, mögé.
Ez az alap:
  1. rom const unsigned char Apritek[]="Apritek tuzeles";

Ez kéne úgy, hogy működjön:
  1. rom const unsigned char Apritek[]=1, 128, "Apritek tuzeles", 13, 0;

VB-ben ez a Chr$(10)&"Akármi" módon megolható, itt mi a megoldás?

Soha nem kellett még így, de most igen. A legalapvetőbb dolgokat nem találom meg, miközben már ezer éve írom a kódokat. Szép mi?
(#) icserny válasza watt hozzászólására (») Máj 12, 2011 /
 
A tömbelemeket vesszővel kell elválasztani, eddig OK, de az egészet kapcsos zárójelek közé kell tenni.

  1. rom const unsigned char A[]= {1, 128, 13, 0};


Azt nem tudom, hogy ez hogyan kombinálható stringgel.
(#) trudnai válasza watt hozzászólására (») Máj 12, 2011 /
 
Letre kell hoznod egy strukturat:

  1. typedef struct strukturam {
  2.     unsigned char byte_valtozom;
  3.     int           integer_valtozom;
  4.     char*         stringem;
  5.     unsigned      stbstbstb;
  6. } strukturam;
  7.  
  8. int main()
  9. {
  10.     strukturam hehe = { 1, 2, "stringecske", 3 };    
  11.  
  12.     printf("%u / %i / %s / %u `n", hehe.byte_valtozom, hehe.integer_valtozom, hehe.stringem, hehe.stbstbstb );
  13. }


Most ez a pelda nagyon le van egyszerusitve, de remelem ertheto...
(#) watt válasza trudnai hozzászólására (») Máj 12, 2011 /
 
Köszi, de nem egészen ez a feladat. A fenti első kódrészlet a programmemóriába tárol le konstansként szöveg ASCII kódokat. Közé kéne tenni olyan értékeket, amik nem írhatóak le karakterekkel, mint pl. a 0, 12 stb. Tehát nincs szükség változókra, strutúrára, hanem arra lenne szükségem, hogy valahogy a előfordítónak el tudjam mondani, hogy a CHR$(0)-t tegye be a karaktereim közé.
(#) watt válasza icserny hozzászólására (») Máj 12, 2011 /
 
Igen, ez is megvan, de pont az kéne, hogy kombináljam.
Ez sajnos nem működik:
  1. rom const unsigned char Apritek[]={1, 128} "Apritek tuzeles";
(#) potyo válasza watt hozzászólására (») Máj 12, 2011 /
 
Elvileg birsz ilyet csinálni:

  1. rom const unsigned char xxx []= {"\12a\01b\02c\03d"};


De egyelőre nem tiszta számomra, hogy ebből miért lesz a memóriában hexadecimálisan: 0A 61 01 62 02 63 03 64 00. A végén a 00 világos, a 0A-t nem értem, hogy hogyan keletkezett a 12-ből...
(#) watt válasza potyo hozzászólására (») Máj 12, 2011 /
 
Alakul! Tényleg érdekes, hogy 2-vel kisebb szám kerül be a memóriába az első ponton! ?
A 128-as értéket még mindig valami karakterrel tudnám bevinni, jobb lenne számmal, mert ez egy cím és beszédesebb lenne. De eddig még ez áll a legközelebb a megoldáshoz! Köszönöm!
(#) watt válasza potyo hozzászólására (») Máj 12, 2011 /
 
Azt hiszem megoldódott, legalább is így áttekinthető és jó is:
  1. rom const unsigned char Apritek[]={1,128};
  2. rom const unsigned char Apritek1[]={"Apritek tuzeles\r"};


Köszönöm a segítségeket!
(#) potyo válasza watt hozzászólására (») Máj 12, 2011 /
 
Egy indexszel akarsz végigmenni a két tömbön? Mert azt nem garantálja senki, hogy ezek mindig egymás után lesznek elhelyezve a memóriában.
(#) trudnai válasza watt hozzászólására (») Máj 12, 2011 /
 
Ja ertem mar mit szeretnel! Es valami ilyesmi?

  1. char haha[] = { 64,65,66, 'h','a','h','a' };

es akkor ennek egy valtozata lenne:
  1. #define hihi_str 'h','i','h','i'
  2. char hihi[] = { 64,65,66,67, hihi_str, 68,69 };


UI: Stringbe 0-t ill '\0' -t ne tegyel lehetoleg, mert az a string kezelo fuggvenyeket fejre boritja...
(#) watt válasza potyo hozzászólására (») Máj 12, 2011 /
 
Igen, de eddig úgy tűnik egymás után vannak, többet is deklaráltam. Azt mondod elkeverheti a fordító? Végül is miért ne! Na mindegy, majd ha megteszi, akkor eszembe fog jutni, hogy van ilyen, és akkor korrigálok!
(#) potyo válasza watt hozzászólására (») Máj 12, 2011 /
 
Igen, elkeverheti. Valószínű, hogy nem fogja, de előfordulhat.
(#) watt válasza trudnai hozzászólására (») Máj 12, 2011 /
 
Ez is jól néz ki, köszönöm!
0-t nem teszek, azt beteszi a fordító a karakter végére. A te verziód végére nem tesz, ezért ha karakter vektorként akarom kezelni, akkor bizony nekem kell! Az én példámat is csak azért lehet összefűzni, mert egyrészt két változót teszek a szöveges elé, másrészt nem tesz be 0-t a végére. Két karakter vektort ezért nem is lehet össszefűzni simán a végén lévő 0 miatt.
(#) trudnai válasza potyo hozzászólására (») Máj 13, 2011 /
 
Idézet:
„Igen, elkeverheti. Valószínű, hogy nem fogja, de előfordulhat.”


Ezt ugye semmi sem garantalja -- pl egy bankon keves a hely, es lehet az egyiket meg oda be tudja nyomni a masikat mar nem...

Az en verziomban a 0-t valoban illene oda biggyeszteni, azt kifelejtettem
(#) potyo válasza trudnai hozzászólására (») Máj 13, 2011 /
 
Idézet:
„Ezt ugye semmi sem garantalja -- pl egy bankon keves a hely, es lehet az egyiket meg oda be tudja nyomni a masikat mar nem...”


Az jutott eszembe, hogy ugye ezeknek a konstansoknak a memóriacímük ismert fordítási időben. Vajon lehetne-e valami ilyesmit csinálni?

  1. #if (xxx+sizeof(xxx)!=yyy)
  2. #error Nem egymas utan vannak a konstansok
  3. #endif


Ez persze nem jó, de hátha valaki tud valamit, hogy lehetne ilyen ellenőrzést csinálni.
(#) icserny válasza potyo hozzászólására (») Máj 13, 2011 /
 
Idézet:
„Az jutott eszembe, hogy ugye ezeknek a konstansoknak a memóriacímük ismert fordítási időben.”
Szerintem fordításkor még nem ismert, csak linkeléskor dől el.
(#) potyo válasza icserny hozzászólására (») Máj 13, 2011 /
 
Közben én is erre jutottam, hogy ez lehet, csak már nem tudtam az előzőt szerkeszteni...
(#) trudnai válasza potyo hozzászólására (») Máj 14, 2011 /
 
Viszont futas idoben ellenorizheto, igy bekapcsolaskor / inicializalaskor meg kiabalhat, hogy valami nem stimmel. Azonban az osszes ilyesmi nekem kicsit ganyolasnak tunik.
(#) watt válasza trudnai hozzászólására (») Máj 14, 2011 /
 
Ezek az adatok szövegek, ha valami nem stimmel a sorrenddel, az könnyen kiderül a program kipróbálásánál. Eddig nem volt gond, meglátjuk lesz-e, ahogy bővül a lista. Egyébként egy 18F-nél nem nagy gond a programmemória olvasása a táblacímző regiszterekkel, szerintem nem lesz baj...
Következő: »»   34 / 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