Fórum témák

» Több friss téma
Fórum » PIC programozás
 
Témaindító: G-Lex, idő: Okt 24, 2005
Lapozás: OK   20 / 66
(#) potyo válasza Magashegyi hozzászólására (») Aug 31, 2009 /
 
A const módosítót tipust a CCS a programmemóriában történő tárolás jelzéséhez használja, ezért nem működik a sima char pointerrel, mert az az adatmemóriára célzódik.

Amúgy mutass egy kódot, hogy mit akarsz csinálni, mert ebből nem egyértelmű (számomra), hogy mit is szeretnél. Ha pointer kell a tömb kezdő elemére, akkor írd oda a tömb nevét, az maga egy pointer. Arra másik pointert létrehozni nem látom értelmét.
(#) Magashegyi válasza potyo hozzászólására (») Aug 31, 2009 /
 
Azért kellene a másik mutató hogy azt egy for ciklusban egyesével növelgetve végig tudjak lépkedni a tömb elemein.
(#) potyo válasza Magashegyi hozzászólására (») Aug 31, 2009 /
 
Ahhoz minek a mutató? Tömb indexe nem jó?
(#) Magashegyi hozzászólása Aug 31, 2009 /
 
itt a kód:
[/code]

const BYTE glcd_chars[]={//sok bit};

void glcd_printChars(int8 address,char *sptr)
{
int1 i;
int8 j,k;
BYTE *pTemp;
i=1;
pTemp=glcd_chars;

if(address>122) return;
if(address<64) glcd_setAddress(GLCD_LEFT,address);
else glcd_setAddress(GLCD_RIGHT,address-64);
for(j=0;*sptr!=0x00;j++)
{
pTemp=((*sptr-48)*5)+pTemp;
for(k=0;k<1;k++)
{
if((i+address)<64)
{
glcd_writeByte(GLCD_LEFT,*pTemp++);
}
else
{
if(i)glcd_setAddress(GLCD_RIGHT,--i);
glcd_writeByte(GLCD_RIGHT,*pTemp++);
}
}
sptr++;
}

}>>
(#) Magashegyi válasza potyo hozzászólására (») Aug 31, 2009 /
 
A tömb indexe csak 255 lehet max és ennél több elem van benne.
(#) potyo válasza Magashegyi hozzászólására (») Aug 31, 2009 /
 
Ez a sor biztosan jó?

  1. pTemp=((*sptr-48)*5)+pTemp;


A jobboldali pTemp helyett nem glcd_chars kellene, hogy álljon? Mert így minden egyes lefutáskor a pTemp előző értékét is hozzáadod a következőhöz, ami szerintem nem azt eredményezi, amire számítasz (mellesleg nem ártana kommentezni is a kódot).

Ha erre válaszolsz, akkor majd leírom, hogy én hogyan gondoltam megoldani, de ettől függ a megoldásom.
(#) Magashegyi válasza potyo hozzászólására (») Aug 31, 2009 /
 
De igen igazad van! De ettül függetlenül ha minden egyéb sort kiveszek és csak simán a pTemp-et iratom ki a glcd_writeByte-al akkor nem a tömb első sorát írja ki a kijelzőre. Amugy köszönöm a segítséget!!
(#) potyo válasza Magashegyi hozzászólására (») Szept 1, 2009 /
 
Szerintem így kellene:

  1. const BYTE glcd_chars[]={//sok bit};
  2.  
  3. void glcd_printChars(int8 address,char *sptr)
  4. {
  5.         int1 i;
  6.         int8 k;
  7.         i=1;
  8.         BYTE tmp;
  9.         int16 j;        // WORD j;
  10.  
  11.         if(address>122)
  12.                 return;
  13.         if(address<64)
  14.                 glcd_setAddress(GLCD_LEFT,address);
  15.         else
  16.                 glcd_setAddress(GLCD_RIGHT,address-64);
  17.         for(j=0;!sptr[j];j++)
  18.         {
  19.                 for(k=0;k<1;k++)                // ez biztos, hogy csak egyszer kell, hogy lefusson? Nem ötször (k<5) ?
  20.                 {
  21.                         tmp=glcd_chars[(sptr[j]-(int16)48)*5+k];
  22.                         if((i+address)<64)
  23.                         {
  24.                                 glcd_writeByte(GLCD_LEFT,tmp);
  25.                         }
  26.                         else
  27.                         {
  28.                                 if(i)
  29.                                         glcd_setAddress(GLCD_RIGHT,--i);
  30.                                 glcd_writeByte(GLCD_RIGHT,tmp);
  31.                         }
  32.                 }
  33.         }
  34. }


Az a k-s for ciklus nem ötször kellene, hogy lefusson? Mert így nem sok értelme van a ciklusnak, ha csak egyszer fut le. Meg az i változó szerepét sem értem (eleve nem kap kezdőértéket). A tömb indexe amúgy annyi, amennyit megadsz neki indexeléskor. Ha olyan változót használsz indexelésre, aminek nem lehet 255-től nagyobb az értéke (egy bájt), akkor persze max. 255 az index. De kétbájtos változóval már 65535 is lehet az index.
(#) Magashegyi válasza potyo hozzászólására (») Szept 1, 2009 /
 
Hello de a k valóban 5 csak a debugolás miatt irtam átt 1-re. Ez a 16 bittes dolog biztossan működik egy 8 bites processzoron mert én eddig ahányszór próbálkoztam vele mindíg 8 bites lett az eredmény. Az i kap értéket 1-et még a legelején az értelme az hogy a kijelző jobb oldalán az első byte kiírása előtt 0-rá állítja a kezdő oszlopot. és ezért csak egyszer kell lefutnia.
(#) potyo válasza Magashegyi hozzászólására (») Szept 1, 2009 /
 
Nem a kontroller miatt lett neked 8 bites az eredmény, hanem a C olyan, hogy 8 bites operandusok esetén 8 bites eredményt állít elő, függetlenül attól, hogy az eredmény esetleg több mint 8 biten férne el (ezesetben a felső biteket eldobja). Legalább egy fontos operandust castolni kell 16 bitesre, akkor 16 bites eredményt fog generálni. Ezért van ott az, hogy (int16)48, mert így kényszerítve van, hogy a 48-at 16 bites számként kezelje, és akkor már sptr[j]-48 is 16 bites, majd ezt öttel szorozva megint 16 bites, és k-t hozzáadva is szintén 16 bites az eredmény, és ezzel a 16 bittel indexeli a glcd_chars tömböt. Legalábbis így szokott lenni, nem próbáltam ki a kódot, remélem, hogy a CCS is így csinálja. De az biztos, hogy ebbe az irányba kell elindulni...
(#) Magashegyi válasza potyo hozzászólására (») Szept 1, 2009 /
 
Köszönöm!! így valóban 16 bites érték lesz. Nagy tanulság ez nekem. Köszönöm mégegyszer így már működik úgy ahogy illik.
(#) trudnai válasza potyo hozzászólására (») Szept 1, 2009 /
 
Idézet:
„Ezért van ott az, hogy (int16)48, mert így kényszerítve van, hogy a 48-at 16 bites számként kezelje”


...ami egyebkent szebb lenne ha igy lenne castolva:

  1. tmp=glcd_chars[(sptr[j]-48L)*5+k];

persze ettol a lenyegi resze nem valtozik.
(#) potyo válasza trudnai hozzászólására (») Szept 1, 2009 /
 
A L az már long, nem? Az U lenne az unsigned, ha jól emlékszem. Amúgy azért nem mertem azt írni, mert a CCS-ben a sima int tipus 8 bites, aztán ha véletlen a 48U is 8 bites lesz, akkor épp hülyeséget mondtam volna. Az L meg bántotta a szépérzékemet, mert ágyúval verébre kategóriának tartottam ide.
(#) Peticilin hozzászólása Dec 7, 2009 /
 
Sziasztok!

Segítséget kérnék. Adjatok tanácsot.
Meglévő programon szeretnék változtatni.Milyen progit ajánlatok a hex nézegetésére és turkálására,illetve valami linket kérnék gyorstalpalónak,hogy a program "káoszán" eligazodjak,hogy tudjam hova nyúljak bele.
Amúgy PIC 16F84A-ra írt progiról van szó.

Előre is köszi

Üdv. Peti
(#) kissi válasza Peticilin hozzászólására (») Dec 7, 2009 /
 
Szia!

Visszafejteni az MPLAB is jó ( disassembly! ), de a kapott "anyag" azért nem olyan könnyen emészthető ( főleg, ha nincs gyakorlatod!) ! A hardver és a szoftver ezeknél az eszközöknél szorosan összefüggő dolgok, ezért csak mindkét területen megfelelő ismeretek birtokában lehet egyáltalán esélyed arra, hogy belenyúlj ( nem beszélve arról, ha szándékosan nehezítették: indirekt címzés, ide-oda ugrálás, külső eszköz által eleve figyelmen kívül hagyott utasítások, stb.) !

Erről egyébként emlékeim szerint volt már itt szó, ha jól tudom trudnai kolléga oldalán van ( volt?) fent egy disassembláló progi!

Jó munkát!

Steve
(#) nyemi válasza Peticilin hozzászólására (») Dec 7, 2009 /
 
Én meg Oshon szimulátort ajánlanám de tényleg nem lesz könnyű.
(#) Hp41C válasza Peticilin hozzászólására (») Dec 7, 2009 / 1
 
Szia!

Nézd meg az itt található pic disassembler-t..

Módszerek:

-Ha csak néhány utasítás hiányzik valahonnan (pl. inicializálásból a 16F84 -> 16F628 áttérésnél : A resetnél levő ugrás kicserélése a szabad memória területe történő ugrással, ott a hiányzó utasítások (komparátor kikapcsolás) lefuttatása, a végén az eredeti reset címre ugrás). Ez máshol is jól használható...
- Utasítások beszúrása (eeprom regiszterek bankjának módosítása): Egy utasítás helyére call, a szabad memória területen a felhasznált utasítás és a többi, ami kell és egy return.
- Változó helyfoglalás módosítása:
A fenti utalásban szereplő disassemblerrel visszafordítani, a változó definíciók (LRAM00..) helyettesítése egy cblock -kal, és újrafordítás.

Szerencséd van a 16F84 nagyon kicsi memóriákkal rendelkezik, az újabb típusokba könnyen áttehető a program...

Szia
(#) Gszel16 hozzászólása Dec 7, 2009 /
 
Sziasztok!

Szeretném megtanulni a PIC-ek programozását és ehhez szeretnék segítséget kérni. Pic-ben teljesen kezdő vagyok. A legnagyobb gondom hogy honnan tudnék megtanulni programozni mert ugyan híradásipari iskolába jártam programozni nem volt lehetőségem megtanulni. Égető áramkört építettem csak a programozással vagyok gondban.
A segítséget előre is köszönöm: Gábor

U.i: az is nagy segítség lenne ha ajánlanátok valamilyen írásos forrást ahonnan tudok tanulni.
(#) bbalazs_ válasza Gszel16 hozzászólására (») Dec 7, 2009 /
 
Ha meg egyaltalan nem programoztal semmit, akkor inkabb a BASIC-kel kezdd PC-n, az ad nemi sikerelmenyt es magat a programozasi gondolkodast elsajatithatod.
Igazabol a programozas lenyege a feladat helyes megfogalmazasa, a nyelv csak masodlagos.
A tobbi nyelv is linearis, csak masok lesznek az utasitasok, de az elv ugyanaz.
Szerintem.
(#) watt válasza bbalazs_ hozzászólására (») Dec 7, 2009 /
 
Idézet:
„Szerintem.”

Szerintem is!
(#) foxi63 válasza bbalazs_ hozzászólására (») Dec 7, 2009 /
 
Hali!
itt sokokosság van:PIC
(#) Peticilin hozzászólása Dec 7, 2009 /
 
Sziasztok!

Köszönöm a sok segítséget a programkód visszaolvasásával kapcsiba,le is szedtem egy csomó progit,de ez a programozás nekem kínai. Úgyhogy a segítségeteket kérném a nyűgöm megoldásában.

Az alább közölt kapcsirajzba és a hex-ekbe engedélyt kértem a szerzőtől,tehát nyugodtan garázdálkodhattok benne.
Arról lenne szó hogy úgy van megírva a progi hogy bekapcsoláskor,ha azonnal nem kap jelet akkor hibakódot ír ki,amit csak reseteléssel lehet eltüntetni. Ezt kellene a programból kiszedni. Tehát bekapcsoláskor jelenjen meg a ford. kiírása (ha nincs jel,akkor 0).

A másik verzió pedig az lenne,hogy a 2x20-as kijelző helyett 4 tagos 7 szegmenses kijelzőn legyen a kiírás.

A motorvezérlő része nem kell.

Segítségeteket előre is köszönöm.

Üdv. Peti
(#) foxi63 válasza Peticilin hozzászólására (») Dec 7, 2009 /
 
Szia!
ha nem kell a motorvezérkő része, akkor marad a 4 tagos fordulatszám kijelző, ehhez pedig nem célszerű a PIC van erre digitális IC és olcsóbb, egyszerűbb.
(#) Peticilin válasza foxi63 hozzászólására (») Dec 7, 2009 /
 
Szia!

Már régóta keresek jól,stabilan működő fordszám mérőt. Ez ebbe a verzióba nagyon jól működik,csak a kijelzést kellene módosítani. Nem tudom,amit te javasoltál ott megoldható-e a jó jelfeldolgozás.
(#) icserny válasza Peticilin hozzászólására (») Dec 7, 2009 /
 
Ez miért nem jó? Ha módosítani akarod, akkor a forráskódot egyszerűbb, mint egy visszafordított hex-et silabizálni.
(#) Peticilin válasza icserny hozzászólására (») Dec 8, 2009 /
 
Szia!

Ezzel még nem találkoztam,de kipróbálom és meglátjuk. Köszi a linket.
(#) Peticilin válasza Peticilin hozzászólására (») Dec 8, 2009 /
 
Szia!

Valaki már megépítette az előző hozzászólás linkjénél lévő kapcsolást?
A proginál valami nem kerek. A kijelzőn csak kockák láthatóak.
A programozást pickit 2-vel csináltam és közbe nem nyafogott. Ugyhogy szerintem azt nem rontottam el.
Mi lehet a bibi?

20091208.jpg
    
(#) icserny válasza Peticilin hozzászólására (») Dec 8, 2009 /
 
Van egy szörnyű gyanúm, hogy a PIC 13-as lábát össze kellene kötni az LCD 14-es lábával (ha az a D7-es láb).
(#) Peticilin válasza icserny hozzászólására (») Dec 8, 2009 /
 
Összekötve. De az eredmény ugyanaz.
Egyéb ötlet?
(#) icserny válasza Peticilin hozzászólására (») Dec 8, 2009 /
 
- Kontraszbeállítás.
- Végső soron az adatlapot is el lehet olvasni... (Pl. fogalmam sincs, hogy az LCD-n melyik lábad mi...
Következő: »»   20 / 66
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