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   21 / 139
(#) szitko hozzászólása Dec 3, 2011 /
 
Sziasztok.
Lenne pár kérdésem.
1: Definiálok egy lebegőpontos állandót, ami jelen esetben "#define d_ert 0.4" akar lenni, de az IAR nem 0.4-nek veszi, hanem valami másnak, miért? Rosszul adom meg? Ha 0.5-öt írok akkor már elfogadja.
2: Ez a kérdés is a fentiekhez kapcsolódik:
  1. g_ert = 96 * ag_s;

Ahol a g_ert sigend int, az ag_s float és az értéke 0.33. Az IAR szerint az eredmény 12. Szerintem meg 31.68. Az tudom hogy ebből a műveletből egy signed int érték lesz, de szerintem akkor is min. 32 vagy 31 kellene, hogy legyen. vagy rosszul tudom?
3: Hogy tudok tól-ig, állandó értéket definiálni?
4: Ha pl. csak karaktert definiálok (#define xy), akkor tudok neki értéket adni, egy külön programrészben?

Remélem nem kérdezek hülyeségeket.
(#) mzozo95 hozzászólása Dec 3, 2011 /
 
Sziasztok!

Én az itt található lcd-vezérlést szerettem volna elkészíteni: http://www.hobbielektronika.hu/cikkek/launchpad_ismerkedes_az_msp43...l?pg=6

2*146karatkteres bc1602A kijelzővel
Bővebben: Link
Bővebben: Link2

Az adatlapokból kiderül, hogy a karaktertáblája, lábkiosztása teljesen megegyezik a cikkben használttal.
DE sajnos nálam a <== 2x16 LCD ==>; Now in 4bit mode; helyett egy értelmetlen valami kerül kiírásra és (p, háromszögek ls a második sor végén vagy egy db 0, emellett a kurzor is villog)

/a bekötést 3* is ellenőriztem, a programot pedig letöltöttem a csikk "példacsomagok" közül./

Valaki tudna segíteni kijavítani a hibát?

Előre is hálás köszönet!

Zoltán
(#) mzozo95 hozzászólása Dec 3, 2011 /
 
az original cikkes program mellett ezt a hibaüzenetet kapom:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement C:\Users\.....\Desktop\lcd_2x16\main.c 95

Konkrétan ezeknél van a felkiáltójel:
ChangeBits(LCD_PORT,(val&0xF0),LCD_MASK);

Zoltán
(#) icserny válasza mzozo95 hozzászólására (») Dec 3, 2011 /
 
Lehet kontaktushiba (én többször jártam már így). Lehet, hogy az LCD modul alsó 4 adatvonalát (D0..D3, amelyek nincsenek bekötve) földelni kell.
(#) icserny válasza mzozo95 hozzászólására (») Dec 3, 2011 /
 
Lentebb már volt róla szó: arra figyelmeztet a fordító, hogy az illékony változókhoz való hozzányúlás sorrendje határozatlan. Hagyd figyelmen kívül!
(#) szitko hozzászólása Dec 4, 2011 /
 
Sziasztok.
Motorvezérléshez írtam egy progit, ami CW CCW (középérték: dec.512 1-2mS, előre: 512-1023, hátra 512-1) elven adta ki az impulzusokat. Technikai okok miatt, (H-híd) át kéne írjam (pulse/Dir) vezérlésre, azaz egy pin PWM, egy pin DIR, de sehogy nem akar összejönni. Tudna valaki segíteni ebben?
(#) szitko válasza szitko hozzászólására (») Dec 5, 2011 /
 
Válaszolva a kérdésemre:A CW CCW meghatározást, törlöm. Egy feltételben megnézem, hogy nulla-e a PWM érték, és ha igen, átváltom a DIR-t, és egy negatí előjelet rakok a PWM érték elé.
Szeretnék egy régebbi kérdésemre visszatérni, amire icserny adott választ. A két breakpoint között eltelt idő mérésével kapcsolatban. Sajnos a ciklusszámláló, a "Step Over" funkciónál nem mutat semmit.(Vagy Én csinálok valamit rosszul)
Hogy tudnám megállapítani, hogy mennyi idő alatt fut le a programom egyszer?
(#) icserny válasza szitko hozzászólására (») Dec 5, 2011 /
 
Az alábbi programot írtam be, s IAR-ar lefordítva, a szimulátorban léptetem a Step Over gomot nyomogatva. Mutatja szépen a ciklusszámot.
  1. #include "io430.h"
  2. int main( void ) {
  3.   WDTCTL = WDTPW + WDTHOLD;
  4.   while(1) {
  5.     __delay_cycles(100);
  6.     P1OUT = 1;
  7.    __delay_cycles(100);
  8.    P1OUT = 0;
  9.   }
  10. }
(#) szitko válasza icserny hozzászólására (») Dec 5, 2011 /
 
Köszönöm válaszod.
Bemásoltam a lenti programot, "View->Register->CPU Registers->CYCLECOUNTER = 0".
Nem számol, de hogy miért nem. Ezekszerint bennem van a hiba.Nagynehezen sikerült elindítani a CCSv4-ben a Debug funkciót, és abban sem találtam időmérőt, vagyis találtam csak nem lehet bekapcsolni. Hogy miért nem.
(#) szitko válasza szitko hozzászólására (») Dec 5, 2011 /
 
Megoldódott!
A "Step Over" funkciónál, a lépésjelző nyílnak, (Zöld nyilacska) a Disassembly-nél kell legyen. Így már számol. Mégiscsak bennem van a hiba.
Így már a definícióval kapcsolatos problémáim is, részben megoldóttak.
Köszönöm icserny mégegyszer.
(#) t0bi hozzászólása Dec 6, 2011 /
 
MSP430-al eddig lehetett Nokia LCD-t meghajtani, most sikerült USI I2C interfészen keresztül képet is letölteni. Sajnos még nem minden OK az I2C kapcsolatban, de működik. A képet 24 bites felbontásban 132x132 pixeles méretben PICKit2 klónnal égettem be a 24LC512 memóriába. Éppen belefért (132x132x3x8=418176 bit). Utána az MSP430G2231 2 bájtonkét kiolvassa és előállítja az LCD-nek a 12 bites felbontást (van egy kis különbség a 8 bites felbontáshoz képest). Ez a fajta LCD tud 16 bites felbontást is, még megpróbálom.
Nem volt könnyű az I2C USI program, mert nem találtam példát a Random read-re az MSP példaprogramjai között.

Kép1.jpg
    
(#) Beachway hozzászólása Dec 6, 2011 /
 
Szeretnék segítséget kérni. Olyan program ciklust szeretnék írni, ami két bemeneten lévő egy egy nyomógombot figyel.És mikor mind két gomb egyszerre van lenyomva, egy kimenet aktív lesz! Aztán próbáltam egyszerűsíteni úgy, hogy csak egy nyomógomb van, és mikor lenyomom, egy kimenet aktív lesz mind addig ,amíg nyomva tartom. Egy próbálkozásom a sok közül a WDT tiltása utáni sortól
P1DIR |= BIT0; //kimenet beállítása
P1DIR &= ~BIT1; //bemenet beállítása
while(1) {
while(P1IN & BIT1); //bemenet figyelése
P1OUT |= BIT0; //kimenet aktiválása
Minden segítséget előre is köszönök!!
(#) augre válasza Beachway hozzászólására (») Dec 6, 2011 /
 
Mit csinal ezzel a koddal?
tehat mit reagal ra az msp430, mit nem csinal jol?
(#) Beachway válasza augre hozzászólására (») Dec 6, 2011 /
 
ez az ,hogy nem csinál semmit. Az eddig tanultak szerint jónak kellene lenni.Ha a kimenetet negádba állítom, a kimenet aktív lesz, de nem reagál a nyomógombra.Próbáltam hexadecimálisban megadni a ki és bemeneteket, és if függvénnyel is próbálkoztam. így.
P1DIR = 0XFD;
while(P1 & 0XFD);
if (0XFD)
P1OUT |= 0X01;
else
P1OUT &= ~0X01;
(#) icserny válasza Beachway hozzászólására (») Dec 6, 2011 /
 
Pergésmentesítéssel együtt nálam így néz ki, és működik:
  1. #include "io430.h"
  2.  
  3. void main(void) {
  4.   WDTCTL = WDTPW + WDTHOLD;       //Letiltjuk a watchdog időzítőt
  5.   P1OUT = 0;                      //Minden kikapcsolva
  6.   P1DIR |= BIT0;                  //P1.0 legyen digitális kimenet
  7.   P1DIR &= ~BIT3;                 //P1.3 legyen digitális bemenet
  8.   while(1) {
  9.     while(P1IN & BIT3);           //lenyomásra vár
  10.     P1OUT |= BIT0;                //LED1 bekapcsolása    
  11.     __delay_cycles(20000);        //20 ms pergésmentesítő késleltetés
  12.     while(!(P1IN & BIT3));        //felengedésre vár
  13.     P1OUT &= ~BIT0;               //LED1 kikapcsolása  
  14.     __delay_cycles(20000);        //20 ms pergésmentesítő késleltetés
  15.   }
  16. }


Megjegyzés: a Launchpad kártyán a nyomógomb a P1.3 lábra van kötve, ezért én is azt használtam.
(#) t0bi válasza Beachway hozzászólására (») Dec 6, 2011 /
 
Az elején még le kell nullázni a P1.0 kimenetet, tehát kioltani a ledet
P1OUT &= ~BIT0;
Valamint a BIT1-et mindenhol javítsd ki BIT3-ra, mert ott van az S2 kapcsoló.

Most látom, icserny megelőzött, ezek szerint jól tudtam
(#) Beachway válasza icserny hozzászólására (») Dec 6, 2011 /
 
igen ez valóban működik.De én egy olyan verziót szeretnék ahol addig aktív a kimenet ,amíg nyomva van a gomb.Vagy ennek az inverze is jó.És ahoz nem kell pergésmentesítés. Az én verziómmal mi a baj??Van benne látható hiba??Arra is gondoltam, hogy elszámoltam a hexa értéket, ezért minden kimenetre tettem egy LED-et.Az a fő bajom, hogy a könyv amiből tanulom a C nyelvet nem mikrovezérlőkhöz van írva, ha nem számítógéphez.
(#) Beachway válasza t0bi hozzászólására (») Dec 6, 2011 /
 
Nem azt a nyomógombot használom.Mert két nyomógombal szerettem volna megvalósítani a logikát, és feltétellel.Ezért is vonatkoztattam el a kártyán lévő gombtól.A próbapanelen van kialakítva 2 nyomógomb.
(#) Szárnyas válasza Beachway hozzászólására (») Dec 6, 2011 /
 
Valami ilyesmire gondoltál?
  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. void main( void )
  5. {
  6.   WDTCTL = WDTPW + WDTHOLD;
  7.   P1DIR |= BIT0;
  8.   P1DIR &= ~BIT3;
  9.   P1OUT = 0x00;
  10.   while(1) {
  11.     while(P1IN & BIT3) {
  12.       P1OUT = 0x00;
  13.     }
  14.     P1OUT = 0x01;
  15.   }
  16. }


Ebben nincs pergésmentesítés.
(#) Beachway válasza icserny hozzászólására (») Dec 6, 2011 /
 
Igazad van!! úgy tűnt első ránézésre, hogy ez ugyan az a program ,amit a cikkedben is közzé tettél.A lenyomásra várás, és a felengedésre várás.De ahogyan jól megfigyelem, látom az eltérést.Azt hittem pergésmentesítés, csak olyan helyre kell, ahol számolom a nyomásokat.Az is fölöslegesnek tűnik elsőre.De végül is ha belegondolok, a későbbi programrészeknek még okozhat furcsa dolgokat a hiányuk!!Tehát látom, nem lehet ezt a logikát egy while ciklusra egyszerűsíteni.Külön a lenyomásról, és a felengedésről is gondoskodni kell.Nagyon szépen köszönöm a gyors segítséget mind kettőtöknek!!
(#) szitko hozzászólása Dec 7, 2011 /
 
Sziasztok.
Egy programban futó ciklus idejét megállapítom, és beírom egy változóba az alábbi prog. részlettel:
  1. while(1){
  2.          time = TA0R;                      // Ciklusidő beírása
  3.          TA0R = 0x00;
  4.          time = time * 4 / 1000000;   // time másodpercben
  5.          ......

Ahol a "time" float-nak, a TA0R folyamatos számlálásra és 1/4 es osztásra van beállítva. Az SMCLK 1MHz.
Hogy tudnám megállapítani, a ciklus frekvenciáját? Sajnos az IAR-ban lévő ciklusszámláló, nem jó, (pedig azt hittem jó lesz) mert a ciklusidő külső hatásokra változik, és ezt csak rendes futási időben lehet előidézni. Próbálkoztam avval, hogy egy portot a ciklus kezdetén átbillentek, de nekem igazából a "time" értéke a fontos, és ha beírok valamit pluszba, akkor fals eredményt kapok. Valami olyasmire gondoltam, hogy a TA0CCR1-re kivezetem a time-t, és lemérem frekimérővel. (ez lenne a legjobb, és legpontossabb) Itt az a bajom, hogy az érték tizedesre jön ki, és nem tudom, hogy alakítsam vissza egészszámra, hogy az a valós érték mutassa.
(#) icserny válasza szitko hozzászólására (») Dec 7, 2011 /
 
Ne oszd el 1000000-rel és akkor egész értéked van, mikroszekundumban. A float változót pedig felejtsd el, használj helyette előjel nélküli 32 bites egész változót.
(#) szitko válasza icserny hozzászólására (») Dec 7, 2011 /
 
Idézet:
„A float változót pedig felejtsd el”

Véglegesen? Miért? A mostani programomban 80%-ban csak float változók vannak.
A másik gondom az, hogy a "time" értéke másodpercben kéne, így is 1.xx -re jönnek ki az eredmények, és ha uS-ban számolnék, mégkisebb lenne.
(#) icserny válasza szitko hozzászólására (») Dec 7, 2011 /
 
Idézet:
„ha uS-ban számolnék, még kisebb lenne”
Miért, az 1.5 s az hány us?

A float változót itt, ebben az esetben felejtsd el! (valószínűleg a többi helyen is fölöslegesen használod, mert a mikrovezérlőd nem alkalmas lebegőpontos számokkal végzett műveletekre, de ebbe most nem mennék bele)
(#) szitko válasza icserny hozzászólására (») Dec 7, 2011 /
 
Á, bocsánat. Kicsit szét vagyok esve. (1500000)
Akkor ezekszerint mindent egész számra kéne alakítani.
Idézet:
„mert a mikrovezérlőd nem alkalmas lebegőpontos számokkal végzett műveletekre”

Ennek utána kell nétzzek.
(#) mzozo95 hozzászólása Dec 7, 2011 /
 
Sziasztok!

Lenne egy nagyon egyszerű kérdésem.
IAR ban (c nyelc) szeretnék átalakítani egy tört számot egésszé, így: eredeti: 10,2541, átalakított: 10
Tehát csak le szeretném "vágni" a tizedesjegy utáni számokat. (a pascalban volt erre egy spéci "trunc" művelet)

Valaki tudna segíteni?
Előre is köszönöm!

Zoltán
(#) szitko hozzászólása Dec 7, 2011 /
 
Sziasztok.
A Farnell-nél leárazás van.
(#) icserny válasza mzozo95 hozzászólására (») Dec 8, 2011 /
 
Az IAR EW telepítési könyvtárában a DOC mappát érdemes turkálni a leírásokért.

Ha jól értem a problémát, neked a math.h-ban deklarált rint() függvény hiányzott.
(#) Beachway hozzászólása Dec 8, 2011 /
 
Sziasztok! Megint lenne egy kérdésem.Adott két bemenet, aminek és feltételt szeretnék adni egy egy nyomó gombbal.Írtam rá egy programot, ami először működött is, de miután ki szerettem volna 3 nyomógombosra egészíteni, nem megy a 2 feltételes variáció sem.Ez így ebben a formában jó??
#include "io430.h"
#include "intrinsics.h"

void main(void) {
WDTCTL = WDTPW + WDTHOLD; //Letiltjuk a WDT.t
P1DIR |= BIT0; //P1.0 digitális kimenet
P1DIR &= ~BIT1; //P1.1 digitális bemenet
P1DIR &= ~BIT2; //P1.2 digitális bemenet
P1OUT = 0X00;
while(1) {
while((BIT1 && BIT2) && (P1IN)) {
P1OUT = 0X00; //LED kikapcsolása
}
P1OUT = 0X01; //LED bekapcsolása
}
}
Próbáltam így is, hogy: while((BIT1) && (BIT2) && (P1IN)) {
Már gondoltam arra is ,hogy talán valamit elkötés vagy ütközés miatt tönkre tettem a mikrovezérlőt.Viszont külön külön minden port egy nyomógombos verzióban működik!!
(#) icserny válasza Beachway hozzászólására (») Dec 8, 2011 /
 
Nem ezt akartad írni?
  1. while((BIT1 & P1IN) && (BIT2 & P1IN)) {...}


& bitenkénti ÉS művelet
&& változók közötti ÉS reláció
Következő: »»   21 / 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