Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1217 / 1320
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Igen, már én is azt akartam kérdezni, hogy nem 255 ott az adat? A kezelésben nem látok több hibát.

szerk: Ez azt jelenti, hogy megy?
A hozzászólás módosítva: Márc 5, 2016
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Megtudod esetleg Te is nézni? Hátha elsiklottam valami felett.
  1. #define BH1750_ADDR 0x46

  1. /* BH1750 init */
  2.     i2c_wait_idle();
  3.     i2c_start();
  4.     i2c_master_write(BH1750_ADDR | I2C_WRITE);
  5.     i2c_ack();
  6.     i2c_master_write(0x10);
  7.     i2c_ack();
  8.     i2c_stop();
A hozzászólás módosítva: Márc 5, 2016
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Kiolvasás előtt eleget vársz? (melyik módban indítot? más időket látok)
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Ami fehér ACK (from Slave to Master), azt idle-vel kell fogadni...
A hozzászólás módosítva: Márc 5, 2016
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Most ezt javítottam. Az init után várok kb. 800ms-ot is.
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Lehet, hogy erre aludni kéne egyet! Jó éjt!
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Igen amúgy! Holnap tiszta fejjel.
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Tuti, hogy a kommunikációval szúrok el valamit, találtam egy német fórumot ahol valakinek ugyan ez volt a gond, csak nem pontosan értem hogy oldották meg.
Itt Karlheinz mondja meg a tutit.
Szerk: Na úgy látom ő elhagyta az ack-t és a nack-t is.
A hozzászólás módosítva: Márc 5, 2016
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Nekem úgy tűnik, nem oldódott meg ott sem. Tedd fel a mostani kódot, hátha van még benne hiba! Ha az adatlap nem hibás, akkor nem szabadna ilyeneket csinálnia. Én RTCC-t és EEPROM-ot kezelek ezekkel a rutinokkal...

