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   33 / 139
(#) icserny válasza szikorapéter hozzászólására (») Feb 5, 2012 /
 
Mellékelem az általam használt projektet (IAR EW, MSP430G2231). A program a P1.3-ra kötött nyomógomb minden megnyomására eljátssza a zenét. Én a P1.7 lábra akasztottam egy piezo hangkeltőt (egy régebbi számítógép alaplapból lett kioperálva).

music2.zip
    
(#) gyengus válasza gyengus hozzászólására (») Feb 5, 2012 /
 
Úgy látom a gombal lesz a gond: bekapcsolom felfutó élre a megszakítást. Bekapcsoláskor belefut egy megszakításba és végrehajtódik a megszakítás kezelő.
Ez mitől lehet? Összeszed valami zavart?
A program elején így állítom be a megszakítást:
  1. #define BTN BIT3
  2. P1IES &= ~BTN; // Felfutó élre
  3. P1IFG &= ~BTN; // Interrupt flag törlése
  4. P1IE |= BTN; // Megszakítás engedélyezése a gombon
  5. __enable_interrupt(); // Set global interrupt enable

Ezután nem nyúlok a P1.3-hoz.
(#) icserny válasza gyengus hozzászólására (») Feb 5, 2012 /
 
Tedd át lefutó élre! Alapszint magas, lenyomáskor alacsony, nem?
(#) gyengus válasza icserny hozzászólására (») Feb 5, 2012 /
 
Igen, alapszint magas, lenyomáskor alacsony.
Így a gomb felengedésekor következk be a megszakítás.

Közben arra tipelek, hogy a gombal párhuzamosan kötött 100nF kerámia kondenzátor miatt lehet a bekapcsoláskori megszakítás.
(#) gyengus válasza icserny hozzászólására (») Feb 5, 2012 /
 
Közben átraktam. Így már nem indul megszakítással.
Köszönöm a segítséget!
(#) icserny válasza gyengus hozzászólására (») Feb 5, 2012 /
 
A másik megoldás az lehetett volna, hogy az alábbi sor előtt
  1. P1IFG &= ~BIT3; // P1.3 interrupt flag törlése

beiktatsz egy elegendően hosszú késleltetést, amíg beállnak a jelszintek.

Hasonlóan, a belső felhúzások bekapcsolásakor is illik várni egy kicsit, amíg a felhúzott bemenetek beállnak. Máskülönben jön a meglepi...
(#) gyengus válasza icserny hozzászólására (») Feb 5, 2012 /
 
Értem.
Akkor jól gondoltam, hogy a kondenzátor miatt van?
(#) szitko hozzászólása Feb 5, 2012 /
 
A TimerA Capture modulját próbálgatom, de nem akar összeállni.
  1. #include "io430.h"
  2. #include "in430.h"
  3. unsigned int tar;
  4. int main( void ){  
  5.     WDTCTL = WDTPW + WDTHOLD;         // WDT stop
  6.     BCSCTL1 = CALBC1_1MHZ;       // kalibrált 1MHz
  7.     DCOCTL = CALDCO_1MHZ;  
  8.     P2DIR &= ~BIT1;                // capture CCI1A
  9.     P2SEL = BIT1;  
  10.     TA1CTL = TASSEL_2 + MC_2;        //  Timer=SMCLK folyamatos számlálás
  11.     TA1CCTL0 = CM_1 + CCIS_0 + SCS + CAP + CCIE;
  12. // capure mód minden, felfutó élre, szinkronizálás timer-al, megszakítás
  13.     __low_power_mode_0();
  14. }
  15. // megszakítás
  16. #pragma vector=TIMER1_A1_VECTOR
  17. __interrupt void Timer_A(void){
  18.     tar = TA1CCR1;  
  19. }

A lényeg: (G2553) P2.1-re adok "négyszögjelet" de a "tar" értéke mindig nulla marad.
A négyszögjelet egy ss411p bipoláris hall szenzorral állítom elő, úgy, hogy egy mágnest lóbálok elötte. (pontosabban 2 mágnest, egy É és egy D-i pólussal)
Valamit nem jól állítok be?
(#) icserny válasza gyengus hozzászólására (») Feb 5, 2012 /
 
Nem tudom biztosan, de bekapcsoláskor versenyfutás van, amiben a nyomógomb kondenzátora lemaradhat a viszonylag nagyértékű felhúzóellenállás miatt. Az RC időállandóból megbecsülhető, hogy mennyi a feléledési ideje. Ha a program ennél hamarabb élesíti a bemenetfigyelési megszakítást, akkor bukta van.
(#) icserny válasza szitko hozzászólására (») Feb 5, 2012 /
 
Ha TA1CCTL0-ben állítod be az elfogást (Capture), akkor tar = TA1CCR1; helyett nem tar = TA1CCR0; kellene a megszakítás kiszolgálásánál?
(#) gyengus válasza icserny hozzászólására (») Feb 5, 2012 /
 
Köszönöm!
Én is erre gondoltam.
(#) szitko válasza icserny hozzászólására (») Feb 5, 2012 /
 
De igen. Ez bizonyára a próbák miatt maradt úgy, a lényeg, hogy úgy se megy. A próbák alatt azt értem, hogy van egy "teszt" G2553-as m.vezérlőm, amiben a P1.3,4 már elhalálozott, és nem tudom, hogy még melyik láb nem megy. Kipróbáltam új vezérlővel is, de abban se ment.
(#) szitko válasza szitko hozzászólására (») Feb 5, 2012 /
 
Megvan! Egy kicsit összekevertem mindent. A megszakítási vektort, a TA0-TA1 stb...
(#) JOCO10 hozzászólása Feb 6, 2012 /
 
Sziasztok
Ti hogyan oldottátok meg a cél áramkörben lévő proci programozását. Én a LaunchPad-ról vezettem a reset, test, GND, 5v+ jeleket, de a programozó nem ismeri fel a procit.
Az átkötő vezeték hossza lehet proléma (50cm)?
(#) icserny válasza JOCO10 hozzászólására (») Feb 6, 2012 /
 
Idézet:
„Az átkötő vezeték hossza lehet proléma (50cm)?”
Igen.
(#) JOCO10 válasza icserny hozzászólására (») Feb 6, 2012 /
 
Köszönöm, 10cm vezetékkel müködik.
(#) DecebaL hozzászólása Feb 6, 2012 /
 
Most jutottam hozzá egy HD44780 -as kijelzőhöz
Icserny cikkéből át is vettem a az LCD kezelést 1 az 1 ben.
Köszönet érte, működik nagyon jól de csak IAR alatt.
CCS alatt hibával leáll.
Esetleg valakiinek van CCS -es változata?
(#) icserny válasza DecebaL hozzászólására (») Feb 6, 2012 /
 
Idézet:
„Esetleg valakiinek van CCS -es változata?”

Megpróbáltam átírni. A mellékelt program nálam lefordul, de kipróbálni most nem tudom.

main.c
    
(#) DecebaL válasza icserny hozzászólására (») Feb 6, 2012 /
 
Köszönöm szépen hibátlanul kezeli az LCD -t.
(#) szitko hozzászólása Feb 6, 2012 /
 
Sziasztok. Egy kis elméleti segítség kéne.
  1. #pragma vector=TIMER1_A1_VECTOR
  2. __interrupt void Timer_A(void){
  3.     switch (TA1IV){
  4.       case 2:
  5.         impulzus = TA1CCR1;  // TA1CCR1 értéke másolása
  6.         impulzus += tulcs * 65536;
  7.         adat = impulzus;
  8.         impulzus = 0;
  9.         tulcs = 0;
  10.       break;
  11.       case 10: tulcs++;
  12.       break;

A timer/capture modullal szeretnék sebességet mérni, csak egy kicsit belekeveredtem. Tehát a fenti részletben, a jelelfogásnál az "imp.." változóban összeadom a két elfogás között eltelt időt, és bemásolom "adat"-ba késöbbi feldolgozásra. A kérdésem, ez jó lehet így, vagy halott ötlet?
(#) szikorapéter válasza icserny hozzászólására (») Feb 6, 2012 /
 
Köszönöm a segítséget.Az első zenének hol találom meg a forráskódját ugyanebben a formában?Segítséged előre is köszönöm.
(#) icserny válasza szitko hozzászólására (») Feb 6, 2012 /
 
1. Az impulzus nevű változó ugye 32 bites?
2. Az elgondolás jónak látszik, de azon ritka eseteket is gondolni kell, amikor versenyfutás van a CCR1 megszakítás kiszolgálása és a Timer túlcsordulása között.

Nem ismerem annyira az MSP430-at, hogy fejben végig tudjak gondolni minden eshetőséget. Kellemetlen volna, ha TA1CCR1 pl. 65535-öt (vagy 65534-et) rögzítene, de már a Timer is túlcsordulna, mire a kiszolgálás lefut.

A másik izgalmas szituáció, ha a számláló épp túlcsordul, CCR1 már nulla közeli számot rögzít, de a Timer megszakítás még nincs kiszolgálva, nem inkrementál.

Ebben talán az MSP430 jobb helyzteben van, mint a PIC, mert CCR1 és a Timer túlcsordulás ugyanazt a megszakítási vektort használják. De nem tudom fejből, hogy melyiknek nagyobb a prioritása.
(#) icserny válasza szikorapéter hozzászólására (») Feb 6, 2012 /
 
Idézet:
„Az első zenének hol találom meg a forráskódját ugyanebben a formában?”

Nem értem a kérdést. Milyen első zenének?
(#) szikorapéter válasza icserny hozzászólására (») Feb 6, 2012 /
 
Csak azért írtam azt mert YouTube-on 2 féle van feltöltve , mint videó és csak azért kérdeztem , hogy hol érem el az elsőt.
(#) szitko válasza icserny hozzászólására (») Feb 6, 2012 /
 
Persze, hogy 32 bites. Én attól félek, hogy nem lesz ideje a vezérlőnek feldolgozni az adatokat. Gondolok itt a számításokra, hogy a végeredmény km/h-ban legyen, és az lcd-re való kiíratásra. Akkor mint csinál azzal a rengeteg infóval? Arról nem is beszélve, hogy nem csak ez az egy feladata van a G2553-nak, közben figyeli az akkufeszt, hőmérsékletet figyel, és mindezt megjeleníti lcd-n. Hozzátenném, hogy ez utóbbiak, már sikeresen működnek.
(#) icserny válasza szitko hozzászólására (») Feb 6, 2012 /
 
A számoláson lehet egyszerűsíteni, ha nem csinálsz fölösleges szorzásokat 65536-tal, hanem a 32 bites változód alső és felső felét 16 bitesen is hozzáférhetővé teszed. IAR-nál ez az union-nal megoldható, CCS-hez meg nem volt szerencsém (még csak szerencsétlenkedtem vele ). Az akkufeszt és a hőmérsékletet meg nem kell túl gyakran nézegetni.
(#) icserny válasza szikorapéter hozzászólására (») Feb 6, 2012 /
 
Idézet:
„YouTube-on 2 féle van feltöltve”
Mindkettő benne van a programban, de egyszerre csak egy lehet kommenten kívül. Vele szinkronban a main() függvényben is cserélni kell a kommentben lévő és kommenten kívüli sorokat.
(#) szitko válasza icserny hozzászólására (») Feb 6, 2012 /
 
Az union-ról még csak futólag olvastam. A programom, amibe a sebességmérés kerülne, már most is a proci 3/4-t elfoglalja. (szerintem biztos lehet rajta egyszerűsíteni, de majd 2 év mulva) A nem túl fontos dolgok (akkuf. hő) most is csak néha kerülnek vizsgálatra. Az ami a sok időt elveszi, az lcd. Az lcd-t i2c-n hajtom PCF8574N-el, és csak 100kHz-n tudom hajtani. Tudom, hogy van gyorsabb portbővítő, de ez volt itthon, és megpróbálok ehez igazítani mindent. Ezért vagyok bajban a sebességméréssel.
Egy nem teljes séma a programról az alábbi PDF-ben.

sema.pdf
    
(#) szikorapéter válasza icserny hozzászólására (») Feb 6, 2012 /
 
Mégegyszer kössz a segítséget,így már minden zene fut , ahogy annak kell.Mégegyszer kössz a segítséget!
(#) bedoweb válasza szitko hozzászólására (») Feb 7, 2012 /
 
Szitko, akkor most írok itt

Milyen szenzort használsz hőmérésre?
Következő: »»   33 / 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