Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   961 / 1203
(#) nedudgi válasza zenetom hozzászólására (») Júl 11, 2017 /
 
Azért az Excel sem kutya. Hosszú évek átlaga alapján úgy tűnk, jobb, ha én adom meg a válogatási szempontokat. Az esetleges hibákat ki tudom javítani, nem úgy, mint a MAPS esetén.
A hozzászólás módosítva: Júl 11, 2017
(#) bbb hozzászólása Júl 14, 2017 /
 
Sziasztok!

XC8-ban próbálnék megírni egy egyszerű I2C kommunikációs csatornán keresztüli SSD1306 kijelző vezérlést. A problémám a következő, amit nem egészen értek, hogy miért nem jó és biztos én rontok el valamit, de nem jövök rá mit:
1) Felépül a kommunikáció szépen
2) van egy buffer tömböm, amiben elvileg a kép tartalma lenne, ez 1024 hosszú és csak számokból áll
3) amikor elküldeném a tömb tartalmát a kijelzőnek, akkor nem írja ki az I2C vonalra

A tömb definiálása:
  1. static unsigned char buffer[1024]={
  2. 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ... };

Ahol kiírnám az I2C vonalra (egyszerre kirakom rá egy lap tartalmát, ebből van 8db, ha fix értéket írok be, akkor az szépen kikerül, tehát a tömb körül van a gond):
  1. int *buf;
  2.     buf = &buffer[0];
  3.     int page,column,counter;
  4.        ssd1306_command(SSD1306_COLUMNADDR);
  5.        ssd1306_command(0);
  6.        ssd1306_command(127);
  7.        ssd1306_command(SSD1306_PAGEADDR);
  8.        ssd1306_command(0);
  9.        ssd1306_command(7);
  10.        counter=0;
  11.        for(page=0;page<=7;page++)
  12.        {
  13.        IdleI2C1();
  14.         StartI2C1();
  15.         IdleI2C1();
  16.         WriteI2C1(SSD1306_I2C_ADDRESS);
  17.         IdleI2C1();
  18.         WriteI2C1(0x40);
  19.         IdleI2C1();
  20.            for(column=0;column<=127;column++)
  21.            {
  22.             WriteI2C1(buf[counter]);
  23.             IdleI2C1();
  24.             counter++;
  25.         }
  26.         StopI2C1();
  27.        }

