Fórum témák
» Több friss téma |
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:
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.
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
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
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.
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!
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?
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?
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.
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.
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.
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.
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!!
Mit csinal ezzel a koddal?
tehat mit reagal ra az msp430, mit nem csinal jol?
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;
Pergésmentesítéssel együtt nálam így néz ki, és működik:
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.
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 ![]()
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.
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.
Igazad van!!
![]() ![]()
Sziasztok.
Egy programban futó ciklus idejét megállapítom, és beírom egy változóba az alábbi prog. részlettel:
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.
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.
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. Idézet: Miért, az 1.5 s az hány us? „ha uS-ban számolnék, még kisebb lenne” ![]() 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)
Á, bocsánat. Kicsit szét vagyok esve.
![]() 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.
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
Sziasztok.
A Farnell-nél leárazás van.
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.
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!!
Nem ezt akartad írni?
& bitenkénti ÉS művelet && változók közötti ÉS reláció |
Bejelentkezés
Hirdetés |