Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   54 / 153
(#) icserny válasza kepitu hozzászólására (») Feb 2, 2012 /
 
1. A problémával rossz topikban kopogtattál, mivel köze nincs a C nyelvhez!
2. Ez nem szolgáltatóház. Tanulni viszont szívesen segítünk.
3. A belinkelt helyről letöltött programot át kell nevezni, hogy ne legyen a fájlnévben szóköz, s .asm legyen a kiterjesztése.
4. A CBLOCK sor elejére kell szóköz vagy tabulátor
5. Az MPLAB MPSWIN.exe programja ezután lefordítja, az alapértelmezett beállításokkal (legyen pipával kijelölve a Case Sensitive kérdés!).
(#) kepitu válasza icserny hozzászólására (») Feb 4, 2012 1 /
 
Köszi a segítséget.
Kezdő vagyok, nem tudhatom hol kell kopogtatnom.
"3. A belinkelt helyről letöltött programot át kell nevezni, hogy ne legyen a fájlnévben szóköz, s .asm legyen a kiterjesztése."
Nem gondoltam, hogy ilyen egyserű, mert alapból asm.-ben van írva, akkor miért txt kiterjesztésben rakja fel a tulaj, talán az ilyen zöldfülüek megtévezstésére mint én vagyok.
Sajnos nem műkszik az ák.
A txt.-ben /forrás/ Pic 628 szerepel én viszont 628A-t használok. Ez okozhat-e problémát?
A kapcs rajzon 4MHz-s rezonátor van, viszont az általad konvertált Hex-el Rc konfigot állít be.
Próbáltam 628A-ra az általad leírtak alapján hex-et készíteni, sikertelenül, sőt ugyanazt sem tudtam produkálni amit felraktál.
Azért köszönöm, további segítséget szivesen veszek.
A Hw. résszel nem gondolnám, hogy probléma lehet, mert egy sima hőmérő és az "EPE LCF METER" megfelelő hex és lábkonfig után rb. műkszik.
Köszi: kepitu
(#) icserny válasza kepitu hozzászólására (») Feb 4, 2012 /
 
Idézet:
„Kezdő vagyok, nem tudhatom hol kell kopogtatnom.”
Annyi elvárható egy kezdőtől is, hogy a topik címét elolvassa, a fórumszabályzatról nem is szólva, ami kifejezetten tiltja, hogy egy kérdést több témakörben is feltegyenek.
Idézet:
„miért txt kiterjesztésben rakja fel a tulaj”
Például azért, mert sok tartalomkezelő rendszer korlátozza a feltölthető mellékletek kiterjesztését.
Idézet:
„A txt.-ben /forrás/ Pic 628 szerepel én viszont 628A-t használok. Ez okozhat-e problémát?”
Igen, okozhat. S nem biztos, hogy elég a név átírása, lehetnek hardver eltérések, amelyeket figyelembe kell venni.
(#) kepitu válasza icserny hozzászólására (») Feb 4, 2012 1 /
 
Köszönöm a kioktatást, ezzel is okosabb lettem.
/Mivel első próbálkozásomra mapokon keresztül nem kaptam választ, próbálkoztam másutt./
Az 5X-emen túl sem szégyenlem, ha nálam fiatalabbaktól tanulhatok.
Üdv: kepitu
(#) trudnai válasza kepitu hozzászólására (») Feb 4, 2012 /
 
Van egy olyan topic, hogy PIC kezdoknek. Szerintem ott kellene ezt megkerdezni mert itt a C programnyelvvel kapcsolatos kerdeseket varjak es valaszoljak meg a forumtarsak.
(#) kepitu válasza trudnai hozzászólására (») Feb 4, 2012 /
 
Ok!
A mellékelt file kiterjesztés miatt gondoltam arra, hogy az itteni Okosok fognak segíteni.

temp.c
    
(#) icserny válasza kepitu hozzászólására (») Feb 4, 2012 /
 
A program fejléce szerint "Compiles with B. Knudsen CC5X(Trial version/without optimization)".
Valószínűleg erről a fordítóról van szó. S felhívja a figyelmet, hogy az optimalizálást ki kell kapcsolni, mert kritikus időzítések vannak a programban.
(#) kepitu válasza icserny hozzászólására (») Feb 6, 2012 /
 
Köszönöm a segítséget, de az eddigi próbálkozások sikertelenek voltak,
Nem gondolom, hogy kb. 3Pr. nyelvet kellene megtanulnom, mert egy sz.-os thermostátot szeretnék megépíteni és nem hex-ben van a pr.-ja.
Ha mégis valakit érdekel, a köz javára konvertálhatná a pr.-ot, hogy aki tudja hasznosítsa.
Köszi: kepitu
(#) bazs hozzászólása Feb 20, 2012 /
 
Sziasztok!

Valaki tudna abban segíteni, hogy hogyan kell a 18f2550-es pic-et MPLAB-ba bekonfigurálni ?

Mondjuk egy minta Configgal?

Választok előre is köszönöm!
(#) icserny válasza bazs hozzászólására (») Feb 20, 2012 /
 
PIC18F4550 mintát tudok mutatni: itt.
(#) trudnai válasza bazs hozzászólására (») Feb 21, 2012 /
 
Nem ertem miert kell ezt a kerdest egyszerre tobb topicban is feltenned?
(#) TakiG hozzászólása Feb 28, 2012 /
 
Sziasztok!
Tanácsot szeretnék kérni C18 nyelven egy viszonylag összetettebb menükezeléssel kapcsolatban. Úgy szeretném megoldani, hogy minden gombnak, minden menüpontban írok egy-egy függvényt, ami lekezeli az ott épp végrehajtandó műveleteket. Ezeket a függvényeket inicializáláskor beleteszem gombonként 1-1 függvény pointer típusú tömbbe. Majd a gomb megnyomásakor ebből a tömbből az aktuális menü pozícióval indexelve könnyen tudnám hívni az adott függvényeket. Így elkerülhetném a nagy if-else vagy switch case szerkezeteket a gombkezeléskor. Nem tudom érthetően írtam-e le, csatolok egy forrás részletet az elképzelésről, abban talán jobban látszik hogy gondoltam megvalósítani. Gombból csak 4 db lesz, de menüpontból jóval több mint a példában, körülbelül 30, de lehet hogy még több is. Az lenne a kérdésem, hogy ez így mennyire működőképes, szép/ronda, hatékony, vagy memóriapazarló megoldás lenne? Érdemes így belevágni a dologba?
Köszönöm, Gábor

menu.c
    
(#) Stefan válasza TakiG hozzászólására (») Feb 28, 2012 /
 
Ilyen megoldást én is használtam, szerintem jobbat nem nagyon lehet kitalálni ennél ilyen helyzetben.
(#) AZoli hozzászólása Feb 28, 2012 /
 
Sziasztok!

Szeretnék egy unsigned int változót ugyan úgy kezelni mint egy SFR regisztert, tehát bitenként elnevezne külön külön is tudjak rá hivatkozni, (ez megy is, meg volt is már itt szó róla (#804327) ) de hogy tudok az egész 16 bites változóra is hivatkozni?

A PORTD állapotáról szeretnék egy pillanatképet PORTD_T = PORTD, és utána bitekre külön hivatkozni PORTD_Tbits.RDT3
Egy struct -ot létrehoztam ahogy a header -ben láttam, de akkor PORTD_T = PORTD erre hibát ír.
Valahol már erről is volt szó, de nem találom.
(#) Ideiglenes válasza AZoli hozzászólására (») Feb 28, 2012 / 1
 
A megfelelő kulcsszavak? struct és union.
Az SDCC device/include könyvtárában van jónéhány példa.
Itt a 12F629.h állományból idézek:

  1. #define GPIO_ADDR 0x0005
  2.  
  3. extern __sfr  __at (GPIO_ADDR) GPIO;
  4.  
  5. // ----- GPIO bits --------------------
  6. typedef union {
  7.   struct {
  8.     unsigned char GP0:1;
  9.     unsigned char GP1:1;
  10.     unsigned char GP2:1;
  11.     unsigned char GP3:1;
  12.     unsigned char GP4:1;
  13.     unsigned char GP5:1;
  14.     unsigned char :1;
  15.     unsigned char :1;
  16.   };
  17.   struct {
  18.     unsigned char GPIO0:1;
  19.     unsigned char GPIO1:1;
  20.     unsigned char GPIO2:1;
  21.     unsigned char GPIO3:1;
  22.     unsigned char GPIO4:1;
  23.     unsigned char GPIO5:1;
  24.     unsigned char :1;
  25.     unsigned char :1;
  26.   };
  27. } __GPIObits_t;
  28. extern volatile __GPIObits_t __at(GPIO_ADDR) GPIObits;
(#) AZoli válasza Ideiglenes hozzászólására (») Feb 28, 2012 / 1
 
Köszi a gyors választ.
Ennek segítségével már megértettem hogy mi a különbség az union és a struct között, de akár hogy próbálom nem jövök rá hogy enné meg a fordító.

Addig jutottam hogy egy union -on belül kéne létrehoznom egy unsigned int változót, és egy struct -ot a szükséges bitekkel.

Ja és azt nem írtam hogy C30 -ban.

Ezzel mi a baj?
  1. union
  2. {
  3.     struct tagPORTDSbits
  4. {
  5.   unsigned RD0S:1;
  6.   unsigned RD1S:1;
  7.   unsigned RD2S:1;
  8.   unsigned RD3S:1;
  9.   unsigned RD4S:1;
  10.   unsigned RD5S:1;
  11.   unsigned RD6S:1;
  12.   unsigned RD7S:1;
  13.   unsigned RD8S:1;
  14.   unsigned RD9S:1;
  15.   unsigned RD10S:1;
  16.   unsigned RD11S:1;
  17.     }
  18. PORTDSbits;
  19.     unsigned int PORTDS;
  20.   };
  21.  
  22. PORTDSbits.RD3S = 1;
  23.  
  24. PORTDS = 0xAA55;
(#) p_istvan válasza AZoli hozzászólására (») Feb 28, 2012 /
 
Szervusz!

A C30-at nem ismerem konkrétan, de ha C-ről van szó, az unionnak nem adtál nevet és az union elemeire is hasonlóan kell hivatkozni mint struktura elemeire:

union_name.PORTDSbits.RD3S = 1;
union_name.PORTDS = 0xAA55;

Az union elemei, ha lehet legyenek egyforma hosszúak a meglepetések elkerülése végett... most pl. 12 és 16 bit.
(#) AZoli válasza p_istvan hozzászólására (») Feb 28, 2012 /
 
Szervusz!

Igen C-ről van szó.
Köszönöm, összeállt a kép, működik.
(#) icserny válasza AZoli hozzászólására (») Feb 28, 2012 / 1
 
  1. typedef union _UINT16 {
  2.     uint16 u16;
  3.     struct {
  4.         uint8 u8Lsb;
  5.         uint8 u8Msb;
  6.     };
  7.     struct {
  8.         uint8 u8Bytes[2];
  9.     };
  10.     struct {
  11.         unsigned b0:     1;
  12.         unsigned b1:     1;
  13.         unsigned b2:     1;
  14.         unsigned b3:     1;
  15.         unsigned b4:     1;
  16.         unsigned b5:     1;
  17.         unsigned b6:     1;
  18.         unsigned b7:     1;
  19.         unsigned b8:     1;
  20.         unsigned b9:     1;
  21.         unsigned b10:    1;
  22.         unsigned b11:    1;
  23.         unsigned b12:    1;
  24.         unsigned b13:    1;
  25.         unsigned b14:    1;
  26.         unsigned b15:    1;
  27.     };
  28. } UINT16;
(#) benjami válasza AZoli hozzászólására (») Feb 28, 2012 / 1
 
Kicsit gugliztam, mert engem nem csak a definiálás, hanem a típuskényszerítés része is érdekelt. Pl. ha egy függvényemben char változóként érkezik meg az adat, hogyan férek hozzá annak a bitjeihez anélkül hogy átmásolnám unionos változóba, vagy logikai ésekkel bűvészkednék. Íme a minta:
  1. typedef union
  2. {
  3.   struct
  4.   {
  5.     unsigned bit0:1;
  6.     unsigned bit1:1;
  7.     unsigned bit2:1;
  8.     unsigned bit3:1;
  9.     unsigned bit4:1;
  10.     unsigned bit5:1;
  11.     unsigned bit6:1;
  12.     unsigned bit7:1;
  13.   };
  14.   struct
  15.   {
  16.     char byte;
  17.   };
  18. }UJTIPUS;
  19.  
  20. void teszt(char ch)
  21. {
  22.   static char c;
  23.  
  24. // átmásolós verzió
  25.   UJTIPUS adat;
  26.   adat.byte = ch;
  27.   LATBbits.LATB0 = adat.bit3;
  28.  
  29. // átmásolás nélküli típuskényszerítéses verzió
  30.   LATBbits.LATB1 = ((UJTIPUS*)&ch)->bit6;
  31.  
  32. // C18-on ezt sajnos nem fordítja le 4 utasítássá (ahogy ASM-ben csinálná az ember)
  33.   if(((UJTIPUS*)&ch)->bit7)
  34.     LATBbits.LATB5 = 0;
  35.   if(!((UJTIPUS*)&ch)->bit7)
  36.     LATBbits.LATB5 = 1;
  37.  
  38.   c = ch;
  39. // viszont nem veremben tárolt változónál már igen
  40.   if(((UJTIPUS*)&c)->bit4)
  41.     LATBbits.LATB4 = 0;
  42.   if(!((UJTIPUS*)&c)->bit4)
  43.     LATBbits.LATB4 = 1;
  44. }

Kipróbáltam, a C30 is megeszi. Első körben úgy tűnik ugyanazt a kódot fordítja mintha a union bitjeit használnám (persze csak akkor ha a változó azonos hozzáférésű tárhelyen található: adatmem <-> verem).
Mondjuk ezt a mutatós, címképző operátoros megoldást magamtól ki nem találtam volna
(#) trudnai válasza benjami hozzászólására (») Márc 1, 2012 /
 
Pont forditva van mint ahogy azt a kommentben irod, a 'c' valtozo nem a stack-en (veremben) lesz, hanem a sima adat szekcioban, hiszen 'static'-nak deklaraltad. A 'ch' parameter azonban a veremben lesz -- ezert nem tudja azt 4 utasitasban megoldani. Nyilvan FSR-t allitgat es INDF-ekkel eri el a valtozot, bar nem lattam a visszafejtett kodot. A 'c' eseteben erre nincs szukseg hiszem a valtozo helye a forditasi idoben mar ismert.
(#) user hozzászólása Márc 2, 2012 /
 
Sziasztok!

MikroC-ben próbálok egy pic16f628-siemens m35i telefon közötti kommunikációt megírni,de elakadtam. A pic feladata mindössze annyi lenne hogy ha érkezik egy hívás a vele összekötött telefonra akkor ellenőrizze le a hívószámot,és ha stimmelt akkor rb4-et kapcsolja be.
Beégettem a programot a pic-be,de hívószámtól függetlenül mindig bekapcsolja rb3-at, és rb4-et.
Csinált már valaki bejövő hívószám ellenőrzést mikroc-ben?
(#) benjami válasza trudnai hozzászólására (») Márc 2, 2012 /
 
Igen, a 'c' változót direkt azért deklaráltam staticnak, hogy ne a verembe tegye hanem a sima adat szekcióba. Ezért tudja 4 utasítással megcsinálni. Szerintem jól írtam mert "NEM veremben tárolt" -at írtam rá és ez így is van.
(#) benjami válasza user hozzászólására (») Márc 2, 2012 /
 
Ez a programkezdemény igencsak sok sebből vérzik.
A feltételed csak azt vizsgálja hogy GSM_MSG5 változód legelső karaktere igaz-e (ha nem nulla akkor igaz), márpedig a '+' jel asc kódja nem nulla.
Miután a telefonra kiküldöd a számlekérdezést vársz 2,5 másodpercet, ezalatt a telefon már rég válaszolt, de te nem tároltad el a választ sehova. Én a telefonszámnak csak az utolsó 9 számjegyét ellenőrizném, így mindegy hogy +36 vagy 06-ot tesz a szám elejére.
(#) MPi-c válasza user hozzászólására (») Márc 4, 2012 /
 
Ahogy benjami írta az "if(GSM_MSG5)" neked mindig igaz lesz.
Egyebekben pedig tanulmányoznod kellene az M35i AT parancsleírását. Az "AT-CLIP" parancsot nem így kell használni, azzal azt tudod beállítani, hogy a bejövő hívásnál kijelezze-e a telefon a hívót vagy sem. Ez egy előzetes beállítás, tehát nem a RING üzenet után kell kiadni. Ha be van kapcsolva, a RING után egyből jön "+CLIP: num,type" formátumban a telefonszám is. Ha nincs bekapcsolva, a bejövő hívás alatt AT+CLCC paranccsal kérheted le a hívó számot, de ez már egy másik topic...
(#) user hozzászólása Márc 7, 2012 /
 
Sziasztok!

Időközben sikerült előrelépnem,és a 628-as pic-el tudtam is hívást indítani.
Áttöltöttem a kódot egy 877-es pic-be,de ott sajnos nem kezeli le a bejövő ring-et valamiért.Docklight-ban megnéztem a telefon csörgetéskor a RING-et küldi a pic-nek,de erre nem indítja el a lekérdezést. Ha számítógépről egyesével kiküldöm neki a R I N G-t, akkor viszont jól működik,és visszaírja az AT+CLCC-t.
Mi lehet a baj?

CODE.txt
    
(#) MPi-c válasza user hozzászólására (») Márc 7, 2012 /
 
A logikai ÉS operátor: '&&' és 'goto akarmi' egy C kódban?!(csak úgy hirtelen a kódra nézve...)

Hát nem túl elegáns megoldásokat használsz. Nézz szét a mikroelektronika projekteket gyűjtögető oldalán:itt gsm-es projektek vannak.
(#) Soós Antal hozzászólása Márc 14, 2012 /
 
Hello mindenki!
Az LCD kiírás t így szeretném megoldani

Void lcd2(poz, int szam)
Void lcd(poz, char szoveg[])

Szöveget karakterenként átadnám az lcdnek az rendbe is van! Pozicionálás rendebe / a számos verzió megy csak a szöveg nem sikerül/ A problémám hogy szoveg tömböt egy szerűen nem tudom át venni

lcd(100,?A szöveg helye?)

se így

lcd(100,?A szöveg helye?)

próbálkoztam mutatós megoldásokkal de nem jön össze se hogy. Ha próba képen csinálók egy ilyet a függvényen belül akkor ok / paraméter nélkül /

char szoveg[]=?A szöveg helye?;

tehát a stringet nem tudom sehogy se átvenni!

Felesleges sortöréseket kivettem. Action2K
(#) Soós Antal válasza Soós Antal hozzászólására (») Márc 14, 2012 /
 
Bocsi a szöveg szerkesztőbe gépeltembe átrakáskor így tört
(#) icserny válasza Soós Antal hozzászólására (») Márc 14, 2012 / 1
 
Az alábbi két eset nem ekvivalens, mert az első esetben a RAM-ban, a második esetben a ROM-ban helyezekedik el a string, amire mutatni akarsz, amihez más típusú mutató kell.
  1. // 1. eset
  2. char text[]="blabla";
  3. lcd_write(pos, text);
  4.  
  5. // 2. eset
  6. lcd_write(pos, "blabla");


PIC18 és C18 fordít esetén const rom char típusra kell mutatni a 2. esetben.
Következő: »»   54 / 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