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   138 / 139
(#) GPeti1977 hozzászólása Jan 24, 2022 /
 
MSP430G2553 mikrovezérlő 010FFh to 01000h címen levő tartalmát, ami katalógus szerint "Information memory", azt I2C buszon keresztül lehet változtatni?
(#) szitko válasza GPeti1977 hozzászólására (») Jan 24, 2022 /
 
A 010FFh to 01000h címeken nem a kalibrációs adatok vannak?
(#) GPeti1977 válasza szitko hozzászólására (») Jan 24, 2022 /
 
Valami hasonló, beállítás, pontosan nem tudom
(#) szitko válasza GPeti1977 hozzászólására (») Jan 24, 2022 /
 
Ha az emlékeim nem csalnak, akkor a DCO, ADC beállításai vannak ott (Flash memória SegmentA).
Hogy szeretnéd i2c-n keresztül állítani?
(#) GPeti1977 válasza szitko hozzászólására (») Jan 24, 2022 /
 
Valamiért valószínűleg átíródnak az adatok ezen a helyen, legalábbis nem egyforma, és feltételezzük hogy esetleg az okozza a hibát, csak I2C van kivezetve ahol kommunikál a fő kontrollerrel, ez a rész nem olyan mintha EEPROM ként lehetne használni?
A hozzászólás módosítva: Jan 24, 2022
(#) szitko válasza GPeti1977 hozzászólására (») Jan 24, 2022 /
 
Az USCI regiszterek a 8 bites perifériához tartoznak (0xff to 0x10), neked meg a 16 bites perifériában van a problémád.
A hozzászólás módosítva: Jan 24, 2022

USCI.jpg
    
(#) szitko válasza GPeti1977 hozzászólására (») Jan 24, 2022 /
 
Idézet:
„ez a rész nem olyan mintha EEPROM ként lehetne használni?”

De igen, Flash memória, A,B,C,D segment.
Egy-két programomban rendszeresen használom a flasht, de még soha nem volt vele olyan problémám, hogy "átíródtak, vagy elvesztek" volna az adatok. Ráadásol nem is olyan egyszerű a flasht írni.
(#) GPeti1977 válasza szitko hozzászólására (») Jan 24, 2022 /
 
Tehát az itt levő adatok olvasásához és irásához i2c porton keresztül lehetséges? Igen vagy nem?
(#) szitko válasza GPeti1977 hozzászólására (») Jan 24, 2022 / 1
 
Közvetlenül szerintem nem.
(#) GPeti1977 válasza szitko hozzászólására (») Jan 26, 2022 /
 
(#) szitko válasza GPeti1977 hozzászólására (») Jan 26, 2022 /
 
Ezért írtam, hogy szerintem az I2C vonalon nem tudod írni a Flasht.
Az alábbi kis program szösszenettel a CPU újraindulást számolom WDT segítséggel.
  1. // -- FLash művelet WDT számláló mentése --
  2.     wdt_count = flash_read(0x1000,0);                   // beolvassuk a flash-ből az adatot
  3.     if(wdt_count == 0xff){                                              // hamis adat kiküszöbölése
  4.         wdt_count = 0;
  5.     }
  6.     wdt_count++;                                                                // számláló növelése
  7.     flash_clear(0x1000);                                                // flash törlése kell!
  8.     flash_write(0x1000, wdt_count, 0);                  // WDT számláló írása flash-be
(#) GPeti1977 válasza szitko hozzászólására (») Jan 27, 2022 /
 
Közvetlenül nem, de ha meg van benne írva a program akkor csak lehet az általad mutatott függvényekkel. Egy kész termékről van szó, nem saját fejlesztés.
(#) szitko hozzászólása Nov 11, 2022 /
 
Sziasztok

Letöltöttem a Code Composer Studio v.7.4.0.00015 (mert ingyenes), de a beépített editorral van egy kis problémám.
Az ALTgr+ xy billentyűkobinációk 90%-a nem működik benne. Pl. {,^... karaktereket nem tudok írni.
Más programokban, pl. IAR, Enegia IDE, minden bill. jó.
Be lehet állítani valahol a bill.kiosztást?
(#) SBahadurD válasza szitko hozzászólására (») Nov 12, 2022 /
 
Szia!

Ha jól tudom, a CCS Eclipse alapú. Ha beállítás jellegű dolgod van vele, akkor az "eclipse" lesz az a keresőszó, amire érdemes ráguglizni. Amúgy:
Windows/Preferences/General/Keys.
Itt látod, hogy a különböző billentyűkombinációk mikhez vannak hozzárendelve. Sajnos a magyar billentyűkiosztás más, mint az angol és így a magyar kombinációk foglaltak különböző egyéb feladatokra. Ezeket meg kell szüntetni.
A keresőbe be kell írni a kívánt kombinációt (AltGr helyett ctrl+alt-t kell írni), rányomni a találatra és az Unbind Command gombra nyomni. Ekkor felszabadulnak a kombinációk.
(#) szitko válasza SBahadurD hozzászólására (») Nov 12, 2022 /
 
Köszönöm a segítséget.

Megnéztem az Eclipse-ben és ott sem mentek az AltGr kombinációk.
A CCS-ban a bill kombinációknál megtaláltam a "bűnös" beállításokat. Mivel nem nagyon használom a bill. kombinációkat töröltem a számomra fontos karakterek kombinációját.

A lényeg, hogy most minden jó lett.
(#) szitko hozzászólása Nov 22, 2022 /
 
Sziasztok

SPI-n szeretnék meghajtani 4 vagy 6db 7 szegmenses kijelzőt shift regiszterek segítségével (74hc595) amivel nincs is semmi gondom. A problémám és a kérdésem az lenne, hogy ha csak egy digit x szegmensét szeretném megváltoztatni, akkor mindenképp az összes digitet újra kell írni?
Pl. Ha egy 4 digites órát nézünk és a 3. digit DP szegmensét szeretném villogtatni másodpercenként, akkor mind a 4 digitet másodpercenkét úra kell írni?
Mind a 4 digitnek külön meghajtása van, tehát 4 db 74hc595.
(#) Bakman válasza szitko hozzászólására (») Nov 22, 2022 /
 
Ha láncolva vannak a regiszterek, akkor igen. Ehhez egyszerűen fenn kell tartani négy bájot. Amelyiket akarod, megváltoztatod, majd kiküldöd SPI-n az adatokat.

Ha csak három bájtot küldesz ki, akkor a negyedik regiszterbe az előző négyes csomag utolsó bájtja fog kerülni, mert a "tárolás" lábra adott impulzus a léptetőregiszter kimeneteit másolja át egy tárolóregiszterbe, de nem törli a léptetőregiszter tartalmát.

Ha

<óra tíz> - <óra egy> – <perc tíz> - <perc egy>

sorrenben vannak felfűze az IC-k, akkor három bájt kiküldése esetén a "perc egy" helyiértékre az előző adatcsomag "óra tíz" értéke fog kerülni.

szerk.:
A 74HCT595-ös adatlap szerint hajtható akár 57 MHz-es órajellel is, magyarán rövid idő alatt el lehet intézni az írást.
A hozzászólás módosítva: Nov 22, 2022
(#) szitko válasza Bakman hozzászólására (») Nov 22, 2022 /
 
Láncba vannak kötve. Így egyszerűbb a CA kijelzőket kezelni.
(#) szitko hozzászólása Nov 28, 2022 /
 
Sziasztok.

Több problémám is akadt a Ti USCI I2C Master programjával.
Az első és legnagyobb probléma, hogy nálam nem működik. Apró módosítások után sikerült működésre bírnom, de érdekelne, hogy miért nem megy az eredeti program.
Tehát az slaa382 DMA támogatás nélküli I2C vezérlő program adatküldés része nem megy:
  1. void TI_USCI_I2C_transmitinit(unsigned char slave_address)
  2. {
  3.   UCB0CTL1 = UCSWRST;                         // Enable SW reset
  4.  
  5.   P1SEL |= SDA_PIN + SCL_PIN;                 // Assign I2C pins to USCI_B0
  6.   P1SEL2 |= SDA_PIN + SCL_PIN;
  7.  
  8.   UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;       // I2C Master, synchronous mode
  9.   UCB0CTL1 = UCSSEL_2 + UCSWRST;              // Use SMCLK, keep SW reset
  10.   UCB0BR0 = i2c_prescale;                     // set prescaler
  11.   UCB0BR1 = 0;
  12.   UCB0I2CSA = slave_address;                  // Set slave address
  13.   UCB0CTL1 &= ~UCSWRST;                       // Clear SW reset, resume operation
  14.   UCB0I2CIE = UCNACKIE;
  15.   IE2 = UCB0TXIE;                             // Enable TX ready interrupt
  16. }

A fenti részben beállítjuk a hardveres I2C-t küldésre. A UCB0CTL1-ben beállítjuk az órajelet és a SW rezetet engedélyezzük.
  1. void TI_USCI_I2C_transmit(unsigned char byteCount, unsigned char *field){
  2.   TI_transmit_field = field;
  3.   byteCtr = byteCount;
  4.   UCB0CTL1 |= UCTR + UCTXSTT;                 // I2C TX, start condition
  5. }

Az adat küldésnél az UCB0CTL1 -ben beállítjuk, hogy adat küldés lesz és kiadjuk a START parancsot ami újra kiküldi a slave címet.
Ha indítottam egy küldést a program lefutott és nem csinált semmit, illetve kiküldte a slave címet de adatot már nem küldött.
A CCS-ben megnéztem a regisztereket és a TI_USCI_I2C_transmit-ban történő beállításokat amiket az UCB0CTL1 ben kellen vérgehajtani, nem hajtotta végre. A UCTR és UCTXSTT regiszter 0 maradt.
Csak akkor hajlandó a program az adtatküldésre, ha a transmitinit részben engedélyezem ezt a két regisztert.
De miért? Nálam lehet a hiba?
A másik dolog amit nem értek az I2C busz ellenöző részben van:
  1. UCB0CTL1 |= UCTR + UCTXSTT + UCTXSTP;       // I2C TX, start condition
  2.   while (UCB0CTL1 & UCTXSTP);                 // wait for STOP condition

Nem értem, hogy ezt miért így írták meg, hisz itt a while ciklusból soha nem lép tovább a program.
Vagy én értek valami félre?
(#) szitko hozzászólása Dec 15, 2022 /
 
Sziasztok.

MAX6957 -el akadt egy kis problémám. Az adatlap szerint ha több IC kötünk kaszkádba és pl. a mádosik IC-nek szeretnénk adatot küldeni akkor az első IC-nek csak egy No-Op parancsot kell küldeni. Ezzel talán még nem is lenne bajom. Az igazi probléma már az IC-k beállításánál jelentkezik, ugyanis valamiért nem "egyszerre" kapják meg az adatokat. Szintén az adatlap szerint 15 óraütés után kellen megkaja a második IC az adatot, de ez sem stimmel (csatolt kép).
Valamit én értek félre az adatlapban? Bárhogy próbálok adatokat köldeni, a kijelzőn össze-vissza jelenik meg az infó.
Néztem a MAX7219 beállításait, mert nem sokban különböznek, de azzal sem lettem okosabb.

logic.jpg
    
(#) Bakman válasza szitko hozzászólására (») Dec 15, 2022 /
 
Ha csak egy IC-t vezérelsz, akkor működik az az egy úgy ahogy kell?
(#) szitko válasza Bakman hozzászólására (») Dec 15, 2022 /
 
Igen működik.
Bár én csak 7 szegmenses kijezőket hajtok vele, nem 14-16-ost, de ez a lényegen nem változtat.
Azt elfelejtettem írni, hogy az adatlap szerint vannak bekötve az ic-k.
Tehát a CS az SCLK adatvonal mindkettőnél ugyan az.
(#) Bakman válasza szitko hozzászólására (») Dec 15, 2022 /
 
Egy IC két bájtot kér, két IC négyet. Elöször azokat a bájtokat kell küldened, amelyeket a láncban a másodiknak szánsz. Ha csak a második IC-ben akarsz változást, akkor kiküldöd az annak szánt bájtokat, majd kétszer a 0x00 bájtot. Nem tudom ellenőrizni, de az adatlapból úgy látom, a CS vonalnak folyamatosan (amíg a négy bájt ki nem szalad a mikrovezérlőből) L szinten kell lennie és csak az "adás" végeztével kell H szintre húzni.
(#) szitko válasza Bakman hozzászólására (») Dec 15, 2022 /
 
Idáig én is eljutottam. Nem ez a probléma, hanem az inicializálás.
Az előző hsz-ben csatolt képen látszik a probléma.
D0 = CS
D1 = MOSI
D2 = SCLK
D3 = IC1 DOUT -> IC2 DIN.
Az analizálás közvetlenül bekapcsolás után készült. Azt sem értem, hogy IC2 honnan szedte az első két bájtot (0x04, 0x01).
Az adatlap szerint bekapcsolás után (power up) minden alaphelyzetbe áll.
Idézet:
„Nem tudom ellenőrizni, de az adatlapból úgy látom, a CS vonalnak folyamatosan (amíg a négy bájt ki nem szalad a mikrovezérlőből) L szinten kell lennie”

Nem csak kettő bájtig kell alacsony szinten tartani? Első az MSB aztán LSB.
(#) icserny válasza szitko hozzászólására (») Dec 15, 2022 /
 
"Nem csak kettő bájtig kell alacsony szinten tartani?"
Nem. Ha n db. IC van sorbakötve, akkor csak nx16 bit kiküldése után kerül minden bit a megfelelő helyre a bekapuzáshoz, amit a CS jel felfutó éle vált ki.

"Tehát a CS az SCLK adatvonal mindkettőnél ugyan az. "
Ez rendben van.
(#) szitko válasza icserny hozzászólására (») Dec 15, 2022 /
 
Sajnos ez nálam nem megy.
Tehát az inicializációt is 16 bitenként kéne kiküldeni?
Init rész:
  1. void max_init(){
  2.         max_write_data(0x02, 0x0d);                     // global current 0x07=12mA
  3. //      max_write_data(0x09, 0x00);                     // Port  P7, P6, P5, P4         All LED
  4. //      max_write_data(0x0a, 0x00);                     // Port  P11, P10, P9, P8
  5.         max_write_data(0x0b, 0x00);                     // Port  P15, P14, P13, P12
  6.         max_write_data(0x0c, 0x00);                     // Port  P19, P18, P17, P16
  7.         max_write_data(0x0d, 0x00);                     // Port  P23, P22, P21, P20
  8.         max_write_data(0x0e, 0x00);                     // Port  P27, P26, P25, P24
  9.         max_write_data(0x0f, 0x00);                     // Port  P31, P30, P29, P28
  10.         max_write_data(0x04, 0x01);                     // config register normal op
  11. }

  1. void max_write_data(uint16_t add, uint16_t value){
  2.         SPI_writeData2byte(add, value);
  3. }

SPI:
  1. void SPI_writeData2byte(uint16_t addres, uint16_t data)
  2. {
  3.         P2OUT &= ~CS_BIT;
  4.         UCB0TXBUF = addres;
  5.         while( UCB0STAT & UCBUSY );
  6.         UCB0TXBUF = data;
  7.         while( UCB0STAT & UCBUSY );
  8.         P2OUT |= CS_BIT;
  9. }

Most ezeket a függvényeket átírtam 4 bájt küldésre, de a siker elmaradt. A képen látszik

log2.jpg
    
(#) Bakman válasza szitko hozzászólására (») Dec 15, 2022 /
 
Két IC-t akarsz beállítani, a beállításokat kétszer kell elküldened.

szerk.:
Ugyanazon beállítás elküldése két IC-nek:
CS alacsonyra
0x04, 0x01, 0x04, 0x01
CS magasra
A hozzászólás módosítva: Dec 15, 2022
(#) szitko válasza Bakman hozzászólására (») Dec 15, 2022 /
 
Nem úgy kell elküldeni mint a max7219-nél?

IC1:
CS alacsony
0x04, 0x01
CS magas
IC2:
CS alacsony
0x04, 0x01, 0x00, 0x00
CS magas

szerk.:
Az általad írtak eredménye. A DOUT-on kétszer jött ki az adat.
A hozzászólás módosítva: Dec 15, 2022

log3.jpg
    
(#) szitko válasza Bakman hozzászólására (») Dec 15, 2022 /
 
Végül sikerült.
Köszönöm a segítséget mindkettőtöknek.

A hibát ott követtem el, hogy debugg módban mindig csak az MSP-t indítottam újra és a MAX6957-et nem rezeteltem. Illetve néha levettem a tápot róla, de a logikai analizátoron keresztül, az SPI vonalon kapott áramot.
(#) szitko hozzászólása Dec 17, 2022 /
 
Még mindig MAX6957.

Összedobtam pár függvényt a számjegyek megjelenítéséhez.
Egy egyszerű számlátót próbáltam négy szemjeggyel.
  1. //  0       1     2         3     4         5     6         7     8             9        DP
  2. const unsigned char szamok[] = {0xee, 0x48, 0xd6, 0xda, 0x78, 0xba, 0xbe, 0xc8, 0xfe, 0xfa, 0x01};
  3.                 for(i=0; i<10; i++){
  4.                         maxWriteData(4, szamok[i]);
  5.                         if(i==9){
  6.                                 maxWriteData(3, szamok[d3++]);
  7.                         }
  8.                         if(d3==10){
  9.                                 maxWriteData(2, szamok[d2++]);
  10.                         }
  11.                         if(d2==10){
  12.                                 maxWriteData(1, szamok[d1++]);
  13.                         }
  14.                         delay_ms(300);
  15.                 }
  16.                 if(d3==10)
  17.                         d3=0;
  18.                 if(d2==10)
  19.                         d2=0;
  20.                 if(d1==10)
  21.                         d1=0;

SPI írás:
  1. void maxWriteData(uint8_t digit, uint16_t value){
  2.  
  3.         switch(digit){
  4.         case 1:
  5.                 SPI_writeData4byte(0x54, value, 0x00, 0x00);
  6.         break;
  7.         case 2:
  8.                 SPI_writeData4byte(0x4c, value, 0x00, 0x00);
  9.         break;
  10.         case 3:
  11.                 SPI_writeData4byte(0x00, 0x00, 0x54, value);
  12.         break;
  13.         case 4:
  14.                 SPI_writeData4byte(0x00, 0x00, 0x4c, value);
  15.         break;
  16.         }
  17. }

Le lehet ezt valahogy egyszerűsíteni? Mármint az írást.
Persze a MAX adatlapában van egy pár lehetőség a portok írására, de az csak mégtöbb függvényt jelentene.
Következő: »»   138 / 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