Fórum témák

» Több friss téma
Fórum » MSP430 mikrovezérlők
 
Témaindító: gomzito, idő: Ápr 21, 2006
Témakörök:
Lapozás: OK   46 / 139
(#) icserny válasza colosseum hozzászólására (») Márc 19, 2012 / 1
 
Az SPI_MODE_0 a CKP és CKE beállításhoz kell (az SPI kommunikációban négyféle üzemmód lehetséges, amelyek az órajel polaritásában és fázisában különböznek. Bővebben: Link).

SPI_CLK_DIV_16 bizonyára azt jelenti, hogy Fosc/16 lesz az SPI órajel frekvenciája (Fosc = 1 MHz esetén 62500 Hz).
(#) colosseum hozzászólása Márc 19, 2012 /
 
Köszönöm szépem mindkettőtöknek a választ. Így már remélem közelebb jutok a megoldáshoz
(#) icserny válasza colosseum hozzászólására (») Márc 19, 2012 / 1
 
Nem látom át a programot, csak szemet szúrt egy dolog: Az miért jó, ha egy bemenő vonalat P1OUT--hoz és nem P1IN-hez rendelsz?
  1. #define SDI             P1OUT_bit.P1
(#) colosseum válasza icserny hozzászólására (») Márc 19, 2012 /
 
Kedves Icserny , teljesen igazad van hajnal volt és elírtam nálam már javítva van a hiba.

Időközben rájöttem, hogy mégis csak működik a printf IAR alatt, igaz nem úgy ahogy én szeretném , de megy.
HA valaki még nem jött volna rá akkor Tiny módba kell tenni és debug közben a terminal I/O részben kiirja a dolgokat.
(#) colosseum hozzászólása Márc 19, 2012 /
 
Ha ma sem haladok vele akkor holnap rákötöm mind a kettőt egy szókpra hátha előrébb jutok.

Bár már értem el félsikereket ma , valamiért nem küldi ki az adatot de státusz regisztert tudok olvasni.
Csak a pontos óra beállítást és ezeket UCCKPL és UCCKPH-t kell megfejteni hogy miképpen is vannak.

Icserny ha jol értelmeztem az kis kézikönyved a Ti hoz akkor a az SMLCK az alap órajelet használaj alapból ami 1mhz esetén 1mhz és
pl:UCA0BR0__SPI = 2 ez lehet a megfelelője a Pices SPI_CLK_DIV_16-nak.
Sajnos CCS nincen fent , vagyis nem akar menni.
(#) szitko válasza colosseum hozzászólására (») Márc 19, 2012 / 1
 
Idézet:
„pl:UCA0BR0__SPI = 2 ez lehet a megfelelője a Pices SPI_CLK_DIV_16-nak”

Nemegészen. A PIC 1MHz = 1000000/16=62,5kHz, MSP430 SMCLK 1MHz= 1000000/2=500kHz.
(#) colosseum válasza szitko hozzászólására (») Márc 19, 2012 /
 
igy van én az osztó beállításra gondoltam, hogy ezzel lehet megadni neki az osztást.
gondoltam h 1000/2 az 500 lesz

Nah akkor ma az elejétől neki ugrok meginthátha össze jön.
(#) szitko válasza colosseum hozzászólására (») Márc 19, 2012 / 1
 
Bocsi, akkor én értettem félre.
A válasz, igen. Az UART kapcsolatnál, én így állítottam be a sebességet 3,358mHz-es órajelnél:
  1. UCA0BR0 = 94;              // 3,358MHZ=SMCLK/349 = ~9600
  2.   UCA0BR1 = 1;


Mégegyszer, bocsi a félreértésért.
(#) colosseum hozzászólása Márc 19, 2012 /
 
Nah akkor neki leselkedek majd.

Igazábol kerestem én ezeket a beállításokat , de valahogy vagy átsiklottam felette vagy nem találtam egy leírást hogy a kettő UCA0BR0 és BR1 miképpen konfigolandó tudom ott a family guid , nah de valami szájbarágósabb kell az elején
(#) szitko válasza colosseum hozzászólására (») Márc 19, 2012 /
 
Pedig a FUG pontossan leírja.
Idézet:
„Clock prescaler setting of the Baud rate generator. The 16-bit value of (UCAxBR0 + UCAxBR1 × 256) forms
the prescaler value.”

Az én példámnál már módosítva lett az érték, 3,358mHz/350=9594, csak a kommentben maradt benn a 349!
(#) colosseum válasza szitko hozzászólására (») Márc 19, 2012 /
 
Kedves Szitko

még egy kérdést engedj meg számomra.
Meg van irva nekem egy fügvény ami az spi küldés fogadást végzi, jól értelmeztem a neten ugye , hogy csak 8bitet eszik meg az SPi .
  1. command_high=command>>8;
  2. command_low =command;
  3.    
  4.         UCA0TXBUF = command_high;
  5.         data_in_high = UCA0RXBUF;    // writing upper byte, reading upper byte
  6. UCA0TXBUF = command_low;
  7.         data_in_low  = UCA0RXBUF;     // writing lower byte, reading lower byte


Eddig nem volt benne kétségem viszont most nézegettem a header fájlt és éppen ott láttam hogy LSB vagy MSB , lehet hogy magától lekezeli a 16bitet?
(#) szitko válasza colosseum hozzászólására (») Márc 19, 2012 / 1
 
Ezekben a kommunikációkban, (SPI, I2C, UART) még én is gyerekcipőben járok. A minap próbálgattam egy SPI-s gyorsulásmérőt, de én az "Universal Serial Interface (USI)" modult használom.
MSP430g2xx1 USI SPI:
  1. USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE;     // Port, SPI mester
  2. USICTL1 |= USICKPH + USIIE;
  3. USICKCTL = USIDIV_4 + USISSEL_2 + USICKPL;                // / 16 SMCLK
  4. USICTL0 &= ~USISWRST;
  5. USICNT |= USI16B;   // 16 bit
  6.  
  7. // küldés
  8. USISRH = 0x80;                          // első byte
  9. USISRL = 0x8E;                           // második bájt
  10. USICNT |= 16;

Az USCI SPI modal még nem foglalkoztam, csak az UART részével, de ott asszem csak 8bit megy.
(#) colosseum válasza szitko hozzászólására (») Márc 19, 2012 /
 
Köszi


Sajnos nekem csak 2553-sok vannak itthon vagy 10 darab , és abban csak USCI van :/
Nah sebaj , azért forum hogyha valaki rájön megossza

Ha sikerült életre keltenem akkor majd írok
(#) szitko válasza colosseum hozzászólására (») Márc 20, 2012 / 1
 
Idézet:
„nah de valami szájbarágósabb kell az elején”

Mind a két regiszter (UCAxBR0, UCAxBR1) 8 bites! A két regiszter határozza meg a sebességet, melynek kiszámítása a következő képletekkel lehetséges.
Első képlet: (FUG-ban szereplő)
UCA0BR0 = 94;
UCA0BR1 = 1;
UCA0BR0 + UCA0BR1 × 256 = 94 + 1 * 256 = 350
( A szorzás magasabb rendű, mint az összeadás)

Második képlet: (Ahogy én jegyeztem meg)
16 bitben a 350 = 0000 0001 0101 1110
UA0BR0 = alsó 8bit = 94 = 0b0101 1110
UA0BR1 = felső 8bit = 1 = 0b0000 0001
Remélem jól írtam, és elég "szájbarágós"!
Mégegy megjegyzés:
  1. UCA0TXBUF = command_high;
  2. // itt nem kéne figyelni, hogy ki ment-e az adat?
  3. // while (!(IFG2 & UCA0TXIFG));
  4. data_in_high = UCA0RXBUF;    // writing upper byte, reading upper byte
  5. UCA0TXBUF = command_low;
  6. // itt szintén.
  7. data_in_low  = UCA0RXBUF;     // writing lower byte, reading lower byte


Ha valamit rosszul írtam volna, javítsatok ki.
(#) colosseum válasza szitko hozzászólására (») Márc 20, 2012 /
 
Tökéletes
Köszönöm.
(#) colosseum hozzászólása Márc 21, 2012 /
 
Sikerült ma beszereznem egy csodás Digilentes EE boardot (Link).( Köszönet érte az UNIDEB-nek)
Elég érdekes elven megy ez a Ti elvileg minden ugyan az a beállítás mint a PIcnél , csináltam egy képet Link a jelenségről:O.
Este kísérletezek még.
(#) szitko hozzászólása Márc 21, 2012 /
 
Sziasztok.
Újra falba ütköztem az I2C-vel. Egy ADXL312-t szerettem volna életre kelteni.
  1. void adxl_write(int reg, int adat){
  2.     UCB0I2CSA = 0x1d;                        // Slave cím + írás
  3.     UCB0CTL1 &= ~UCSWRST;                    // reszet tiltás
  4.     UCB0CTL1 |= UCTR + UCTXSTT;              // adat küldés, indítás
  5. //    UCB0TXBUF = 0x3a;                        // írás
  6. //    while (!(IFG2 & UCNACKIFG));             // várunk míg kiér az adat
  7.     UCB0TXBUF = reg;                         // reg
  8.     while (!(IFG2 & UCNACKIFG));             // várunk míg kiér az adat
  9.     UCB0TXBUF = adat;                        // adat
  10.     while (!(IFG2 & UCNACKIFG));             // várunk míg kiér az adat
  11.     UCB0CTL1 |= UCTXSTP;                     // i2c leállítás
  12. }                      // void
  13. void adxl_read(int reg){
  14.     UCB0I2CSA = 0x1d;                        // Slave cím + írás
  15.     UCB0CTL1 &= ~UCSWRST;                    // reszet tiltás
  16.     UCB0CTL1 |= UCTR + UCTXSTT;              // adat küldés, indítás
  17.     UCB0TXBUF = reg;                         // reg
  18.     while (!(IFG2 & UCNACKIFG));             // várunk míg kiér az adat
  19.     UCB0TXBUF = 0x3b;                        // olvasás
  20.     while (!(IFG2 & UCNACKIFG));             // várunk míg kiér az adat
  21.     adat_x0 = UCB0RXBUF;                     // adat
  22.     while (!(IFG2 & UCNACKIFG));             // várunk míg kiér az adat
  23.     UCB0CTL1 |= UCTXSTP;                     // i2c leállítás
  24.  
  25.      adxl_write(0x31,0x09);                    // DATA_FORMAT= FULL/res, 3g
  26.      adxl_write(0x2d,0x08);                    // POWER_CTL = auto sleep
  27.      delay_ms(100);
  28.      adxl_read(0x32);

Az adatok kimennek, elvileg, de nem csinál semmit. A slave addres azért 0x1d, mert az ALT ADDRES pin fel van húzva. Csatoltam az adatlapot is, hátha valakinek van egy kis ideje belenézni.

ADXL312.pdf
    
(#) icserny válasza szitko hozzászólására (») Márc 21, 2012 /
 
Idézet:
„A slave addres azért 0x1d, mert az ALT ADDRES pin fel van húzva.”
Fogadjunk, hogy a második mondatot már nem olvastad el!
Idézet:
„With the ALT ADDRESS pin high, the 7-bit I2C address for the device is 0x1D, followed by the R/Figure 26Table 10Table 11Figure 27W bit. This translates to 0x3A for a write and 0x3B for a read”
(#) szitko válasza icserny hozzászólására (») Márc 21, 2012 /
 
"Elolvastam". A 0x3a írás, 0x3b olvasás. Ha erre gondolsz. Ez az amit nem értek. A Figure 27 szerint,
START i2c - slave address+write - register addres - data - stop i2c.
UCB0I2CSA = 0x1d; ezzel megadom a slave címet. (mást nem is tudok beírni, mert különben nem megy tovább.) Ezutána kell neki megmondani, hogy írás lesz? Próbáltam úgy is, de az eredmény ugyanaz.
Egyre bonyolultabb eszközöket szedek elő, és egyre jobban nem értem az i2c-t.
(#) colosseum válasza szitko hozzászólására (») Márc 21, 2012 /
 
Idézet:
„Egyre bonyolultabb eszközöket szedek elő, és egyre jobban nem értem az i2c-t.”


hát ezzel én is így vagyok
Sajnos i2C-t még nem használtam csak SPI-t így abban nem tudok segíteni.
(#) icserny válasza szitko hozzászólására (») Márc 21, 2012 /
 
Na tessék! Most kiderül, hogy én nem olvastam el az MSP430 I2C kezelését. Még mindig nincs időm foglalkozni vele, így abba nem tudok beleszólni, hogy mit hova kell írni. Mindenestre a kimenő bájtban (ami az adatvonalon megjelenik) az első 7 bit a cím, a 8. bit az R/W bit, így lesz ott az 1D-ből 3A vagy 3B, s a PIC esetében ezt így is kell megadni.

Itt viszont, ha külön regiszter van a címnek és jobbra igazítva kell beírni a címet, akkor jó a UCB0I2CSA = 0x1d; utasításod, s vedd úgy, hogy nem is szóltam! Árnyékra vetődtem...
(#) colosseum válasza icserny hozzászólására (») Márc 21, 2012 /
 
Teljesen más mint a pic tegnap már találtam majdnem egy ugyan olyan beállítást mint a Picnél, de mégsem ugyan olyan. rámérve tegnap logikai analizátorral az sdi láb minig magas és csak iráskor megy alacsonyba(de lehet h az sdo , a kettőből az egyik.)

A TI-t akárhogy állítgattam mindig 0-ra ment vissza mind a 2
(#) szitko válasza icserny hozzászólására (») Márc 21, 2012 /
 
Ha jól emlékszem, jobbra igazítva kell megadni. De akkor azt nem értem, hogy hogy adjam meg neki, hogy írni fogok, vagy olvasni. Mondjuk az írás megy, mert azthiszem az az alapértelmezett.
Nem értem
(#) icserny válasza szitko hozzászólására (») Márc 21, 2012 /
 
Idézet:
„hogy adjam meg neki, hogy írni fogok?”
Bizonyára egy másik regiszterben.
Itt még úgy tűnt, hogy tudtad.
(#) szitko válasza icserny hozzászólására (») Márc 21, 2012 /
 
Igen, de nem megy. Vagyis az írás megy, mert az adatok kimennek. Az olvasásra nem csinál semmit.
Röviden: megadom a slave címet - 0x1d (semmi mást nem tudok megadni, mert különben leáll.)
beírom, hogy írás lesz: UCB0TXBUF = 0x3a; (ugyanaz mint előbb, csak ezt lehet megadni.)
Kiküldöm az egyéb beállításokat, pl: UCB0TXBUF = 0x31; (DATA_FORMAT) de ezt már az adatlap szerint, adatnak veszi. (Szerintem. Ha jól értem az adatlapot figu 27)
Olvasásnál: slave cím -> írás (0x3a) -> DataX0 (0x32) -> olvasás (0x3b) -> UCB0CTL1 &= ~UCTR; -> UCB0CTL1 |= UCTXSTT; (i2c start) -> RXbuffer 0x00.
És mindíg csak 0. Na de nem adom fel, majd rájövök, hogy hol hibázom.

Amúgy a FUG szerint jobbra igazítva kell megadni a slave címet.
(#) szitko válasza szitko hozzászólására (») Márc 21, 2012 / 1
 
Végre áttörést értem el. Megtudtam, hogy jó az általam készített nyákba, beforrasztott adxl312-es. Pedig már azt hittem, hogy azért nem olvas semmit mert vagy a forrasztás, vagy a nyák rossz. Küldött egy jelet. Ha csak símán a slave cím után bekapcsolom az olvasást, (UCB0CTL1 &= ~UCTR;) akkor az adxl elküldi a DEVID-t, ami most esetemben 0xe5.
(#) colosseum hozzászólása Márc 21, 2012 /
 
Végre neked sikerül
Én akár hogy állítgatom az óra jelet még köszönő viszonyban sincsen a másikkal.(logikai analyzer-el néztem)

ha meg nagyából ugy néz ki akkor meg beint nem csinál semmit.
(#) szitko válasza colosseum hozzászólására (») Márc 21, 2012 /
 
Ezt láttad már?
Hátha valamit ki tudsz belőle bogarászni.
(#) colosseum válasza szitko hozzászólására (») Márc 21, 2012 /
 
köszönöm meglesem
(#) szitko hozzászólása Márc 22, 2012 / 1
 
Sziasztok.
Végre összeállt az adxl312 i2c kommunikáció, de lenne pár kérdésem.
Nem értem az UCB0CTL1 |= UCTR; regiszter szerepét. Azt értem, hogy az írás-olvasást állítom be vele, de az adxl312 esetében, ha írok, akkor ki kell küldenem az írási címet (0x3a vagy 0xa6), de olvasásnál viszont csak a UCB0CTL1 &= ~UCTR; regisztert kell beállítani olvasásra. Az olvasási cím nem kell neki. Miért?
A másik amit nem értek, hogy az olvasás végén mit kell csinálni a NACK -al? Ha jól olvastam, akkor a NACK visszaáll 0-ba a művelet végén. Kivéve az adat küldésnél, az ERRATA szerint.
Az lenne az igazán jó dolog, ha érteném is amit csinálok.
Következő: »»   46 / 139
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