Természetesen próbáltam simán a buffer[counter], a buffer[page*128+column], és ezek variációt is (a counter változó bevezetése csak azért lett, hogy hátha a szorzáson múlik a siker, de nem). Eredetileg persze nem is mutatót használtam a kicímzéshez, de az se volt jó. Ha viszont fix értéket (pl. 0b01010101) rakok be, akkor működik a kód és elküldi az értéket (próbáltam már, hogy a változók értékéből generált számot íratom ki, az is megy).
(#) pajti2 válasza bbb hozzászólására (») Júl 14, 2017 /
 
Mi minden csücsül rajta az i2c vonaladon?
(#) bbb válasza pajti2 hozzászólására (») Júl 14, 2017 /
 
Egyelőre csak ez.
(#) pajti2 válasza bbb hozzászólására (») Júl 14, 2017 /
 
Akkor nem nagyon értem, miért nem spi-t választottál. Gyorsabb, és ellenőrizhetőbb lenne.

A problémád egy kicsit összetett. Elsőként azt kellene ellenőrizni, hogy az elküldött adat biztosan megérkezik-e abban a formában, ahogyan elküldted. Egy másik pic kellene a vonalra, ha i2c. Spi esetén vissza is kötheted.

Ha az adatküldésbe biztosan nem kotyog bele config probléma, vagy áramköri parazita tényezők, akkor kell majd a kommunikációs protokolt előszedni. Ugye rendesen elolvastad az adatlapot?
(#) killbill válasza bbb hozzászólására (») Júl 14, 2017 /
 
Idézet:
„amikor elküldeném a tömb tartalmát a kijelzőnek, akkor nem írja ki az I2C vonalra”
Ezt hogy kell erteni? Nem megy ki semmi? Vagy mas megy ki? Van szkopod, hogy ranezz?

Eloszor is, ha a buf valtozod "int *", akkor nem byte-onkent fog olvasni, hiszen int pointer es nem char. Szolnia kellene a forditonak, hogy egy int pointerbe egy char pointert akarsz betolteni. Ez mindenkeppen egy hiba, de, ha probaltad a 'buffer[counter]' megoldast, akkor nem tudom, hogy mi lehet a problema.

De a legegyszerubb mindenkeppen ez lenne:
  1. unsigned char *ptr;
  2.  
  3.  ptr = buffer;
  4.  ...
  5.  for(..)
  6.    WriteI2C1(*ptr++);
(#) bbb válasza pajti2 hozzászólására (») Júl 14, 2017 /
 
Idézet:
„Ugye rendesen elolvastad az adatlapot?”
Minden bántás nélkül, ugye rendesen elolvastad a kérdésem?

A kommunikációt Salea Logic kütyüvel nézem. Egész pontosan az történik, amit leírtam. Felépül a kapcsolat, rendben működik minden, de csak akkor, ha a cikluson belülre olyan dolgot teszek, amit vagy számolnia kell, vagy egy fix érték. Ha így teszek, akkor szépen megy a dolog, de ha a tömbből akarok beletenni valamit, akkor a ciklus végre se hajtódik, legalábbis a vonalon nem jön ki semmi. Magyarul még mindig azt mondom, hogy a tömb elemeinek a cikluson belülre kerülésénél van gond és azt nem értem ott mit ronthatok el, ami miatt nem megy?
(#) bbb válasza killbill hozzászólására (») Júl 14, 2017 /
 
Ez is megvolt, ebből lett a végén már a buffer[counter] megoldás...

És igen, úgy kell érteni, hogy semmi nem megy ki. végrehajtódik a ciklus előtti rész, de a ciklusmag nem.
A hozzászólás módosítva: Júl 14, 2017
(#) killbill válasza bbb hozzászólására (») Júl 14, 2017 /
 
Ezt nem te rontod el, az biztos. Ilyenkor a disassebly lista sokat segit.
(#) pajti2 válasza bbb hozzászólására (») Júl 15, 2017 /
 
  1. int *buf; buf = &buffer[0];
Kidobni

  1. WriteI2C1(buf[counter]);
lecserélni
  1. WriteI2C1(buffer[counter]);


Próba újra.
(#) Tasznka válasza bbb hozzászólására (») Júl 15, 2017 /
 
Eléggé érdekes a programod
Nem lesz jó vége,ha int-char típusokat ennyire kevered,hosszabb proginál meg sem találod a így a hibát. Biztos,hogy így megy a kijelző,ha nem tömbből teszed ki?Csak mert még a page benne van,de nem látom,hogy a 128-as ciklus után az is növelnéd,így az egészet szerintem csak 1 sorban fogja végigpörgetni.
Bár én nem ezzel a SSD-vel dolgozom,hanem egy korábbi verzióval,aminek jó pár funkciója hasonló a tiéddel,de nekem másként sikerült kijelzésre bírni .
amúgy a buffer[page*128+column] megoldás jó,de a int *buf -ot szeretnéd használni,akkor tedd át u char *buf -ra ,mert itt nem az értékét kell nézni,hanem,hogy milyen típusra mutat.Még 1 jó tanács,ameddig nem lépsz át bizonyos értékhatárokat,addig ne használj nagyobb változókat pl: a page,column lehetne simán char,unsigned char. Inkább csak unsigned,ameddig nem használsz negatív értékeket,így kisebb a hibalehetőség,max. majd ha sprintf-et használsz,ott majd sípol,hogy csak signed kell neki,de az más tészta.Na most már megyek aludni,mert holnap szülinapi buli lesz.
(#) bbb válasza pajti2 hozzászólására (») Júl 15, 2017 /
 
Ez a próba megvolt, az eredmény ugyan az. Mint írtam, elég sok variációnál járok már, hogy az éppen beírt változatban nem volt egyforma a típus, az előfordulhat.
Amik eddig mind ugyan azt az eredményt hozták:
  1. WriteI2C1(buffer[counter]);

  1. WriteI2C1(buf[counter]);

  1. WriteI2C1(buffer[page*128+column]);

  1. WriteI2C1(buffer[0]);

...
Ezek azok, amik most hirtelen az eszembe jutottak. Ha viszont fix értéket raktam be, akkor kikerült a vonalra, pl.
  1. WriteI2C1(0b01010101);

  1. WriteI2C1(page*column%256);


Hétfőn újra nekifogok, mert elfelejtettem hazahozni a cumót, s majd jelentkezem, ha sikerült valamit alkotni.
(#) bbb válasza Tasznka hozzászólására (») Júl 15, 2017 /
 
  1. for(page=0;page<=7;page++)

Igen, növelem a page-t
A kijelző meg valóban érdekes jószág. Kell neki egy rakás parancs, hogy beinduljon (erre már kész az init() fv. és működik is szépen), majd a grafikus memóriájának feltöltését úgy eszi meg, ha egyszerre egy egész page van neki odaadva (maximum egy page, ezt akár több részletben is oda lehet neki adni), s minden ilyen adatömlesztés előtt ki kell rakni a vonalra a címét, illetve a 0x40 utasítást, hogy tudja, most ömlesztve jönnek majd az adatok.
Az érdekesség dologhoz csak annyit, hogy amíg fejlesztés közben van, addig nem szeretem külön szétszedni külön függvényekre, hanem jobb szeretem kipróbálni hogyan működik, s csak utána kirakni. Majd a cél az lesz, hogy ez a kódrészlet egy void megjelenit(); függvénybe fog bekerülni, s a többi csak a buffert fogja módosítgatni. Meg persze másik I2C eszköz is kerül majd rá (szenzor), aminek az értékeit kell majd kiírnia.
(#) don_peter válasza bbb hozzászólására (») Júl 15, 2017 /
 
Ugyan ilyen kijelzőt használok, csak SPI vonalon.
(#) pajti2 válasza bbb hozzászólására (») Júl 15, 2017 /
 
Szerintem a C fordítód egyszerűen csak gagyi, és nem tud megbirkózni a nagyobb tömbök indexelésével, aztán lefagy miatta. Ha az történik, azt nagyon egyszerűen igazolni lehet. Írj egy másik programot, tölts fel abban is 1024 elemű tömböt mondjuk 0-1 értékekkel, ugyan úgy rakd bele a kettő for ciklust, és függvénybe küldd be paraméterként a kiolvasott értéket (legyen átadva a kiolvasott érték függvénynek). A meghívott függvényben meg valami delay-vel (mondjuk 0.2 sec) rakd ki led-re a kapott értéknek csak a legalsó bitjét. Ha működik a program, villogni fog a led kb másfél percen keresztül. Ha elakadt, akkor meg se fog nyikkanni - és akkor dobd a kukába azt a C fordítót.
(#) Hp41C válasza bbb hozzászólására (») Júl 16, 2017 /
 
Láthatnánk a linker vezérlő állományodat és a változóid deklarációját?
(#) Tasznka válasza bbb hozzászólására (») Júl 16, 2017 /
 
Ezt a Page-et láttam,de az csak a 'kép' adatain fut végig,amit kiküldesz.De én arra gondoltam,ami a kijelzőnél léptet,ha te azt mondod,hogy bemehet az összes egyszerre,akkor tárgytalan a kérdésem.
(#) bbb válasza Tasznka hozzászólására (») Júl 16, 2017 /
 
A kijelzőnek az van beállítva, hogy amikor a page végére ér, akkor automatikusan léptessen, így nem kell külön kérni a léptetést tőle.
(#) bbb válasza Hp41C hozzászólására (») Júl 16, 2017 /
 
Holnap reggel, mikor a kezem ügyében lesz, feltöltöm kompletten az egészet.
(#) eSDi válasza bbb hozzászólására (») Júl 16, 2017 /
 
Üdv!

Hasonló problémám volt nekem is I2C-vel SH1106-os OLED kijelző + BME280 szenzor párosításával. Nálam a kommunikáció akadt le, már pontosan nem emlékszem, de a STOP bit körül volt a gubanc. A megoldás az lett, hogy megírtam magamnak a hardveres I2C függvényeket és az ömlesztett adatküldést hanyagoltam. Nézz rá még egyszer logikai analizátorral, hátha nem vettél észre valami anomáliát. A LED kapcsolgatás is sokat segít az elakadás helyének megtalálásában. Nálam mindez 18F4550-en és BASIC alatt történt, de ebben az esetben, lehet ez lényegtelen.
(#) bbb válasza bbb hozzászólására (») Júl 17, 2017 /
 
A komplett projekt a mellékletben.
Ez jelenleg azt csinálja, hogy a pointer megkapja a tömb első elemének a címét, azt ki is írja szépen az I2C vonalra, viszont cserébe nem inkrementálja a pointert, így mindig ugyan azt az első értéket írja ki (ez most 0x00, de tesztként a tömb első elemének mást beadva szépen mindig az került ki a kijelzőre) .
(#) killbill válasza bbb hozzászólására (») Júl 17, 2017 /
 
Pedig az .lst file-ban szepen latszik (1387. sortol), hogy inkrementalja a 'buf' valtozot.
(#) pajti2 válasza bbb hozzászólására (») Júl 17, 2017 /
 
Menet közben sikerült kipróbálni csak a sima tömbkezelést is?
(#) bbb válasza pajti2 hozzászólására (») Júl 17, 2017 /
 
Sajnos annyi dolgom volt nap közben, hogy még nem jutottam el odáig. De ha "kidobhatom", ahogy fogalmaztál, akkor az nagy szégyen lenne a Microchip XC8 1.31 verziójára...
(#) pajti2 válasza bbb hozzászólására (») Júl 17, 2017 /
 
Szégyen vagy sem, próbáld ki, és azonnal ott egy bizonyíték országnak-világnak feketén-fehéren és teljesen félreérthetetlenül. Ha az eredmény elmarasztaló, akkor cefet nagy cég létükre volt merszük a sokadik update után is hulladékot gyártani, és olyasmiért a nyilvános meghurcolás a minimum, amit megérdemelnek. Ha nagyobb darab cég, majd nagyobbat puffan, amikor pofára zuhan
A hozzászólás módosítva: Júl 17, 2017
(#) AZoli válasza bbb hozzászólására (») Júl 17, 2017 /
 
Szia!

Próbáltad kivenni változóba a tömb aktuális elemét mielőtt paraméterként átadod?

  1. for(column=0;column<=127;column++)
  2. {
  3.             unsigned char a;
  4.             a = buf[counter];
  5.             WriteI2C1(a);
  6.             IdleI2C1();
  7.             counter++;
  8. }
A hozzászólás módosítva: Júl 17, 2017
(#) bbb válasza AZoli hozzászólására (») Júl 17, 2017 /
 
Szia!

Szerintem ezt még nem próbáltam.
(#) bbb válasza pajti2 hozzászólására (») Júl 17, 2017 /
 
Igazából már azt is szégyennek tartom, hogy a peripherial library csak az 1.34-es verzióig csapható hozzá. Az aktuális verzióhoz ha letöltöd a legutolsó változatot belőle, akkor kapásból összeakad és tákolni kell, hogy egyáltalán forduljon. Mondhatjuk erre, hogy használhatom helyette a code composer nevű csodát, igen ám, de ez a mikroproci nem támogatott benne, így kiröhög és mégse mehet.
Szóval van mit szégyelnie ennek a cégnek is, de ettől még nem fognak a falnak menni
(#) pajti2 válasza bbb hozzászólására (») Júl 17, 2017 /
 
Persze nem az én dolgom, de minek egy 8 bites pic-hez az új fordítót használni? Ha harmonyznál 32 biten, azt még meg tudnám érteni (és jót röhögnék a naivitásodon, hogy elhitted, működni fog de az egy teljesen másik sztori), de 8 biten mi a fenének játszol tövismadarat? Miért nem jók a régi mla project példák + régi 8 bites fordító?
(#) bbb válasza pajti2 hozzászólására (») Júl 18, 2017 /
 
Kipróbáltam, az se volt jó.
Viszont eszembe jutott, hogy kezeltem én már tömböt (igaz akkor pic12f629 volt az áldozat) és megnéztem ott mi volt a diferencia. A nagy különbség az volt, hogy ott konstans tömbjeim voltak, így gondoltam kipróbálom mi történik, ha ide is beteszem azt a bizonyos const szócskát...
Meglepetés! Pont azt rakja ki, amit a tömbben kap! Na már "csak" azt kell megfejteni, hogy vajon mi a fenét ronthat el a fordító ilyenkor? (Mert hát a konstans az azért konstans, mert az nem módosul, így tehát az nem maradhat.)
Cserébe, ha a tömb konstans, akkor nem kell pointerrel címezni, lehet direkt is, akkor is működik.
Na erre varrjon gombot az ember
Következő: »»   961 / 1203
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