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   36 / 139
(#) szitko válasza szitko hozzászólására (») Feb 11, 2012 /
 
Rájöttem, hogy mire figyelmeztet. Illetve nem jöttem rá csak... Ha az "io430.h" (ami az io430g2553.h-t hívja) helyett az "msp430g2553.h"-t rakom be, akkor nem figyelmeztet. De hogy miért?
(#) bedoweb válasza icserny hozzászólására (») Feb 11, 2012 /
 
Köszi... ogen be kellett rakni, amúgy nekem 6.1 van.
(#) szitko hozzászólása Feb 12, 2012 /
 
Sziasztok.
Újra problémám van az I2C-vel. Egy mcp23008-t szeretnék működésre bírni, de nem értem, hogy hogy küldjem ki neki a parancsokat.
A beállítások: reset=Vcc, A0,A1,A2=Vss, SCL=P1.6 SDA=P1.7 4,7k-val Vcc-re.
  1. UCB0I2CSA = 0x40;   //Slave címe

Kiválasztom az mcp23008 címét, de utána, hogy küldjem ki neki a beállításokat? Pl. az IODIR=0x00-át, hogy mind kimenet legyen? A UCB0TXBUF = 0x00-val nem csinál semmit, hiába küldöm ki nemki egymás után töbször. A vezérlő=G2553.
(#) icserny válasza szitko hozzászólására (») Feb 12, 2012 /
 
Az adatlap részletesen ismerteti a protokolt. A legegyszerűbb így:
write2I2C1(MCP23008ADDR,IODIR_CIME,0);

Azaz 3 bájtot kell küldeni:
1. Az eszköz 7 bites I2C címe és az R/W bit
2. Az IODIR regiszter címe (adatlap szerint)
3. Az IODIR regiszterbe írni kívánt adat
Itt találsz egy mintapéldát, bár PIC24 és MCP23017, amiben minden regiszterben 2-2 db van (ezért szerepel ott IODIRA és IODIRB).
(#) szitko válasza icserny hozzászólására (») Feb 12, 2012 /
 
Azt nagyából"értem" amit az adatlap ír, hogy hogyan kell kiadni a parancsokat, és olvastam az oldaladon az ide kapcsolódó részt is. Nekem a hogyan okoz problémát. Pl. a PCF8574-nél úgy csináltam, hogy
1: slave cím__UCB0I2CSA = 0x20;
2: adat küldés__UCB0TXBUF = xy;
  1. void pcf8574_adat(unsigned char tx){
  2.   UCB0I2CSA = 0x20;                         // Set slave address
  3.   UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  4.   UCB0CTL1 |= UCTR + UCTXSTT;             // adat küldés, start
  5.   UCB0TXBUF = tx;                         // TXbuff
  6.   while (UCB0CTL1 & UCTXSTT);             // várunk míg kiér az adat? UCTXSTT = 0
  7.   UCB0CTL1 |= UCTXSTP;                    // I2C álj
  8. }

Ez így szépen működik a pcf-nél, de az mcp23..-nál a while parancsnál leál. Magyarul az a "write2I2C1" nem tiszta.
(#) icserny válasza szitko hozzászólására (») Feb 12, 2012 /
 
Az MCP23008 RESET lábát felhúztad?
(#) szitko válasza icserny hozzászólására (») Feb 12, 2012 /
 
Igen. Közben megfogalmazódott bennem, a problémám értelmes megfogalmazása.
Tehát, azt nem értem, hogyan küdjek ki neki 3 bájtot. Egymás után? Pl:
UCB0TXBUF = 0x00;
UCB0TXBUF = 0x0a;
Mert ugye a UCB0I2CSA = 0x40-el, az mcp23008 címét beállítom, és utánna ahoz már nem kell nyúlni.(Csak ha rárakok mégegyet)
(#) icserny válasza szitko hozzászólására (») Feb 12, 2012 /
 
Egymás után, csak persze, meg kell várni a küldés végét. A G2553 mintapéldák közül a msp430g2xx3_uscib0_i2c_03.c program csinál hasonlót, csak ott a feladat jellege miatt végtelen ciklusban nyomja az adatot (DAC-ra, hullámforma táblából).

Abban a programban az USCIAB0TX_VECTOR-ba érkező megszakítás jelzi, hogy befejeződött a küldés. Gondolom, a hozzá tartozó IFG bit szoftveresen is lekérdezhető.
(#) szitko válasza icserny hozzászólására (») Feb 12, 2012 /
 
Megcsináltam, de nem megy.
  1. UCB0I2CSA = 0x40;            // cím
  2.     UCB0CTL1 &= ~UCSWRST;
  3.     UCB0CTL1 |= UCTR + UCTXSTT;  
  4.     UCB0TXBUF = 0x00;                    // iodir
  5.     while (UCB0CTL1 & UCTXSTT);
  6.     UCB0TXBUF = 0x01;                    // gp0 pin10
  7.     while (UCB0CTL1 & UCTXSTT);
  8.     UCB0CTL1 |= UCTXSTP;

Már teljesen belekeveredtem. A "while" utasításnál egy amatőr hiba miatt állt le. (már sokszor elkövettem) Nem húztam le a led jamperét. (P1.6)
(#) icserny válasza szitko hozzászólására (») Feb 13, 2012 /
 
Ha jól értem a Family User Guide "17.3.4.2.1 I2C Master Transmitter Mode" alfejezetében leírtakat, a második while ciklusban nem az UCTXSTT bitet kellene figyelni, hanem az ICFG2 regiszterben az UCB0TXIFG jelzőbitet!

Az UCTXSTT bit az én értelmezésem szerint a slave cím nyugtázásakor törlődik, és a továbbiakban nulla is marad. Az UCB0TXIFG bit pedig azt jelzi, hogy újabb adatot írhatsz a kimeneti bufferbe.
(#) szitko válasza icserny hozzászólására (») Feb 13, 2012 /
 
Valahol, valamit az elején nagyon elrontok. Ha jól értelmezem, akkor ha kiküldöm a slave címet, (UCB0I2CSA = 0x40 és veszi az eszköz, akkor a "UCNACKIFG" 0-ba kéne álljon. De nem teszi. Olyan mintha ott se lenne az MCP23008. Megnéztem a PCF8574-nél, hogy működik, (lépésenként futtatam), és ott visszaált. Megpróbálom 400kHz-re állítani az I2C frekit, mert eddig csak 100kHz-n próbálkoztam, hátha, bár elvileg 100kHz-n is kéne működie.
Ja, próbáltam, hogy az UCB0TXIFG bitet figyelem, de ezzel sem léptem előrébb.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2012 /
 
Idézet:
„Valahol, valamit az elején nagyon elrontok.”
Valószínűleg a címzést... Az adatlapban 0x40 szerepel, de az balraigazítva értendő (a legalsó helyiértéken már az R/W vezérlőbit van). Ha az UCB0I2CSAregiszterbe jobbraigazítva kell beírni a címet, akkor az 0x20 lesz!
(#) szitko válasza icserny hozzászólására (») Feb 13, 2012 /
 
A kitartás gyümölcse a siker. Ezzel a balra-jobbra tologatással nem vagyok kibékülve, de ezt már végigjátszottam a PCF-nél is. Nem tudom, hogy itt miért nem figyeltem oda erre.
A lényeg, hogy félig már "működik". Azért csak félig, mert csak akkor kapcsol be a GP0-án a led, ha egyesével léptetem a futtatáskor. Ha valós időben futtatom, akkor nem kapcsol be a led.
Idáig így sikerült eljutnom:
  1. UCB0I2CSA = 0x20;   //slave cím
  2.       UCB0CTL1 &= ~UCSWRST;
  3.       UCB0CTL1 |= UCTR + UCTXSTT;
  4.       UCB0TXBUF = 0x00;              // IODIR
  5.       while (UCB0CTL1 & UCTXSTT);
  6.       UCB0TXBUF = 0x00;             // minden GP kimenet
  7.       while (!(IFG2 & UCNACKIFG));
  8.       UCB0CTL1 |= UCTXSTP;
  9.       delay_ms(50);
  10.       UCB0CTL1 |= UCTR + UCTXSTT;
  11.       UCB0TXBUF = 0x09;      // GPIO
  12.       while (UCB0CTL1 & UCTXSTT);
  13.       UCB0TXBUF = 0x01;      // GP0 magas
  14.       UCB0CTL1 |= UCTXSTP;

Első a slave cím, -> IODIR = 0 -> STOP I2C, következő, GPIO -> GP0 high. Mindez 100kHz-en.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2012 /
 
  1. UCB0TXBUF = 0x00;              // IODIR
  2. while (UCB0CTL1 & UCTXSTT);

Ha már írtál adatot az UCB0TXBUF-ba, akkor ne az UCTXSTT jelzőbitet figyeld. Erre a hibára már felhívtam a figyelmedet.
(#) szitko válasza icserny hozzászólására (») Feb 13, 2012 /
 
Valóban. Elnézést a figyelmetlenségemért. (nem akarok magyarázkodni, de a programban a sok kikommentezett parancsok közül, már azt sem tudom melyiket rakom be.)
  1. while (!(IFG2 & UCNACKIFG));

Így már megy. Köszönöm a kitartásod!
Már csak azt kell "kitaláljam", hogy tudom külön kapcsolgatni az egyes GP0-7 biteket.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2012 /
 
Örülök, hogy megy végre. Egészségedre!
Idézet:
„Már csak azt kell "kitaláljam", hogy tudom külön kapcsolgatni az egyes GP0-7 biteket.”

1. Tárolod egy változóban az utoljára kiküldött adatot.
2. Elvégzed rajta a a szükséges módosításokat.
3. Kiküldöd a módosított adatot.

A másik módszer az lenne, hogy beolvasod az I2C buszon a regiszter értékét, módosítod, majd visszaírod. Ez dupla I2C forgalommal jár, tehát lassabb (ellenjavalt).
(#) szitko válasza icserny hozzászólására (») Feb 13, 2012 /
 
A Pcf-nél mindíg újraírtam az összes bitet, de a tárolás jó lesz.Köszi. Mennyire kell pontossan beállítani az I2C frekit? Mivan ha a 400kHz, csak 333.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2012 /
 
Idézet:
„Mennyire kell pontosan beállítani az I2C frekit?”

Semennyire. Ez a 100 kHz, 400 kHz stb, csak a kategóriák felső határértékei.
Low speed mode 10 kbit/s
Standard mode 100 kbit/s
Fast mode 400 kbit/s
Fast mode plus 1 Mbit/s
Bővebben: Link
(#) szitko válasza icserny hozzászólására (») Feb 13, 2012 /
 
Köszi. Ezzel az oldallal kellet volna kezdenem az i2c tanulmányozását, de csak most láttam először.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2012 /
 
Van másik! Bővebben: Link
(#) szitko válasza icserny hozzászólására (») Feb 13, 2012 /
 
Köszi, egyenlőre elég lesz. Ha túl sok az infó, elfelejtem, hogy hol tartok. (meg, hogy fiú vagyok-e, vagy lány). -Tényleg, mi is?
(#) szitko hozzászólása Feb 14, 2012 /
 
Sziasztok.
Összeállítottam egy alfanumerikus Lcd vezérlő programot. Hála ICserny kitartásának, sikerült a vezérlőprogramot I2C-n, MCP23008 segítségével megírni. (A ChipCad-nál beszerezhető, kb 250Ft) A teljes anyagot megosztom veletek, hátha valakinek szüksége lesz rá. Megpróbáltam, "normálisan" kommentezni, hátha valaki át akarja írni. Az ékezetes betüket ICserny cikkéből másoltam.

Ha valaki hibát találna benne, szóljon, bár nálam tökéletesen működik.
(#) sunyeb hozzászólása Feb 14, 2012 /
 
Nah' megérkeztek a drágák (nem egészen 5 nap alatt, benne 1 hétvége). Lassan kezdődhet a kísérletezés.
Kérdésem lenne. icserny leírása szerint a kimenetek terhelhetősége 6mA. Ez azt jelenti, hogy 2 kimenet közé (egyik Hi, másik Lo) nem tehetek egy normál led-et mondjuk cca. 220ohm-mal? Milyenterhelési határértékek vannak az egyes kimenetekre, illetve több kimenet együttes használatára. Nem egészen világos...
(#) icserny válasza sunyeb hozzászólására (») Feb 14, 2012 /
 
Nagy mértékben függ a LED színétől (a nyitófeszültségtől) hogy mekkora maradék feszültséget kell ejteni az áramkorlátozó ellenállásnak. Ha megnézed a kártya kapcsolását, látható, hogy a vörös és a zöld LED különböző értékű ellenállásokkal vannak sorbakötve.
Idézet:
„Milyenterhelési határértékek vannak az egyes kimenetekre?”
Ez számomra nem derült ki egyértelműen az adatlapból.
(#) Grebi hozzászólása Feb 14, 2012 /
 
Helló mindenkinek!!

Kérdésem az lenne, hogy az MSP430-as fejlesztőkártyával(annó ez került 4,30$-ba), fel lehet programozni más típusú kontrollert is MSP430Fxxxx? Persze megfelelő átalakítóval csatlakoztatva a kártyára.
(#) icserny válasza Grebi hozzászólására (») Feb 14, 2012 /
 
Már többször volt róla szó ebben a topikban: csak a "kétvezetékes" (SBW = Spy-bi-wire) módon programozhatókat tudja kezelni. Ennél a típusnál például említik az SBW-t.
(#) icserny válasza szitko hozzászólására (») Feb 14, 2012 /
 
Köszönjük, szép munka!
(#) szitko válasza icserny hozzászólására (») Feb 14, 2012 /
 
Köszönöm.
Még lemaradtak a Fritzing-hez a fájlok. Az mcp23008.fzp-t Én csináltam, és mivel az első alkatrész amit csináltam, nemtudom, hogy mi kell az *.fzp-n kívül. Ha nem menne felrakom az összes svg fájlt hozzá.
(#) szitko válasza sunyeb hozzászólására (») Feb 14, 2012 /
 
A g2553-as adatlapjában, a 23. oldalon írja a 6 mA-t. Kiegészítésként, ha jól értem, az összes kimenet együttesen nem haladhatja meg a ą 48 mA-t. Bár ugyanezt írja a g2231-hez is, pedig annak kevesebb I/O lába van.
(#) David.zsombor hozzászólása Feb 14, 2012 /
 
Sziasztok Lenne egy problémám: Megépítettem ezt: Bővebben: Link és próbapanelon rendesen megy de összeforrasztva nem. be lehet állítani de nem lépteti az időt. A másik kérdésem az lenne hogy meg tudnátok mutatni hol van a perellmentesítés? Mert sokszor 2-t léptet. Köszi.
  1. // 2010 Kenneth Finnegan
  2. // Two color blink clock running on MSP430 controller
  3.  
  4. #include "msp430G2101.h"
  5.  
  6. #define BLINK_ON 3000
  7. #define BLINK_OFF 1500
  8. #define BLINK_SPACE 6000
  9.  
  10. volatile unsigned char time[4];
  11. volatile unsigned char mode;
  12.  
  13. // FUNCTIONS
  14. void displayNum (int c);
  15. void displayTime(void);
  16. void displayTwiddle(void);
  17. void pause (int c);
  18.  
  19. void main(void) {
  20. WDTCTL = WDTPW + WDTHOLD;// Stop Watchdog Timer
  21.  
  22. BCSCTL3 = (BCSCTL3 & ~(XCAP0 | XCAP1)) | XCAP_1; // 6pF xtal
  23. BCSCTL2 = 0xF8; // MCLK:LFXT1CLK/8 SMCLK:LFXT1CLK
  24.  
  25.  
  26. P1DIR = 0x41;
  27. P1OUT = 0x0F; // pull up resistors
  28. P1REN = 0x0E; // pull up resistors enable
  29. P1IE = 0x08; // Setup P1.3 for interrupt
  30. P1IES = 0x08; // High -> Low transistion
  31. P1IFG &= ~0x08; // Clear int flag
  32.  
  33. CCTL0 = CCIE;
  34. CCR0 = 0;
  35. TACCR0 = 0x7FFF; // Period of 32767 + 1
  36. TACTL = 0x0211; // Timer_A: SMCLK, UP MODE, TAIE
  37.  
  38. while(1) {
  39. mode = 0;
  40. _BIS_SR(LPM1_bits + GIE);
  41. switch (mode) {
  42. case 0x06: // display time
  43. displayTime();
  44. break;
  45. case 0x04: // display hours
  46.  
  47. if (time[3]) displayTwiddle();
  48. pause(BLINK_SPACE);
  49. displayNum(time[2]);
  50. break;
  51. case 0x02: // increment minutes
  52. displayNum(time[1]);
  53. break;
  54. }
  55. }
  56. }
  57.  
  58. #pragma vector=TIMERA0_VECTOR
  59. __interrupt void Timer_A (void) {
  60. //P1OUT ^= 1;
  61. time[0] = (time[0] + 1) % 60;
  62. if (time[0] == 0) { // new minute
  63. time[1] = (time[1] + 1) % 60;
  64. if (time[1] == 0) { // new hour
  65. time[2] = (time[2] + 1) % 12;
  66. time[2] = time[2]?time[2]:12;
  67. if (time[2] == 12) { // new AM/PM
  68. time[3] = !time[3];
  69. }
  70. }
  71. }
  72. }
  73.  
  74. #pragma vector=PORT1_VECTOR
  75. __interrupt void Port_1 (void) {
  76. mode = P1IN & 0x06;
  77. LPM1_EXIT; // Wake up the main loop
  78.  
  79. switch (mode) { // Needs debounce!
  80. case 0x04:
  81. time[2] = (time[2] + 1) % 12;
  82. time[2] = time[2]?time[2]:12;
  83. if (time[2] == 12) { // new AM/PM
  84. time[3] = !time[3];
  85. }
  86. break;
  87. case 0x02:
  88. time[1] = (time[1] + 1) % 60;
  89. time[0] = 0;
  90. break;
  91. }
  92.  
  93. P1IFG = 0; // Clear int flag
  94. }
  95.  
  96.  
  97. void displayTime(void) {
  98. if (time[3]) { // twiddle on PM
  99. displayTwiddle();
  100. }
  101.  
  102. pause(BLINK_SPACE);
  103. displayNum(time[2]);
  104.  
  105. pause(BLINK_SPACE);
  106. displayNum(time[1]);
  107. }
  108.  
  109. void displayNum (int c) {
  110. int i;
  111. for (i=c/10; i; i--) {
  112. P1OUT |= 0x40;
  113. pause(BLINK_ON);
  114. P1OUT &= ~0x40;
  115. pause(BLINK_OFF);
  116. }
  117. if ((c%10) > 4) {
  118. P1OUT |= 0x41;
  119. pause(BLINK_ON);
  120. P1OUT &= ~0x41;
  121. pause(BLINK_OFF);
  122. }
  123. for (i=c%5; i; i--) {
  124. P1OUT |= 0x1;
  125. pause(BLINK_ON);
  126. P1OUT &= ~0x1;
  127. pause(BLINK_OFF);
  128. }
  129. P1OUT &= ~(0x41);
  130. }
  131.  
  132. void displayTwiddle(void) {
  133. int i;
  134. for (i=0; i<2; i++) {
  135. P1OUT |= 0x40;
  136. P1OUT &= ~(0x01);
  137. pause(BLINK_ON);
  138. P1OUT |= 0x01;
  139. P1OUT &= ~(0x40);
  140. pause(BLINK_ON);
  141. }
  142. P1OUT &= ~(0x41);
  143. }
  144.  
  145. void pause (int c) {
  146. volatile unsigned int t = c;
  147. do { t--;} while (t);
  148. }
Következő: »»   36 / 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