szerk: A baudod nézd még meg...
A hozzászólás módosítva: Márc 5, 2016
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Nézelődtem. Az alábbi kódban sem látom, hogy a cím kivitele után ACK-t is tolna.
Ez 16bites PIC-re íródott érdekes kommentekkel.
  1. I2C_Start   ();
  2.  
  3.     if ( opWriteRead == I2C_READ )
  4.     {
  5.     // LEE datos procedentes del I2C
  6.         I2C1TRN   =   ( addr << 1 ) + 0x01;
  7.         while ( I2C1STATbits.TRSTAT == 1 );     // Peligro de que el programa se quede atascado!!!
  8.  
  9.         I2C1CONbits.RCEN     =   1;
  10.         while ( I2C1CONbits.RCEN == 1 );
  11.  
  12.         aux                  =   I2C1RCV;
  13.  
  14.         I2C1CONbits.ACKEN    =   1;
  15.         while ( I2C1CONbits.ACKEN == 1 );       // Peligro de que el programa se quede atascado!!!
  16.  
  17.         I2C1CONbits.RCEN     =   1;
  18.         while ( I2C1CONbits.RCEN == 1 );        // Peligro de que el programa se quede atascado!!!
  19.         aux                 <<=  8;
  20.         aux                 +=   I2C1RCV;
  21.     }
  22.     else
  23.     {
  24.     // ESCRIBE datos por el I2C
  25.         I2C1TRN   =   ( addr << 1 ) + 0x00;
  26.         while ( I2C1STATbits.TRSTAT == 1 );     // Peligro de que el programa se quede atascado!!!
  27.  
  28.         I2C1TRN   =   cmd;
  29.         while ( I2C1STATbits.TRSTAT == 1 );     // Peligro de que el programa se quede atascado!!!
  30.     }
  31.  
  32.     I2C_Stop    ();
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Neked is XPT2046 touch IC van a TFT-n? Sikerült beüzemelned?
(#) Hp41C válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Idézet:
„Az alábbi kódban sem látom, hogy a cím kivitele után ACK-t is tolna.”

A master adja ki a slave címét. A címre a slave "tolja" az ACK -t, a master legfeljebb csak ellenőrizni tudja az ACKSTAT bit értékével.
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
A baud elvileg rendben van, 400kHz és másik IC kommunikál rajta.
Itt az i2c-t kezelő rutinok:
  1. void init_i2c()
  2. {
  3.     //init i2c
  4.     I2C2CONbits.I2CEN = 0;  //disable i2c
  5.     I2C2CONbits.A10M = 0;   //7 bit address
  6.     I2C2CONbits.DISSLW = 0; //disable slew control
  7.     I2C2BRG = 123;          //I2CxBRG = (PBCLK/(2*FSCK))-2. 123 @ FSCL = 400k, PBCLK = 100MHZ
  8.     I2C2CONbits.I2CEN = 1;
  9.    
  10. }
  11.  
  12. void i2c_wait_idle()
  13. {
  14.     //Wait until I2C Bus is Inactive
  15.     while(I2C2CONbits.SEN || I2C2CONbits.PEN || I2C2CONbits.RSEN || I2C2CONbits.RCEN || I2C2CONbits.ACKEN || I2C2STATbits.TRSTAT) continue;
  16. }
  17.  
  18. void i2c_start()
  19. {
  20.     I2C2CONbits.SEN = 1;
  21.         while(I2C2CONbits.SEN == 1);
  22. }
  23.  
  24. void i2c_master_write(uint8_t data)
  25. {
  26.     I2C2TRN = data;
  27.     //while(I2C2STATbits.TBF == 1);   //wait until send out data
  28.     while (I2C2STATbits.ACKSTAT == 1);  //wait until ACK recievered
  29. }
  30.  
  31. void i2c_master_read(uint8_t *data)
  32. {
  33.     I2C2CONbits.RCEN = 1;           // enable master for 1 byte reception
  34.         while(I2C2CONbits.RCEN) continue;      // wait until byte received
  35.     I2C2STATbits.I2COV = 0; //Túlcsordulás jelz? bit törölve
  36.     *data = I2C2RCV;
  37. }
  38.  
  39. void i2c_ack()
  40. {
  41.         I2C1CONbits.ACKDT=0;
  42.         I2C1CONbits.ACKEN=1;
  43.         while(I2C1CONbits.ACKEN) continue;
  44. }
  45.  
  46. void i2c_nack()
  47. {
  48.     I2C2CONbits.ACKDT=1;
  49.         I2C2CONbits.ACKEN=1;
  50.         while(I2C2CONbits.ACKEN) continue;              //  kész?
  51. }
  52.  
  53. void i2c_stop()
  54. {
  55.     I2C2CONbits.PEN=1;
  56.         while(I2C2CONbits.PEN) continue;                //  kész?
  57. }
  58.  
  59. void i2c_restart()
  60. {
  61.     I2C2CONbits.RSEN=1;
  62.         while(I2C2CONbits.RSEN) continue;               // Restart kész?
  63. }

Ez a chip inicializálása:
  1. /* BH1750 init */
  2.     i2c_wait_idle();
  3.     i2c_start();
  4.     i2c_master_write(BH1750_ADDR | I2C_WRITE);
  5.     i2c_wait_idle();
  6.     i2c_master_write(0x10);
  7.     i2c_wait_idle();
  8.     i2c_stop();

Ez a kiolvasó függvény:
  1. uint16_t bh1750()
  2. {
  3.     uint16_t data = 0;
  4.     uint8_t data_h = 0, data_l = 0;
  5.     i2c_wait_idle();
  6.     i2c_start();
  7.     i2c_master_write(BH1750_ADDR | I2C_READ);
  8.     i2c_wait_idle();
  9.     i2c_master_read(&data_h);
  10.     i2c_ack();
  11.     i2c_master_read(&data_l);
  12.     i2c_nack();
  13.     i2c_stop();
  14.     data = data_h; //0
  15.     data <<=8;
  16.     data |= data_l;
  17.     //data = data/1.2;
  18.     return data;
  19. }

Már kb. 1000-szer átnéztem...
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Már dolgoztam az XPT2046-al, de nekem annyira nem jött be. Nem találkoztam olyan jó minőségű rezisztiv touch-okkal.
Most kapacitívvel foglalkozok, ezen a kijelzőn is az van, gyakorlatilag olyan mint egy üveglap. FT5206 IC van rajta. Nagyon jó kis IC, 5 ujjat tud egyszerre érzékelni és gesztusokat is le lehet kérdezni, hogy történt-e például zoom in zoom out, move left stb... Bár nekem csak zoom in és zoom out-ot küldött, a move left, right, up és down valamiért sosem jött, annyira nem is teszteltem ezt a részét. Megmondja hány ujjal érinted meg, így tudod hány koordinátát kell lekérni.
Ez van még I2C-n rákötve ugyanerre a buszra. A kettő biztosan nem akad össze, mert le is állítottam ideiglenesen a külső megszakítást ami elindítja a koordináták lekérését.
(#) Wezuv válasza Hp41C hozzászólására (») Márc 5, 2016 /
 
Bocs, rosszul fogalmaztam, ACK-t fogadna.
(#) Wezuv válasza Droot hozzászólására (») Márc 5, 2016 /
 
Igazad van, a rezisztívek inkább gomb méretű kezelő felületekre jók, de azért nem vészesek. Közben sikerült beindítanom, volt egy olyan hiba az adat fogadásának ellenőrzésénél, ami miatt nem működhetett, ennek ellenére az MX-en megy most is!

Én is átnéztem, sajnos nem értem miért nem megy. Elvileg jól csinálsz mindent. De minden bizonnyal valami nem stimmel, ha eszembe jutna valami, jelzem.
(#) Droot válasza Wezuv hozzászólására (») Márc 5, 2016 /
 
Köszi, hogy átnézted. Ma nem tudok vele foglalkozni, de holnap nézegetem.
Szerintem a kapacitív sokkal frankóbb, ha van rá lehetőséged azt próbáld ki.
(#) pajti2 válasza GPeti1977 hozzászólására (») Márc 5, 2016 /
 
Majd most jól eltolok egy olyat, amit a nyomdafesték ugyan biztosan nem fog szeretni, de attól még igaz. Az egész embedded világban akkora az árverseny, hogy már mindegyik mammut veszteségesen üzemel. Szóval több pénze annak maradhatott, amelyik kevesebbet ugrált feleslegesen.
(#) Droot válasza Droot hozzászólására (») Márc 5, 2016 /
 
Esetleg ha valakinek van ötlete, kérem jelezze. Tehát a probléma az, hogy a data_l mindig 255.
(#) ktamas66 válasza Droot hozzászólására (») Márc 6, 2016 /
 
A programrészekből én nem látom helyes-e a reset időzítése (DVI láb), és a Power On parancsot sem. A folyamatábrán van egy szaggatott vonal ami a Power Down módban kiadott mérési parancsra utalhat, de nem találtam erre utalást, hogy ilyenkor mi történik.
(#) Droot válasza ktamas66 hozzászólására (») Márc 6, 2016 /
 
A DVI megfelelő, mert egy gyári próbapanelon van, amire ez is be van kötve.

Kipróbáltam a Power On paranccsal is, illetve a procedúrával, amit az adatlapban írnak de sajna semmi, a hiba ugyan az.

Más példaprogramokat nézegettem, úgy indul az IC, hogy be van kapcsolva és más példaprogramokban csak elküldik hogy milyen módban mennyen és mérnek.

Ma kipróbálom egy másik I2C eszközön. De másik eszköz meg ugyan ezen a buszon kommunikál. De azért kipróbálom a Raspberry PI-men, ott van előre megírt példakód, amivel mennie kell. Lehet, hogy a szenzor rossz, más már nagyon nem maradt.
(#) Droot válasza Droot hozzászólására (») Márc 6, 2016 /
 
Biztosan a programommal van gond, mert a raspberry-vel korrekten működött.
(#) Wezuv válasza Droot hozzászólására (») Márc 6, 2016 /
 
Azt írtad, van szkópod. Esetleg tárolós, kétsugaras?
(#) Droot válasza Wezuv hozzászólására (») Márc 6, 2016 /
 
Van, sajna nem tárolós, kétsugaras. Így sokra nem megyek vele.
Már rendeltem egy ilyen logikai analizátort, azt mondják frankó. SPI-hez is milyen jó lett volna...
(#) Wezuv válasza Droot hozzászólására (») Márc 6, 2016 /
 
PICKit2 vel is jól lehet boldogulni.
Most olvasom a 2013-as I2C adatlapban, hogy 2,4kOhm-ot ajánlanak felhúzónak...
(#) Attila86 hozzászólása Márc 6, 2016 /
 
Korábban már használtam óriási (több tízezer bájtos) tömböket a programmemóriában és akkor működött is szépen. Most ismét szükség lenne erre. Egy c fájlba beleírtam a tömbböt így:
  1. const unsigned char hangfile_ossian[] =
  2. {
  3. 130,127,125,123,124,124,
  4. };

A tömb persze sokkal nagyobb ennél, csak nem másoltam be ide az egészet. Nos erre ezt a hibaüzenetet adja a fordító:
Idézet:
„Link Error: PSV section '.const' exceeds 32K bytes (actual size = 75066).
Link Error: Could not allocate program memory”

Emlékszem hogy anno a fordító beállításainál (xc16-gcc/Memory model) be kellett pipálnom az "Allow arrays larger than 32K" beállítást. Ezt meg is tettem, a fenti hibaüzenetet már így adja ki.
Aztán előkotortam azt a régebbi projektemet amiben ilyen nagy tömböket használtam, megnéztem hogy ott hogyan csináltam, hát így:
  1. __prog__ unsigned char hangfile_ossian[] __attribute__((space(prog))) =
  2. {
  3. 130,127,125,123,124,124,
  4. };

Erre kidobott a fordító egy csomó piros hibaüzenetet és azt mondta hogy használjak nagy kód modellt. Ezt beállítottam (xc16-gcc/Memory model/Code model->Large), így már csak ez a baja:
Idézet:
„build/default/production/Menurendszer.o(.text+0x40): In function `.LSM23':
: Link Error: Cannot use relocation type WORD on a symbol (_hangfile_ossian) that is located in an executable section.”

Ezt nem sikerült megfejtenem. Mi nem még tetszik neki?
(#) Attila86 hozzászólása Márc 6, 2016 /
 
Van egy másik probléma is; építettem egy kis áramkört egy DIP tokos dsPIC33EP512MC502-vel, melynél a panelon ki volt vezetve egy tüskesorra az ICSP és ezen keresztül programoztam fel PICkit3-mal. Teljesen jól működött és azóta a kis panelt odaadtam a gazdájának. Most viszont két ugyan ilyen típusú PIC-be kellene beletöltenem ugyan azt a programot, immáron az áramkör nélkül. Fogtam hát egy IC foglalatot meg egy tüskesort és összekötözgettem a megfelelő lábakat:
ICSP 1 (MCLR) -> PIC 1-es lába,
ICSP 2 (VDD) -> PIC 13-as és 28-as lábai,
ICSP 3 (GND) -> PIC 8, 19 és 27-es lábai,
ICSP 4 (PGD) -> PIC 4-es lába,
ICSP 5 (PGC) -> PIC 5-ös lába.
Kisípoltam mindent és átnéztem háromszor hogy biztos minden jó helyre köt, nincs-e fordítva a PIC a foglalatban vagy fordítva rádugva a tüskesor a PICkit3-ra. Minden rendben van. A programban konfigbiteknél a PGD3 van kijelölve (#pragma config ICS = PGD3). A projekt beállításainál a PICkit3/Power/Power target circuit from PICkit3 be van pipálva, alatta pedig 3,25V van beállítva. A PICkit3-am működik, mert másik projektre átváltva, másik típusú PIC-et felismer és programoz. Ezt viszont sajnos nem akarja felismerni sehogy sem, ezt dobja fel:
Target Device ID (0x0) does not match expected Device ID (0x17850000).
Próbáltam az MPLAB IPE-vel is, hátha esetleg az felismeri a PIC-et, de nem. A PIC maga nem romolhatott nálam el mert nem csináltam vele semmit csak kivettem a dobozából és beledugtam a foglalatba. Ráadásul két ilyen (dsPIC33EP512MC502) mikrovezérlőm van így ki tudtam próbálni másikkal de azt sem programozza sajnos.
Van ötletetek hogy miért nem?
(#) potyo válasza Attila86 hozzászólására (») Márc 6, 2016 / 1
 
Tegyél próbára egy tápszűrő kondenzátort valahová a kontroller lábaihoz minél közelebb
(#) Attila86 válasza Attila86 hozzászólására (») Márc 6, 2016 /
 
Basszus... A VCAP lábra a kondi!!! Odatettem egy 4,7u-t és azonnal működik minden!
(#) pajti2 válasza Attila86 hozzászólására (») Márc 6, 2016 /
 
Ha bele tud férni workaround a programodba, csinálj halom sok kicsi tömböt, és egy burok macro-t az adatok lekérdezésére.
Következő: »»   1217 / 1320
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