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   13 / 139
(#) bedoweb hozzászólása Nov 2, 2011 /
 
Sziasztok!

icsernyi, gratulálok az új cikkhez, nagyon szép munka. Már neki is láttam a tanulmányozásának, főleg a pwm-el foglalkozó részét

Engem leginkább a 2 pwm jel vezérlése érint, mivel a végső célom egy robot, tehát egy h-hidat szeretnék vele kezelni.

A te programod tiszta sor. viszont hogy lehetne a kitöltési tényezőket egy végtelen cikluson belül állítgatni, és magát a pwm-et ki-be kapcsolgatni?

Előre is köszi szépen a segítséget
(#) icserny válasza bedoweb hozzászólására (») Nov 2, 2011 /
 
Idézet:
„hogy lehetne a kitöltési tényezőket egy végtelen cikluson belül állítgatni?”
Mármint a főprogramban? Deklaráld volatile-nak a kitöltést szabályozó változókat, s add meg az értéküket ott, ahol akarod. A megszakításban ekkor csak felhasználni kell.
Idézet:
„a pwm-et ki-be kapcsolgatni?”
A hardveres PWM kimenetet (TA0, TA1) a P1SEL megfelelő bitjének törlésével lehet kikapcsolni.
(#) bedoweb válasza icserny hozzászólására (») Nov 2, 2011 /
 
igen a főprogramban

Szóval ha jol értem:
  1. #include "io430.h"
  2.     #include "stdint.h"
  3.      
  4. volatile int kitöltés1;
  5. volatile int kitöltés2;
  6.  
  7.   int main(void) {
  8.      
  9.            
  10.              WDTCTL = WDTPW|WDTHOLD;    // Letiltjuk a watchdog időzítőt
  11.              Config_PWM(); // pwm beállítása
  12.              
  13.          
  14.             while(1){
  15.              
  16.            kitöltés1 == 240;
  17.            kitöltés2 == 15;
  18.            __delay_cycles(250000);
  19.  
  20.             kitöltés1 == 15;
  21.             kitöltés2 == 240;
  22.            __delay_cycles(250000);
  23.              
  24.             }
  25.              
  26.     }    
  27.              
  28.    
  29.  
  30.    
  31.    #pragma vector=TIMERA0_VECTOR
  32.     __interrupt void ccr0_isr(void) {
  33.              if(P1OUT_bit.P0) {
  34.                P1OUT &= ~BIT0;          // LED1 kikapcsolása
  35.                TACCR0 += 255-  kitöltés1;         // Ennyi ideig marad kikapcsolva
  36.              } else {
  37.                P1OUT |= BIT0;           // LED1 bekapcsolása
  38.                TACCR0 +=  kitöltés1;           // Ennyi ideig marad bekapcsolva
  39.              }
  40.     }
  41.    
  42.         #pragma vector=TIMERA1_VECTOR
  43.     __interrupt void ccr1_isr(void) {
  44.              if(P1IN_bit.P6) {
  45.                TACCR1 +=  kitöltés2;        // Beállítjuk a kitöltést
  46.                
  47.              }else {
  48.                TACCR1 += 255- kitöltés2;  // A kikapcsolt állapot ideje
  49.              }
  50.              TACCTL1 &= ~CCIFG;           // A megszakítási jelzőbit törlése
  51.     }


akkor valahogy így néz ki?
és köszi szépen
(#) icserny válasza bedoweb hozzászólására (») Nov 2, 2011 /
 
Igen, ilyesmire gondoltam. Annyit érdemes volna finomítani, hogy a megszakításban csak egyszer nyúlj a főprogramban matatott változóhoz (szükség esetén deklarálj további változókat), s a 255-kitöltést akkor számold ki és tárold el, amikor a kitöltés értékét átveszed.

A mostani programoddal előfordulhat, hogy a bekapcsolt állapothoz már az új kitöltéssel számolod a maradék időt.
(#) doni8 válasza icserny hozzászólására (») Nov 2, 2011 /
 
Igen, erre gondoltam! Szinte már mindenhol kerestem, de nem találtam.
Köszönöm!
(#) bedoweb válasza icserny hozzászólására (») Nov 2, 2011 /
 
valahogy így?
  1. #include "io430.h"
  2.         #include "stdint.h"
  3.          
  4.     volatile int kitöltés1;
  5.     volatile int kitöltés2;
  6.  
  7.     volatile int maradék1;
  8.     volatile int maradék2;
  9.      
  10.       int main(void) {
  11.          
  12.                
  13.                  WDTCTL = WDTPW|WDTHOLD;    // Letiltjuk a watchdog időzítőt
  14.                  Config_PWM(); // pwm beállítása
  15.                  
  16.              
  17.                 while(1){
  18.                  
  19.                kitöltés1 == 240;
  20.                kitöltés2 == 15;
  21.              
  22.                maradék1 == 255 - kitöltés1;
  23.                maradék2 == 255 - kitöltés2;
  24.                __delay_cycles(250000);
  25.      
  26.                 kitöltés1 == 15;
  27.                 kitöltés2 == 240;
  28.  
  29.                maradék1 == 255 - kitöltés1;
  30.                maradék2 == 255 - kitöltés2;
  31.                __delay_cycles(250000);
  32.                  
  33.                 }
  34.                  
  35.         }  
  36.                  
  37.        
  38.      
  39.        
  40.        #pragma vector=TIMERA0_VECTOR
  41.         __interrupt void ccr0_isr(void) {
  42.                  if(P1OUT_bit.P0) {
  43.                    P1OUT &= ~BIT0;          // LED1 kikapcsolása
  44.                    TACCR0 += maradék1;         // Ennyi ideig marad kikapcsolva
  45.                  } else {
  46.                    P1OUT |= BIT0;           // LED1 bekapcsolása
  47.                    TACCR0 +=  kitöltés1;           // Ennyi ideig marad bekapcsolva
  48.                  }
  49.         }
  50.        
  51.             #pragma vector=TIMERA1_VECTOR
  52.         __interrupt void ccr1_isr(void) {
  53.                  if(P1IN_bit.P6) {
  54.                    TACCR1 +=  kitöltés2;        // Beállítjuk a kitöltést
  55.                    
  56.                  }else {
  57.                    TACCR1 += maradék2;  // A kikapcsolt állapot ideje
  58.                  }
  59.                  TACCTL1 &= ~CCIFG;           // A megszakítási jelzőbit törlése
  60.         }


vagy a maradékot elég még a while előtt az int main -en belül kiszámolni?
(#) icserny válasza bedoweb hozzászólására (») Nov 2, 2011 /
 
Nem, ezzel egyáltalán nem oldod meg a szinkronizálatlanságból adódó problémát. Én úgy gondoltam, hogy pl. a
  1. TACCR0 +=  kitöltés1;
sor elé vagy mögé írd azt, hogy:
  1. maradék1 = 255 - kitöltés1;
(#) David.zsombor hozzászólása Nov 2, 2011 /
 
Ugye másféle kristályt is használhatok nem csak a 32khz eset?
(#) icserny válasza David.zsombor hozzászólására (») Nov 2, 2011 /
 
Az LFXT1 oszcillátor a Launchpad mikrovezérlői esetében hivatalosan csak kisfrekvenciás módban használható (10 - 50 kHz).
(#) bedoweb válasza icserny hozzászólására (») Nov 2, 2011 /
 
így?

  1. #pragma vector=TIMERA1_VECTOR
  2.         __interrupt void ccr1_isr(void) {
  3.                  if(P1IN_bit.P6) {
  4.                    TACCR1 +=  kitöltés1;        // Beállítjuk a kitöltést
  5.                     maradék1 = 255 - kitöltés1;
  6.                    
  7.                  }else {
  8.                    TACCR1 += maradék1;  // A kikapcsolt állapot ideje
  9.                  }
  10.                  TACCTL1 &= ~CCIFG;           // A megszakítási jelzőbit törlése
  11.         }
(#) icserny válasza bedoweb hozzászólására (») Nov 2, 2011 /
 
Igen. Ha jobban megnézed a cikk2 8_6. listáját, abban is benne van már.
(#) David.zsombor válasza icserny hozzászólására (») Nov 2, 2011 /
 
És akkor nem is lehet használni olyasmi kristályokat mint az AVR vagy PIC nél?
(#) bedoweb válasza icserny hozzászólására (») Nov 2, 2011 /
 
és tényleg köszönöm szépen a segítséget.

Egyébként a másik ami nagyon érdekel az a sima megszakítások. AVR-nél már volt vele dolgom, de amint nézem itt se túl bonyolult, viszont lenne egy olyan kérdésem, hogy port1-en és port 2-őn is csak 1-1 megszakítást tudunk kezelni?
(#) icserny válasza bedoweb hozzászólására (») Nov 2, 2011 /
 
Idézet:
„port1-en és port 2-őn is csak 1-1 megszakítást tudunk kezelni?”
Lehet többet is, csak akkor figyelni kel, hogy melyik jelzőbit billent be (megosztott használatú az interrupt vektor).
(#) bedoweb hozzászólása Nov 2, 2011 /
 
rendben köszi
(#) Spumifater hozzászólása Nov 2, 2011 /
 
A PCF8574 I/O-expander adatlapján találom a csatolt kpen látható adatokat.
a leírásban benne vannak a beállítható címek, az első a 20H (dec 32). Az MSB-vel jelölt bitnek mi a funkiója?
(#) icserny válasza Spumifater hozzászólására (») Nov 2, 2011 /
 
Idézet:
„Az MSB-vel jelölt bitnek mi a funkiója?”
Ugyanaz, mint a többi hatnak: megcímzi az eszközt. (MSB-vel az jelzik, hogy ez a legmagasabb helyiértékű bit)
(#) Spumifater válasza icserny hozzászólására (») Nov 2, 2011 1 /
 
Akkor meg nem igaz a beállítható címek listája!
Vagy valamit nem jól számoltam?
(#) Spumifater válasza Spumifater hozzászólására (») Nov 2, 2011 1 /
 
Hát persze!!!!!!!!
A felső 4 bit fix!!!!
Mivel az 0 nem is kell vele számolni!

/Fölöslegesen agyaltam!/

Azt tudtam hogy az MSB meg az LSB mit jelöl, csak nem vettem figyelembe, hogy azok nem állíthatóak!
(#) icserny hozzászólása Nov 3, 2011 / 1
 
Megjelent végre a "Launchpad: ismerkedés az MSP430 mikrovezérlőkkel II." c. írásom a cikkek között. Olvassátok!

A honlapomról pedig leszedtem.
(#) bedoweb válasza icserny hozzászólására (») Nov 3, 2011 /
 
Jár az 5 pont érte Sikerült beüzemelni a motor vezérlőt, köszi a segítséget
(#) neogeo2 válasza icserny hozzászólására (») Nov 3, 2011 /
 
Köszönjük az írást! Nagyon hasznos! Már csak idő kellene hozzá
(#) DecebaL válasza icserny hozzászólására (») Nov 4, 2011 /
 
Gratulálok nagyon jó!
Ha 100 évig élnék se tudnék ilyen jó cikket írni.
(#) bedoweb hozzászólása Nov 4, 2011 /
 
Sziasztok!

icserny segítségével megzaboláztam a pwm jeleket, már csak be kellett kötni a motor vezérlőt, kellet írni pár saját parancsot és már életre is kelt életem 2. de első teljesen saját fejlesztésű robotom (Bár az alváz csak teszt miatt lett ilyen rögtönzött, pár nap és megkapja végső alakját)
vodeó
(#) bedoweb válasza bedoweb hozzászólására (») Nov 5, 2011 /
 
videó: Bővebben: Link

az előbb valamiért nem akarta az igazat..
(#) icserny válasza bedoweb hozzászólására (») Nov 5, 2011 /
 
Sajnos, ez sem jelenik meg: "Ez a tartalom jelenleg nem elérhető".
(#) bedoweb válasza icserny hozzászólására (») Nov 5, 2011 /
 
felraktam máshova. talán így: Bővebben: Link
(#) icserny válasza bedoweb hozzászólására (») Nov 5, 2011 /
 
Köszönöm, így jó! Gratulálok, jó mozgású lett a próba alvázas robotod.
(#) icserny válasza DecebaL hozzászólására (») Nov 5, 2011 /
 
Idézet:
„Ha 100 évig élnék se tudnék ...”
ne viccelj, miért ne tudnál? Látod, nekem is csak 60 évet kellett várnom.
(#) t0bi válasza bedoweb hozzászólására (») Nov 5, 2011 /
 
Gratulálok, nagyon ügyes a robotod, várom a folytatást!
Sikerült bmp képet előállítani az LCD-re msp430g2452-vel. Átállítottam 256 színre (8 bit), ami azt jelenti, hogy 1 pixel = 1 bájt. A 130x130 képernyő 16,5 kB, ami nem fért bele a 2452-be (8 kB), ezért kisebb a kép, mint a képernyő. Van valakinek ötlete, hogyan tudnám a teljes képernyőt kitölteni?
Amikor a bitmap képet beírtam egy neten talált programból, a változóra ezt definiálta:
unsigned char bitmap[]=
és nem fért a 430 memóriájába a kép. Ha átírtam:
const char bitmap[]=
alakra, akkor befért. Ebben az esetben jobban kihasználja a memóriát? Esetleg lehet ennél jobban is?
Következő: »»   13 / 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