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   80 / 139
(#) Kovabe válasza VaZso8 hozzászólására (») Okt 6, 2012 /
 
Szia szitko teljesen tökéletesen fogalmazta meg mit is szeretnék csinálni. A minta program csak a launchpad-en futtatot probálkozás (összeollozás"ismét köszönet icserny-nek"). De ha már itt tartunk az impulzusjelre is lehet feszültségosztot tenni?
(#) szitko válasza Kovabe hozzászólására (») Okt 6, 2012 /
 
Idézet:
„Csak mint kezdö (tudom ez kutyát se érdekli)”

Dehogy is nem, és nem aggódj azon, hogy kezdő vagy, én az örök kezdők táborába tartozom.

Idézet:
„impulzusjelre is lehet feszültségosztót tenni?”

Igen. Nézz be 5 <-> 3.3V topikba.
(#) Kovabe válasza szitko hozzászólására (») Okt 6, 2012 /
 
Köszi a biztatást. Meg is van a topic és ezért is köszönet. Mostmár csak idö energia és gyakorlás az egész.
(#) putr4 válasza VaZso8 hozzászólására (») Okt 6, 2012 /
 
Szinkronnál órajelet is küldessz nem csak adatot.
A hozzászólás módosítva: Okt 6, 2012
(#) VaZso8 válasza putr4 hozzászólására (») Okt 6, 2012 /
 
Ez ok, de minek az órajelét szeretnéd átvinni?

Gondolom, nem az SPI órajelére gondolsz.

Az átvitt adatot egy másik kontroller fogja feldolgozni és az kommunikál a célhardverrel.
Más kérdés, mekkora késleltetés van a rádiós átvitel során és ezt mennyire szükséges kompenzálni, ill. az, hogy kapcsolgatni kell adás/vétel között vagy rögtön két modult használni hozzá.

Lehet, rosszra gondolok.
(#) putr4 válasza VaZso8 hozzászólására (») Okt 6, 2012 /
 
Ja, én azt hittem az rf kommunikációt akarod spivel lezavarni. Valamit elnézhettem akkor tegnap.
(#) Kovabe hozzászólása Okt 6, 2012 /
 
Sziasztok
Egy szakértö rá tudna pillantani erre a progira hogy mit csináltam?
  1. #include "io430.h"
  2.  
  3. void delay_100us(unsigned int delay_data) {
  4.  
  5.   while(delay_data--) __delay_cycles(80);
  6.  
  7. }
  8.  
  9. void main (void) {
  10.  TA0CTL_bit.TAIFG = 0;           // Töröljük a jelzőbitet
  11.  int e;
  12.  
  13.  int i;
  14.  
  15.  e=BIT3;
  16.  
  17.  WDTCTL = WDTPW|WDTHOLD;           // Letiltjuk a watchdog időzítőt
  18.  
  19.   DCOCTL = CALDCO_1MHZ;             // DCO beállítása a gyárilag kalibrált
  20.  
  21.   BCSCTL1 = CALBC1_1MHZ;            // 1 MHz-es frekvenciára  
  22.  
  23.   P1OUT = BIT0;                     // Alaphelyzet: LED1 be , LED2 ki
  24.  
  25.   P1DIR &= ~BIT3;
  26.  
  27.   P1REN |= BIT3;
  28.  
  29.   P1DIR = BIT0|BIT6;                // P1.0 (LED1) és P1.6 (LED2) kimenet
  30.  
  31.   TACCR0 = 2500;                   // periódus = 62500 ciklus  
  32.  
  33.   TACTL = MC_1|TASSEL_2|TACLR; // Beállítjuk és elindíjuk Timer_A-t
  34.  
  35. // számlálás, SMCLK a forrás, TAR törlés
  36.  e = TACCR1;
  37.  
  38.   while(BIT3) {
  39.    
  40.   P1OUT ^= BIT0|BIT6;  
  41.  
  42.       e=e*10;      // e értéke
  43.  
  44.     P1OUT ^= BIT6|BIT0;             // LED-ek állapotának átbillentése
  45.    
  46.     for (i=1; i<100; i++);{
  47.  
  48.  P1OUT |= BIT0;
  49.  
  50.  delay_100us(e);
  51.  
  52.  P1OUT=BIT0;
  53.  
  54.  delay_100us(100-i);
  55.    
  56.   P1OUT  = BIT3;
  57.   delay_100us(200);
  58.  TACCR1 = 0;
  59.     }
  60.    
  61.         }
  62.  
  63. }

A bit3 lenne a bejövö impuls amit meg kéne mérnem. Jot csináltam?
(#) szitko válasza Kovabe hozzászólására (») Okt 6, 2012 /
 
Az igazat megvallva én nemigazán értem.
1: a program elején létrehozol egy változót (e) amibe berakod a BIT3-at, majd a TACCR1 tartalmát, ami kb. 1 lesz. Minek?
2: a "while(BIT3){" ? ebben a formában ez egy elől tesztelő ciklus, ami azt jelenti, hogy csak akkor fut le a ciklusmag, ha igaz, vagyis ha a BIT3 = 1. ezzel viszont nem számolod a bejövő impulzusokat!
3: ha véletlenül mégis lefutna a ciklus, mert ha nem fut le, akkor vége a programnak!, akkor megszorzod azt a kb 1-et 10-el, ? és a ciklus végén lenullázod.
4: ha kiszáll a ciklusból leáll a program. Nincs végtelen ciklus, vagy valami ami működében tartaná a programot.
Szerintem, és ez csak egy javaslat, elsőnek csinálj egy folyamatábrát, hogy mit is akarsz csinálni, majd olvasd át még egyszer kétszer.... amit icserny fórumtársunk írt neked, helyettesítsd be a folyamatábrádba, közben nézd a FUG-ot, és utána kezd megírni a programot.

Ja és ne kapkodj!
(#) icserny válasza Kovabe hozzászólására (») Okt 6, 2012 /
 
Először is jó lenne tisztázni a kapcsolást, meleértve azt is, hogy melyik mikrovezérlőről van szó. A G2553-at nézegettem, annak a P1.2 lábán lehet Input Capture-t játszani (Timer0 CCR1 "A" bemenet). A Grace ilyen beállítást rittyentett hozzá:
  1. /*
  2.      * TA0CCTL1, Capture/Compare Control Register 1
  3.      * CM_3 -- Both Edges
  4.      * CCIS_0 -- CCIxA
  5.      * SCS -- Sychronous Capture
  6.      * ~SCCI -- Latched capture signal (read)
  7.      * CAP -- Capture mode
  8.      * OUTMOD_0 -- PWM output mode: 0 - OUT bit value
  9.      *
  10.      * Note: ~SCCI indicates that SCCI has value zero
  11.      */
  12.     TA0CCTL1 = CM_3 + CCIS_0 + SCS + CAP + OUTMOD_0 + CCIE;
  13.  
  14.     /*
  15.      * TA0CTL, Timer_A3 Control Register
  16.      * TASSEL_2 -- SMCLK
  17.      * ID_0 -- Divider - /1
  18.      * MC_0 -- Stop Mode
  19.      */
  20.     TA0CTL = TASSEL_2 + ID_0 + MC_0;


Ez lényegében az, amit már ajánlottam: Timer0 folyamatos módban, a CCR1 egység pedig hardveresen rögzíti az "időbélyegeket" minden fel- és lefutásnál. Írni kell hozzá eg megszakításkiszolgáló eljárást, ami kiolvassa a TACCR1 regisztert és kiszámolja az időkülönbséget, az előző élhez képest. (A cikkeimből a PWM példákat nézd meg, mert úgy emlékszem, hogy a CCR1 modul esetében törölni kell a megszakításjelzőt!).

A szoftveres számlálgatást felejtsd el, mert nagyon pontatlan lesz!
A hozzászólás módosítva: Okt 6, 2012
(#) icserny válasza icserny hozzászólására (») Okt 6, 2012 /
 
meleértve - hmmm, ez beleértve akart lenni!
(#) szitko hozzászólása Okt 7, 2012 /
 
Sziasztok.

Egy alapkérdés.
Beállítom a portok ki/bemeneteit. Port 2 pár bitje kimenet, a maradék bemenet. Beállítom a bemenet tulajdonságait (felhúzó-ellenállás, felfutó élre legyen érzékeny, flag törlés). Ezek utána még csinálok a programban pár dolgot, melyek nem használnak megszakítást, majd engedélyezem a "P2IE |= xy, ab, cd;" megszakításokat.
Erre a program egyből beugrik a megszakításba. Miért? Nem csak akkor szabadna bemennie a megszakításba, ha engedélyezem a globális megszakítást? Vagy a PxIE-vel ezt is megteszem? Akkor minek adjam ki a PxIE utána a pl. "__low_power_mode_0(); vagy _EINT();" megszakítás engedélyezést?
(#) icserny válasza szitko hozzászólására (») Okt 7, 2012 /
 
Idézet:
„Nem csak akkor szabadna bemennie a megszakításba, ha engedélyezem a globális megszakítást?”
De igen, s alaphelyzetben GIE =0, aza tiltja az összes maszkolható megszakítást.
Idézet:
„Vagy a PxIE-vel ezt is megteszem?”
Nem.
Előtte nem történik valami más, ami belepiszkál az SR regiszterbe?
(#) szitko válasza icserny hozzászólására (») Okt 7, 2012 /
 
Ba***s!
De történik egy analóg átalakítás, de a "__low_power_mode_off_on_exit();" móddal szállok ki belőle. Ez nem állítja vissza a GIE regisztert?
(#) icserny válasza szitko hozzászólására (») Okt 7, 2012 /
 
Idézet:
„a "__low_power_mode_off_on_exit();" móddal szállok ki belőle. Ez nem állítja vissza a GIE regisztert?”
Ez nem, de a programmegszakításból való visszatérés igen (RETFIE).
(#) VaZso8 hozzászólása Okt 7, 2012 / 1
 
Csatoltam a BMP085-ös légnyomásszenzor kiolvasásához használható kódokat és az I2C függvényeimet - ahogy ígértem.

Az angol kommentek miatt elnézést kérek, nem szeretem a keveréket...

Szerk.: A bmp085.c-ben hagytam egy fölösleges "bmp_085_calibrated" változót.
Ez arra kellett, hogy ha a szenzor induláskor nincs rajt, akkor is első alkalommal inicializáljam. A csatolt kódokban viszont sehol sincs használva.

A következőképpen kapható meg a kiolvasott eredmény:
  1. int temperature = 0;
  2. long pressure = 0;
  3.  
  4. bmp085_read_temperature_and_pressure(&temperature,&pressure);
(A header fájlokat természetesen be kell fűzni az #include sorokkal.)

Én több (jelenleg 8, mert azt egyszerű osztani) mérés átlagát veszem, így egész stabil.
Olyan 5-7 Pa (~0.05 mBar) ingadozással kapom az eredményeket egymásutánban olvasva.

Csináltam sorba rendezést is, majd négy legkisebb és legnagyobb elemet eltávolítottam, ezután ebből csináltam átlagot - ez kb. ugyanazt az eredményt hozta, így ezzel inkább nem terhelem a kontrollert.

Szépen látszik egyébként, hogy jön a rossz idő - 1-2 nappal ezelőtti értékhez képest kb. 10 mBar-ral mutat most kevesebbet.

Ha valakit érdekel a dolog, a szenzor Ebay-ről egész korrekt áron beszerezhető.
Itthon csak nagyon drágán láttam, ill. Ebayről rendelő Vaterásokat.
A hozzászólás módosítva: Okt 7, 2012
(#) Kovabe hozzászólása Okt 7, 2012 /
 
Köszönöm mindenki hozzájárulását a tanulásomhoz, remélem ennyiböl már sikerül valamit csinálni.
(#) Kovabe hozzászólása Okt 7, 2012 /
 
Szerintem valamit csináltam igy hirtelen. Ja az IC G2452-es. most azt probálgatom hogy a TACCR1 regisztert használva impulzust hozok létre a LED-ken
  1. while(1) {
  2.  
  3.      TA0CCTL1=0;
  4.    
  5.      TA0CTL=0;
  6.      
  7.   TA0CCTL1 = CM_3 + CCIS_0 + SCS + CAP + OUTMOD_0 + CCIE;
  8.    
  9.     TA0CTL = TASSEL_2 + ID_0 + MC_0;
  10.  
  11.  /*kezdeti futatás
  12.    */
  13.  
  14.    
  15.       for (i=1; i<100; i++) {
  16.      
  17.        P1OUT |= BIT6;        //LED1 bekapcsolása
  18.  
  19.        P1OUT &= ~BIT0;
  20.        
  21.        delay_100us(TACCR1-1);       //TA0CLT-vel arányos idejű késleltetés
  22.  
  23.        P1OUT |=BIT0;       //LED1 kikapcsolása
  24.  
  25.        P1OUT &= ~BIT6;
  26.        
  27.        delay_100us(150-TA0CCTL1);   //Kiegészítő idejű késleltetés
  28.  
  29.       }
(#) szitko válasza VaZso8 hozzászólására (») Okt 7, 2012 /
 
Köszike!
Legalább nem kell vele szenvedjek. (nekem is van itthon egy pár darab BMP085-ös)
(#) szitko válasza icserny hozzászólására (») Okt 7, 2012 /
 
Köszönöm.

Közben megtaláltam:
  1. ADC10_ISR:
  2.  00D4C4  C0B1 00F0 0000 bic.w #0xf0,0x0(SP)
(#) VaZso8 válasza szitko hozzászólására (») Okt 7, 2012 /
 
Nincs mit, használd egészséggel.

Esetleg azt megnézhetnéd, mennyi a differencia az egyes BMP085-ökből kiolvasott értékek között. Nekem csak egy van belőle - nem tudom, milyen lehet a szórás az egyes érzékelők között.

Persze elvileg kalibrálták mindegyiket, de azért kíváncsi lennék az esetleges eltérésekre.

Szerk.: A fentiből kimaradt az inicializálás, ezért a teljesség kedvéért leírom újra - korrektebben:
  1. int temperature = 0;
  2. long pressure = 0;
  3.  
  4. i2c_init(I2C_BMP08);
  5. bmp085_get_cal_data();
  6.  
  7. bmp085_read_temperature_and_pressure(&temperature,&pressure);

Az utolsó függvény mehet akár végtelen ciklusba a kiíratással együtt.
A hozzászólás módosítva: Okt 7, 2012
(#) icserny hozzászólása Okt 8, 2012 /
 
Az MSP43oh.com fórumán jelent meg a hír, hogy az mspgcc csomagot karbantartó Peter [nick neve: pabigot] elkészítette a BSP430 Board Support Package for MSP430 Microcontrollers nevű (fejlesztői kártyákat támogató) programcsomagot, amely az alábbi kártyákat támogatja:

MSP-EXP430G2 (LaunchPad kártya)
MSP-EXP430FR5739 (FRAM "Launchpad" kártya)
MSP-EXP430F5438
MSP-EXP430F5529 (USB Experimenter’s Board)
MSP-EXP430FG4618
EM430-900
PeoplePower Company SuRF Board
TrxEB SmartRF Transceiver Evaluation Board
EZ430-RF2500T

Ennek elsődleges célja, hogy az MSPWare és a Stellarisware periféria könyvtárakhoz hasonló szintű támogatást és hardver absztrakciót nyújtson a felsorolt kártyákhoz.

Az alábbi példa sorra kigyújtja a LED-eket a kártyán. Láthatóan nincs beledrótozva a kódba, hogy melyik portra vannak kötve a LED-ek, s az sem, hogy hány darab van belőlük.

main.c
  1. #include <bsp430/platform.h>
  2. #include <bsp430/utility/led.h>
  3. #include <bsp430/clock.h>
  4. void main () {
  5.   int led = 0;
  6.   vBSP430platformInitialize_ni();
  7.   while (1) {
  8.     BSP430_CORE_WATCHDOG_CLEAR();
  9.     vBSP430ledSet(led, 1);
  10.     BSP430_CORE_DELAY_CYCLES(BSP430_CLOCK_NOMINAL_MCLK_HZ / 2);
  11.     vBSP430ledSet(led, -1);
  12.     if (++led == nBSP430led) {
  13.       led = 0;
  14.     }
  15.   }
  16. }


bsp430_config.h
  1. /* Specify that we want the LED feature. */
  2. #define configBSP430_LED 1
  3. /* Get the rest of the default configuration */
  4. #include <bsp430/platform/bsp430_config.h>


Makefile
  1. PLATFORM ?= exp430fr5739
  2. MODULES=$(MODULES_PLATFORM)
  3. SRC=main.c
  4. include $(BSP430_ROOT)/examples/Makefile.common

(#) szitko hozzászólása Okt 8, 2012 /
 
Sziasztok.

Hol tudom megnézni az IAR-ban (5.40), hogy mennyi programmemória áll még a rendelkezésemre?
(#) icserny válasza szitko hozzászólására (») Okt 8, 2012 /
 
A Preject/Options menüben a Linker-nél a List fülön kérhetsz memóriatérképet (map). Abból lehet ezt-azt kiolvasni.

Vagy Debug módban a memória ablakban megnézed, hogy hol kezdődik a sok FF...
(#) DecebaL hozzászólása Okt 8, 2012 /
 
Sziasztok!

Tanulságként írom le nehogy valaki elkövesse ugyanezt ezt a hibát.
Szoftveres SPI kommunikációval kínlódtam, sehogy sem akart összejönni.
Több mint egy fél napom ment rá, mire rájöttem, hogy mit bakiztam. Adatvonalnak BIT3-at adtam meg és úgye a régi Launchpadon a BIT3 egy ellenállással fel van húzva V+ -ra. Ez meg bezavart az istennek sem akart működni. Logikai analizátorral néztem IC-t cseréltem sehogyan sem működött. Majd most este ugrott be, hogy a BIT3 van egy ellenállás. Másik bitre raktam az adatvonalat azóta jól működik.
(#) szitko válasza icserny hozzászólására (») Okt 8, 2012 /
 
Köszi.

A lap alján lévő adatok utalnának a felhasznált memóriára? (még a fele sincs kész a programnak. )
A hozzászólás módosítva: Okt 8, 2012

kazan_tmp.map
    
(#) icserny válasza szitko hozzászólására (») Okt 9, 2012 /
 
Idézet:
„A lap alján lévő adatok utalnának a felhasznált memóriára?”
Úgy gondolom, igen.
(#) icserny válasza DecebaL hozzászólására (») Okt 9, 2012 /
 
Idézet:
„Adatvonalnak BIT3-at adtam meg és úgye a régi Launchpadon a BIT3 egy ellenállással fel van húzva V+ -ra. Ez meg bezavart...”
Nem létezik, hogy az a 47 kOhmos felhúzás zavarjon, azt bármelyik totem-pole kimenet lehúzza, simán. Sokkal valószínűbb, hogy a nyomógombbal párhuzamosan kötött 100 nF-os kondenzátor zavart be. Ez viszont sebességfüggő, s 1 kHz-en bizonyára működött volna.

Egyébként egy e2e.ti.com fórumtémából az is kiderült, hogy az új Launchpad kártyáról azért hagyták le a P1.3-ról a felhúzást és a kondenzátort, mert azok az energiatakarékos módnál az áramfelvétel pontos meghatározását is akadályozzák.
(#) szitko hozzászólása Okt 9, 2012 /
 
Sziasztok.

Szintén IAR kérdés.
Idézet:
„Tue Oct 09, 2012 10:05:36: The stack pointer for stack 'Stack' (currently Memory:0x3AE) is outside the stack range (Memory:0x3B0 to Memory:0x400)”

Hol tudom megnézni, hogy hol a hiba?
A "view->stack1-2" ablakot kinyitva, kiírt egy csomó címet, de a fent említett címek nem szerepelnek benne.
(#) icserny válasza szitko hozzászólására (») Okt 9, 2012 /
 
Ez veremtár túlcsordulásnak néz ki. Alapértelmezetten az IAR 80 bájtot (decimális) szán a veremtárnak, ami esetedben 0x3B0-tól 0x400-ig terjed (MSP430G2553, gondolom). A fordító kikalkulálta, hogy ennyi függvénnyel és ennyi paraméter átadásával ez a veremtár méret kicsi lesz.

A Project/Options menüben a General Options szekcióban Kattints a Stack/Heap fülre, tegyél pipát az Override defaults felirat elé, s a 80 helyett írja nagyobb számot (pl. 90, vagy 100)! Természetesen amennyivel növeled a veremtárat, annyival kevesebb hely jut a változóknak...
(#) szitko válasza icserny hozzászólására (») Okt 9, 2012 /
 
Köszönöm.

Menet közben rájöttem én is, de azt viszont nem tudtam, hogy lehet növelni a verem méretét. Köszönet a leírásért.

Egyenlőre megpróbálom az össze-vissza ugrálásomat lecsökkenteni, mert már túlkomplikáltam egy egyszerű menürendszert, és van, hogy egy függvényből háromszor hívom meg ugyanazt a függvényt, úgy, hogy nem zárom be a következő meghívás előtt.
Következő: »»   80 / 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