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   117 / 139
(#) szitko válasza Erick hozzászólására (») Nov 25, 2013 /
 
A programot dobd már fel, úgy könnyebb lesz segíteni.
Működő g2231-es Capture modul, megszakítással, Icserny féle SW_UART-tal. csatolt file.
Idézet:
„Működés közben is lehet figyelni az egyes regiszterek változását?”

Az esetek 99%-ban IAR-t használok, de még ilyen opcióval nem találkoztam. Megállítod a prg. futást, és megnézed a regisztert.

main.c
    
(#) Erick válasza szitko hozzászólására (») Nov 25, 2013 /
 
Köszi a segítséget. Megpróbálom majd kicsit átírni amit küldtél, hátha.
(#) icserny hozzászólása Nov 25, 2013 /
 
16 MHz-en futó MSP430G2553-mal mi a tapasztalat? Nálam az ADC-vel mért értékek nagyon ugrálnak az 1 MHz-en futó korábbi programokhoz képest (10-17 LSB a korábbi 1-2 LSB helyett). Van valakinek jobb beállítása az ADC-hez? Vagy ennyire megnő a belső zaj, és nincs mit tenni?
(#) VaZso8 válasza icserny hozzászólására (») Nov 25, 2013 /
 
LSB? Mármint 1-2 abszolút értéknyi ugrálás helyett 10-17 abszolút értéknyi ugrálást látsz?
(Ez olyan 4 LSB talán.)

Nekem nem tűnt fel, hogy nagyon ugrálna az ADC értéke 16 MHz-en, bár most nem tudnám megmondani, mekkora volt a szórás - igaz, ott végül több mérés átlagát vettem.

Az sem kizárt, hogy zajosabb a tápod a kelleténél - ez most a Launchpad egyébként?

Egyébiránt valószínűsítem, hogy az órajeled növelésével a konverziód ideje lerövidült, ezért bizonytalanabb az 1 MHz-es állapothoz képest.
Esetleg próbáld megváltoztatni az ADC órajelforrását, ill. ehhez (ezekhez) tartozó osztó értékeit (ADC10DIVx; ADC10SSELx).

Ha jól gondolom, így vissza tudod nyerni az eddigi stabilitást.

Szerk.: Family User's Guide 555-ös oldalán ír ezekről a regiszterekről.
A hozzászólás módosítva: Nov 25, 2013
(#) icserny válasza VaZso8 hozzászólására (») Nov 25, 2013 /
 
Igen, Launchpad kártyáról van szó.
Az ADC saját órajelét használom (a kb. 5 MHz-es ADC10CLK órajelet), az (elvileg) független a CPU órajelétől, tehát (elvileg) nem rövidült a konverziós idő.
(#) szitko válasza icserny hozzászólására (») Nov 25, 2013 /
 
A kazánvezérlőmben 2db TC1047A van.
Az AD konverzió beállításom, ADC saját órajel, 16x Sample and Hold time, 2.5V ref., interrupt, és többszörös konverzió (64).
Egy mérés után, mind a 64 érték/mérés azonos volt. Többszöri mérések után is csak 2-3 abszolút értékkülönbség volt.
Ehhez hozzá kell tenni, a TC1047A közvetlen kimenetén egy 470ohm -os ellenállás van, ezt követően ~50cm vezeték, a g2553-as közvetlen bemenetén egy 1k/100nF RC tag van.
Ja, és a g2553-as 32PIN QFN tokozású! Lehet, hogy ebben a tokozásban pontosabb az ADC?
(#) pumi1980 válasza icserny hozzászólására (») Nov 25, 2013 /
 
Nekem is volt hasonló gondom, kb teljesen hasonló eredményekkel. A nagy eltérést talán az okozta, hogy 16 MHz-en sokkal zajosabb a CPU, mint 1 MHz-en. Viszont, ha az ADC alatt ki van kapcsolva a CPU akkor az ugrálás visszaállt 1-2 LSB-re, 16MHz órajel mellett is. 1MHz-en nem volt különbség, hogy a CPU ki vagy be van kapcsolva, ott 1-2 LSB volt az ugrálás.
(#) Erick válasza szitko hozzászólására (») Nov 25, 2013 /
 
Egyébként valami ilyesmit írtam én. P2.1-en lenne a négyszög, amit mérni szeretnék.


  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.   P1OUT = BIT0;                     // Alaphelyzet: LED1 be , LED2 ki
  11.   P1DIR = BIT0|BIT6;                // P1.0 (LED1) és P1.6 (LED2) kimenet
  12.     P2DIR &= ~BIT1;                // capture CCI1A
  13.     P2SEL = BIT1;  
  14.     TA1CTL = TASSEL_2 + MC_2;        //  Timer=SMCLK folyamatos számlálás
  15.     TA1CCTL0 = CM_1 + CCIS_0 + SCS + CAP + CCIE;
  16. // capure mód minden, felfutó élre, szinkronizálás timer-al, megszakítás
  17.     __low_power_mode_0();
  18. }
  19. // megszakítás
  20. #pragma vector=TIMER1_A1_VECTOR
  21. __interrupt void Timer_A(void){
  22.     tar = TA1CCR0;
  23.     P1OUT ^= BIT0|BIT6;
  24. }
A hozzászólás módosítva: Nov 26, 2013
(#) szitko válasza Erick hozzászólására (») Nov 25, 2013 /
 
Beállítod a "TACCTL0" -át, azaz a Timer A1 Capture/Compare 0. csatornáját, és a P2.1-en, azaz "CCI1A"-n várod a jelet. Ez így nem jó!
TA1CCR0 = CCI0A = TA1.0 = pl. P2.0 pin.
TA1CCR1 = CCI1A = TA1.1 = pl. P2.1 pin.
De azért nézd meg az adatlapot, mert lehet, hogy ismét rosszul emlékszem, tévedek!!!
(#) Erick válasza szitko hozzászólására (») Nov 25, 2013 /
 
És a többi rendben volna szerinted? Mert már mindenfélét próbáltam..... Egyébként a 2553-as adatlapjában mindennek benne kellene lennie, ami kell nekem? Van esetleg még más információt tartalmazó pdf erről a mikrovezérlőről?
(#) szitko válasza Erick hozzászólására (») Nov 25, 2013 /
 
Ha csak a piros és a zöld ledet akarod villogtatni, akkor szerintem a Timer beállítási hiba kivételével jó. A P2.1 beállítást elég egyszer megcsinálni. (használd a "Kód" gombot, ha kódot raksz be)
Idézet:
„Van esetleg még más információt tartalmazó pdf erről a mikrovezérlőről?”

F.U.G
(#) szitko hozzászólása Nov 25, 2013 /
 
Mi a sz@..ért írja ezt ki nekem az IAR? (Bocsánat, már az ideg beszél belőlem)
Idézet:
„Warning[Pe1053]: conversion from integer to smaller pointer D:\Msp430_and_all_Msp\Projektek\MSP430F5529\Flash_bank1\main.c 51”

A f5529-es mintapéldái alapján, a Bank1-be szeretnék írni word típusú értékeket.
  1. uint16_t *Flash_ptr = (uint16_t *)0x10000;
  2. uint16_t data;
  3. ...
  4. *Flash_ptr++ = data;

Kipróbáltam "char, int, long" típussal is, de mindig a fenti figyelmeztetést kapom. Lefuttattam a programot, és teleírta az SFR-t mindenféle zagyvasággal, illetve a "data" változó tartalmával. (Remélem nem nyírtam ke ezzel az MCU-t.)
(#) szitko válasza szitko hozzászólására (») Nov 26, 2013 /
 
Próbáltam a CCS v5.5-el az f5529 flash bank1-et írni a mintaprogram alapján, a 0x10000 címtől. Sikertelenül. A hiba dettó mint az IAR-al.
Böngésztem a netet, és arra jutottam, hogy vagy én vagyok ennyire tudatlan, vagy más még nem próbálta a flash2 írását, vagy mindenkinél minden rendben van. Na mindegy...
Tehát a lényeg. Ha valaki szeretné az f5529 flash memóriáját írni a 0x10000 címtől, akkor ne felejtse el, IAR esetén átkapcsolni a projekt "Options...->General Options->Data Model->Large" opciót. A CCS-nél is hasonló opciót kell keresni.
Így már lehet a flash bank1-be írni "char, uint" típusú változókat a WRT paranccsal, és long típust a BLWRT paranccsal.
Egyébként a flash és az info memória írás, olvasás, törlés, sokkal rugalmasabb mint a g2xxx sorozatnál.
(#) icserny válasza szitko hozzászólására (») Nov 26, 2013 /
 
Idézet:
„a 0x10000 címtől”
Ha nem hexában írod, már tegnap észrevehettük volna, hogy ez már a 64 K-s (16 bites címzés felső határán) túl van. De nem esett le a húszfilléres, s úgy láttam, hogy mindent a gyári mintaprogramhoz hasonlóan csinálsz.

Idézet:
„vagy más még nem próbálta a flash2 írását”
Én még nem próbáltam ilyet.
(#) szitko válasza icserny hozzászólására (») Nov 26, 2013 /
 
Idézet:
„Ha nem hexában írod,”

Igen, tudom, elég kusza a fogalmazásom, és sok esetben eléggé helytelen.
Idézet:
„s úgy láttam, hogy mindent a gyári mintaprogramhoz hasonlóan csinálsz.”

Miután az adatlapban, és a 55xx FUG-ban sem találtam megoldást a problémámra, kínomban letöltöttem a gyári mintaalkalmazásokat, remélve, hogy a csomagban lesz flash írással kapcsolatos program. Van, három is. Az info memory írással nem is volt gond, de a 64k-s bank/flash írás egy kicsit kiakasztott. Pláne az akasztott ki, amikor ma olvasva az IAR help-jét rájöttem, hogy egy kattintással megoldódott minden, és nem a programban van a hiba.

Egyébként hasznosak a gyári programok, mert az órajel beállítást az adatlapból és a FUG-ból oldottam meg, és a PMM modulban olyan hülyeségeket kapcsolgattam, hogy csoda, hogy egyáltalán megy/ment 25MHz-en a mikrovezérlő.
(#) icserny válasza szitko hozzászólására (») Nov 26, 2013 /
 
Nem volt semmi baj a fogalmazással. A nullákat kellett volna csak megszámolnom, mert "szóképes olvasással" 0x1000-nek olvastam.
(#) szitko válasza icserny hozzászólására (») Nov 26, 2013 /
 
Az a baj, hogy az IAR is majdnem így értelmezte (0x00-nak nézte), ezért írta tele az SFR-t, amiből újrafordítás után sem tűntek el a beírt adatok. Most keresem, hogy tudom eme hibámat helyreállítani, de itt is eléggé kusza az út.
(#) icserny válasza icserny hozzászólására (») Nov 26, 2013 /
 
A korábban jelzett ADC "ugrálásra" nem találtam jobb megoldást, mint a sok (16 - 32 - 64) mérést és átlagolást. Az itt bemutatott 4_adc_multi_ref1 programom 16 MHz-en futtatva is elfogadható eredményt ad, bár a gyakorlati alkalmazásokhoz nem a legszerencsésebb egy változó tömb bevezetése.

Most az Energia wiring_analog.c forrásállományába azt barmoltam bele, hogy az ADC egyetlen változóba összegzi az eredményeket (minden konverzió szoftveres újraindításával).

Nagyjából így néz ki a módosított függvény:

  1. uint16_t analogRead(uint8_t pin)
  2. {
  3.     uint8_t adc_samplecount;                    // counter for repeated measurements
  4.     uint16_t adc_samplesum;                     // Sum of the results of repeated conversions
  5.     ADC10CTL0 &= ~ADC10ENC;                 // disable ADC
  6.     ADC10CTL1 = ADC10SSEL_0 | ADC10DIV_5;   // ADC10OSC as ADC10CLK (~5MHz) / 5
  7.     ADC10CTL0 = analog_reference |          // set analog reference
  8.             ADC10ON | ADC10SHT_3 | ADC10IE; // turn ADC ON; sample + hold @ 64 × ADC10CLKs; Enable interrupts
  9.     ADC10CTL1 |= (pin << 12);               // select channel
  10.     ADC10AE0 = (1 << pin);                  // Disable input/output buffer on pin
  11.     __delay_cycles(128);                    // Delay to allow Ref to settle
  12.     ADC10CTL0 |= ADC10ENC;                  // enable ADC and start conversion
  13.         adc_samplecount = 64;                   // make 64 measurements
  14.         adc_samplesum = 0;
  15.         while (adc_samplecount--) {
  16.                 ADC10CTL0 |= ADC10SC;               // start conversion
  17.         while (ADC10CTL1 & ADC10BUSY) {     // sleep and wait for completion
  18.             __bis_SR_register(CPUOFF + GIE);// LPM0 with interrupts enabled
  19.                 }
  20.                 adc_samplesum +=ADC10MEM;
  21.     }
  22.     /* POWER: Turn ADC and reference voltage off to conserve power */
  23.     ADC10CTL0 &= ~(ADC10ON | REFON);
  24.         return (adc_samplesum >> 6);
  25. }
(#) szitko válasza icserny hozzászólására (») Nov 26, 2013 /
 
Ha nem osztod le ~1MHz-re az ADC órajelét, rosszak voltak az eredmények? Vagy más oka van az osztásnak?
(#) icserny válasza szitko hozzászólására (») Nov 26, 2013 /
 
A leosztást nem én raktam bele, az így volt (van) eredetileg is. Még nem volt időm megnézni, hogy annak van-e hatása. Mindenesetre az adatlap szerint ADC10SR = 0 esetén 0.45 - 6.3 MHz közötti órajel megfelel, tehát nem várható nagy különbség.
(#) tcsonka hozzászólása Nov 27, 2013 /
 
Sziasztok!

Lenne egy kérdésem. Az Energia fejlesztő platform a megírt program lefordítása után megadja a lefordított kód méretét. Az IAR fejlesztő platformban hol tudom megnézni a lefordított kód méretét?
(#) icserny válasza tcsonka hozzászólására (») Nov 27, 2013 /
 
Ha a Project/Options menüben a Linker kategória List lapján pipát teszel a Generate Linker Listing opcióhoz, akkor a generált .map állomány végén találod meg a keresett információt.
(#) tcsonka válasza icserny hozzászólására (») Nov 27, 2013 /
 
köszönöm
(#) szitko hozzászólása Nov 28, 2013 /
 
MS430f5529.

A 2x64k-s flash memória részt (Flash2), újraírás előtt törölni kell? Ha a gyári mintát követem és a
  1. ...
  2.   Flash_ptr=(uint8_t *) 0x10000;
  3.   FCTL1 = FWKEY+[b][u]MERAS[/u][/b];       // Set Bank Erase bit
  4.   *Flash_ptr = 0;                           // Dummy erase byte
  5. ...

kóddal törlöm a memóriát, akkor összeomlik a program. Az összeomlást az okozza, hogy a törlésnél megadott címen túl/előtt is töröl a törlési függvény, és nem tudom, hogy miért.
A törlést a 0x10000 címtől kezdené, de az alábbi két sort is törli ami valószínűleg a program része. Ennek még nem néztem utána.
  1. 0xffe0 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff 1c 44
  2. 0xfff0 : 7e 44 ff ff ff ff ff ff ff ff ff ff ff ff 00 44
  3. 0x10000 : 90 b0 90 10 10 50 78 50 10 d0 12 1c 72 90 92 1c
  4. ...

Próbáltam felülíratni az adatokat, amiket simán felülírt, de nem tudom, hogy ez jó-e így, vagy vacakoljak a törlési funkcióval?
(#) icserny válasza szitko hozzászólására (») Nov 28, 2013 /
 
Idézet:
„az alábbi két sort is törli ami valószínűleg a program része.”
Esetleg ott van a Reset és interupt vektorok táblázata.
(#) szitko válasza icserny hozzászólására (») Nov 28, 2013 /
 
Igen, már megtaláltam. A 0xfffe-ff a reset (4400), a 0xffe0-tól van az USCIB0 és az USCIA0 megszakítás vektor.
De az még mindig rejtély, hogy miért törli ezeket a címeket.
(#) kisedison hozzászólása Nov 29, 2013 /
 
Üdv Mindenkinek!
TCS230-as színérzékelővel volt már dolga valakinek? Sajnos csak arduinos mintát találtam, és energiában (lábkiosztás módosításával) nem hajlandó lefordulni se. Még másfél hónappal ezelőtt rendeltem csak úgy próba cseresznye módon, jó mókának tűnt, de frekvencia kimenete van, és az ilyen még magas nekem egyenlőre (frekimérés msp430-al). Ha sikerül használni a modult akkor valamire jó lesz a kis robot autón, ha nem akkor 1500Ft ellenében elvihető.
(#) kisedison hozzászólása Dec 1, 2013 /
 
Készítettem két UART bluetooth modult LMX9838-as IC-vel. Mindkét modul hibátlanul kommunikál a számítógéppel, UART-on és bluetoothon keresztül is. Viszont amikor a két modul van egymással kapcsolatban akkor zavaros az átvitt adat. Sebességek, és minden egyéb jónak tűnik. (a soros port a launchpadon keresztül van, de ez nem hiszem hogy fontos.) Valakinek van ötlete miért van ez?
(#) kisedison válasza kisedison hozzászólására (») Dec 1, 2013 /
 
Szín érzékelős probléma megoldva jó pár óra fejfájás után (rémes hogy milyen egyszerű). Működik szépen, csak nekem egyenlőre semmi haszna. Maradt a bluetooth-os nyavaja, amivel viszont semmire nem jutottam.
(#) icserny hozzászólása Dec 3, 2013 /
 
Az Energia tone(pin, frequency, duration) függvénye nem a harmadik (opcionális) paraméterrel megadott ideig muzsikál, hanem csak annak feléig. Ebben viselkedése eltér az Arduino-tól, tehát inkompatibilitás. Akit ez zavar, hozzám hasonlóan kijavíthatja a Tone.cpp forrásállományban (energia-01010E0010/hardware/msp430/cores/msp430 mappában).

A hibás sor:
  1. tone_periods[n] = (duration * (F_TIMER/2)) / (1000L * tone_interval[n]);


Helyes így néz ki:
  1. tone_periods[n] = (duration * F_TIMER) / (1000L * tone_interval[n]);
Következő: »»   117 / 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