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   81 / 139
(#) s3toraph válasza röntgen hozzászólására (») Okt 11, 2012 /
 
Szia! Értem köszi!
(#) putr4 hozzászólása Okt 11, 2012 /
 
Sziasztok!

Tudnátok segíteni abban, hogy itt mi is történik valójában?

  1. void lcd_puts(char* p_str) {
  2.          char c;
  3.          while ((c=*p_str)) {
  4.              lcd_write(c,1);
  5.              p_str++;
  6.          }
  7. }


Addig értem, hogy létrehozunk egy char típusú mutatót, ami valahogy kapcsolatban van az lcd_puts(""); zárójelen belüli résszel (esetleg arra a memória címre mutat, nem tudom). Valamint létrehozunk egy ugyanilyen típusú változót. Ezt a sort viszont nem igazán tudom értelmezni: while ((c=*p_str)). Gondolom az egésznek valami olyat kéne csinálnia, hogy végigléptet egyenként az lcd puts zárójelei közé írt karakterláncon és kiírja.
Viszont az sem világos, hogy egy kiírt karakter után, hogy lép a következő kiírási címre.

(#) icserny válasza putr4 hozzászólására (») Okt 11, 2012 /
 
Idézet:
„Addig értem, hogy létrehozunk egy char típusú mutatót”
Nem létrehozunk, hanem kapunk egy mutatót.
Idézet:
„while ((c=*p_str))”
a c változóba átmásojuk a soron következő karaktert, s mellékesen megvizsgáljuk az értékét, hogy nullától különböző-e. Mindaddig, amíg nulla nem jött, kiírjuk, léptetjük a mutatót és a ciklusban maradunk. Ha nulla jött, akkor kilépünk a ciklusból.

Ja, tömörebben is írhatjuk:
  1. while ((c=*p_str++)) lcd_write(c,1);
(#) putr4 válasza icserny hozzászólására (») Okt 11, 2012 /
 
char* p_str

Ez akkor nem azt jelentené, hogy deklarálunk egy char típusú pointert? A p_str valami header fájlban van benne? Honnan veszi a fordító, hogy ez egy karakterfüzérmutató mely 0-val zárul? Hogy kapcsolódik ez hozzá az lcd_put-ba írt karakterlánchoz? Én úgy tudtam a pointerek memória címre mutatnak, ahol jobb esetben van valami és így hivítkozni tudunk arra.
(#) idlob válasza icserny hozzászólására (») Okt 11, 2012 /
 
Azon gondolkodtam, hogy vajon mi a jobb? A fenti megoldás, vagy esetleg ez:
  1. while (*p_str++) lcd_write(*p_str,1)

Előbbinél másolgatni kell, utóbbinál kétszer van indirekció.
(#) VaZso8 válasza putr4 hozzászólására (») Okt 11, 2012 / 1
 
Csak annyit tennék hozzá icserny hozzászólásához, hogy a karaktersorozatot \0-val szokták lezárni C-ben és ez az, amit a while ciklus figyel.

Emellett még érdemes azt is tudni, hogy minden igaz, ami nem hamis... és a \0 "hamis".

Tehát amíg a p_str mutató címen lévő *p_str karakter \0-tól különböző érték (pl. szöveg), addig a ciklus nem lép ki.
A szöveg végét jelölő \0-nál viszont igen.
(#) VaZso8 válasza putr4 hozzászólására (») Okt 11, 2012 /
 
Idézet:
„A p_str valami header fájlban van benne?”


Nem, azt paraméterként adod át a függvényednek, amiben p_str-ként fogsz hivatkozni rá.
Átírhatod másra is, csak a függvényen belüli összes előfordulását cserélni kell.

Idézet:
„Honnan veszi a fordító, hogy ez egy karakterfüzérmutató mely 0-val zárul?”


A while ciklusban figyeled.

Idézet:
„Hogy kapcsolódik ez hozzá az lcd_put-ba írt karakterlánchoz?”


Szerintem az lcd_put nem karakterláncot fogad, hanem szimpla karaktert.
A ciklussal küldöd ki a karakterláncot egyesével.
(#) VaZso8 hozzászólása Okt 11, 2012 /
 
Tudom, hogy régebben volt szó ilyesmiről, de nem találom.

Ha jól rémlik, írtátok, hogy az ADC-hez vannak kompenzációs adatok és a belső hőmérsékletet is kompenzálni kellene, de ahhoz nincs gyári adat a kontrollerben.

ADC-hez nem találtam, miként lehetne kompenzálni - habár az a néhány próba, amit tettem, multiméterrel összehasonlítva egész pontosnak tűnő eredményeket hozott - igaz, ezt a tápfeszhez viszonyítottam, amit viszont megmértem a számoláshoz.
A 1.5/2.5V-os referenciát használva nyilván nagyobb lesz a pontatlanságom is.
Rosszul emlékszem, hogy kompenzálni kellene?
Hol találok erről infot?

A hőmérséklet adat viszont 3-4 fokkal is fölé lő a valós értéknek.
Ennek a kompenzációját miként valósítanátok meg?
Mármint értem, hogy így a tél közeledtével csinálok egy "referencia hőmérő" mellett tesztet +2X és -1x fok között, majd ebből meredekséget számolok, de ez nyáron kissé nehezebb feladatnak tűnik.
Van erre jól bevált módszer?

Mennyire lineáris amúgy a kiolvasott érték?
Gondolom, nem szimpla offset probléma lesz ez.

Szerk.: Amúgy az egyik g2553-mal fals értékeket kapok hőmérsékletnek, ezért nem foglalkoztam ezzel eddig. Egyébként más gondot nem vettem észre ezzel a kontrollerrel, az ADC is működik jól.
Ugyanez a kód másik g2553-ba beégetve mér hőmérsékletet is.
A hozzászólás módosítva: Okt 11, 2012
(#) DecebaL hozzászólása Okt 12, 2012 /
 
Az alábbi kóddal van egy kis gondom. Szoftveres SPI-n fogadok 32 bitet, ahogy kell, amint 1 jelenik meg a bemeneten balra léptetem. Eddig is ezt a kódot használtam csak eddig mindig 8 bitre volt szükségem és mindig csak azt a 8 bitet olvastam be amelyik kellett. Most viszont szükségem lenne mind a 32 bitre és a balra léptetésnél nem csinálja jól. Ha 4 szakaszban 8 bitenként olvasom be akkor jól működik. Próbáltam, úgy is hogy 8 bitenként beolvastam és mikor balra léptetéssel 16 vagy 32 bitesre akartam összerakni már nem lett jó az eredmény.
Van valakinek valami ötlete, hogy mit cseszek el?

  1. int32_t SPIADAT;
  2. char i;
  3. P1OUT &= ~CS;
  4. _delay_cycles(10);
  5.  
  6. for(i=0; i<32; i++)
  7.    {
  8.      P1OUT |= SCLK;
  9.    _delay_cycles(5);
  10.  
  11.     P1OUT &= ~SCLK;
  12.  
  13.      if(SDATA & P1IN)
  14.       {  SPIADAT= SPIADAT | (0x01<<(31 - i));}
  15.    
  16.   _delay_cycles(5);
  17.     }
  18. P1OUT |= CS;
A hozzászólás módosítva: Okt 12, 2012
(#) icserny válasza DecebaL hozzászólására (») Okt 12, 2012 /
 
1. Az SPIADAT-ot jó volna az elején nullázni!

2. Nekem ez az "SPIADAT= SPIADAT | (0x01<<(31 - i));" sor is gyanús. Meg kellene nézni, hogy mire fordul, mert egyáltalán nem biztos, hogy 32 bites kifejezésként lesz kiértékelve. Lehet, hogy egyszerűen nullára "forogja ki magát"...

3. Nem volna egyszerűbb a ciklusban ezt írni:
  1. SPIADAT = SPIADAT<<1;
  2. if(SDATA & P1IN) SPIADAT++;


A beérkező adatot egyébként tényleg előjelesen kell értelmezni? Ha nem , akkor inkább uint32_t legyen.
(#) icserny válasza putr4 hozzászólására (») Okt 12, 2012 / 1
 
Idézet:
„Ez akkor nem azt jelentené, hogy deklarálunk egy char típusú pointert?”
Nem hozunk létre változót, nem foglalunk a számára helyet a memóriában, hanem azt deklaráljuk, hogy a függvény meghívásakor kapott paramétert hogyan kell értelmeznie a fordítónak.

Például az lcd_puts("Hello world!\n"); hatására meghívásra kerül a függvény, és paraméterként egy olyan mutatót (azaz memóriabeli címet) kap meg, ami a Flash memóriában letárolt 'H','e','l','l','o',' ','w','o','r','l','d','!','\n','\0' karaktersorozat első elemére mutat. Erre a címre hivatkozunk p_str néven. Amikor pedig *p_str-re hivatkozunk, akkor ez az adott címen levő adatot (a soron következő karakterkódot) jelenti.

A p_str++ megnöveli eggyel a címet. Azért eggyel, mert deklaráltuk, hogy p_str karakterre mutat, tehát egy bájt az elemek mérete.

Jó kérdés, hogy: A p_str hol tárolódik, ha a függvénydeklaráció nem foglal neki helyet? Nos, helyfoglalás a függvény meghívásakor történik, s vagy a veremtárba vagy valamelyik CPU regiszterbe kerül (ez már a fordító dolga, hogy milyen paraméter-átadási konvenciót használ).
(#) icserny hozzászólása Okt 12, 2012 /
 
A www.43oh.com portálon adtak hírt eóla, hogy a TI BoosterPack Development Guide hivatkozik egy, egyelőre csak tervezet formájában létező F5529 LaunchPad kártyára is. Az MSP430F5529 mikrovezérlő USB képes, 80 lábú (melyből 40 láb lesz kivezetve), max. 25 MHz frekvenciájú, s 128 kB Flash és 8 kB RAM jellemzi.

Reméljük, hogy mihamarabb kiadják, s nem jár úgy, mint a MSP430 Wolverine Dev Kit, amelyet tavasszal (jav: február végén) mutogattak egy kiállításon, majd eltűnt, mint szürke szamár a ködben.
A hozzászólás módosítva: Okt 12, 2012
(#) szitko hozzászólása Okt 12, 2012 /
 
Sziasztok.

Tudom nem szabad/illik, feltenni két helyre ugyanazt a kérdést, de mégiscsak inkább ide tartozik.

Az rs5c372a RTC-vel van egy kis bajom. Az i2c kommunikáció szépen megy vele, de valamiért az óra nem lép át 0-órára, tehát megáll 23:59:59-nél, de úgy, hogy az 1Hz-es "megszakítás" is kikapcsol. A "control register 1"-be, hosszas próbálkozások után, már csak az 1Hz-et állítom be, azaz 0xe0 = 0x03-at írok bele. Viszont a "control register 2"-őt valami oknál fogva nem tudom írni, vagy normálisan kiolvasni. Minden egyes kiolvasásra más-más értéket kapok, és szerintem ez okozza a galibát. A kiolvasás összes formáját végigpróbáltam, amit az adatlapban találtam.
A control registereket így írom (adatlap szerint):
  1. UCB0CTL1 |= UCTR + UCTXSTT;            // adat küldés, i2c tx, plusz start
  2.      while (UCB0CTL1 & UCTXSTT);
  3.      while (!(IFG2 & UCNACKIFG));
  4.      UCB0TXBUF = 0xe0;                      // control regiszter 1 címe
  5.      while (!(IFG2 & UCNACKIFG));
  6.      UCB0TXBUF = 0x20;                      // cr_1 adat
  7.      while (!(IFG2 & UCNACKIFG));
  8.      UCB0TXBUF = 0x00;                      // 0xf0 = cr_2 adat
  9.      while (!(IFG2 & UCNACKIFG));
  10.      UCB0CTL1 |= UCTXSTP;                   // I2C stop
  11.      while (UCB0CTL1 & UCTXSTP);            // Stop kész?

A fentiek szerint, a 0xf0 (control reg 2)-ba,0x00-át írok, tehát pl. 12-órás üzemmódban kellene lennie... De nem 12-órás üzemmódban van, hanem 24h-ban, ami 0x20-nak felelne meg.
A riasztást is néztem már (Alarm_A-B), de itt már elméletileg azokhoz a bitekhez nem is nyúlok.
Valamit elnéztem? Vagy rossz az RTC?
A hozzászólás módosítva: Okt 12, 2012
(#) DecebaL válasza icserny hozzászólására (») Okt 12, 2012 /
 
Köszönöm így már jó lett!
  1. SPIADAT= SPIADAT | (0x01<<(31 - i)); sor volt a ludas. Csak azt nem értem, hogy 8 bitesként mért működött jól?>>
A hozzászólás módosítva: Okt 12, 2012
(#) icserny válasza DecebaL hozzászólására (») Okt 12, 2012 /
 
Idézet:
„Csak azt nem értem, hogy 8 bitesként mért működött jól?”
Azért, mert a 8 bites bitmaszkot nem csonkította a számábrázolással. A 32 bites bitmaszknál viszont (ha a kifejezés részeredményeit 16 bitesen számolja ki) csonkulhat (s nulla lesz) a kiszámolt szám. Akkor hiába adod (pontosabban vagyolod) össze az SPIADAT-tal.
(#) DecebaL válasza icserny hozzászólására (») Okt 12, 2012 /
 
Köszönöm, így már értem.
(#) putr4 válasza icserny hozzászólására (») Okt 13, 2012 /
 
Így már az a sanda gyanúm, hogy értem bár ez nem egy határozott értem akar lenni.

VaZso8: a while ciklussal nem volt gondom inkább a mutatókkal, mert még sosem használtam őket semmire.

A segítséget köszönöm.
(#) szitko hozzászólása Okt 13, 2012 / 1
 
Sziasztok.

Végre összeállt a menürendszer, és az RS5C372A vezérlése, a leendő kazánvezérlőben.

Sajnos arra még nem jöttem rá, hogy az RS5C372A, control resrister 2-es bitjeit hogyan tudnám normálisan beolvasni, de az óra már nem áll le éjfélnél. (De hogy mitől javult meg, azt nem tudom. Semmit nem változtattam a programon, csak egy késleltetés tettem be oda, ahova nem is kéne.)

Még pár dolgot be kell állítani, adatküldés/fogadás bluetooth-on, EEPROM adatmentés, stb..., utána jön a dobozolás, és mehet a helyére.

Egy pár kép, és egy nem túl jó videó, az eddigiekről. (menürendszer)
(#) s3toraph hozzászólása Okt 15, 2012 /
 
Sziasztok!

Itthon, Magyarországon honnan tudnék gyorsan ilyen kábelt szerezni? Valmint kellene az apa-apa változatábol is. Tudom, már kérdeztem ezt, de nem találtam sehol sem szerelten, a hestore-ban is csak az alkotóelemeit árulják, nekem meg nincs mivel összekrimpelni (csak ezért nem veszek meg egy drága fogót). E-bay meg nem éppen gyors megoldás (időszűkében vagyok). Hestore-ban ha felhívom őket és megbeszélem, szerintetek összeszerelik nekem?
Vagy más javaslat?
(#) Seton válasza szitko hozzászólására (») Okt 15, 2012 /
 
Nekem tetszik!
(#) szitko válasza s3toraph hozzászólására (») Okt 15, 2012 /
 
Gyors megoldás!? Megveszed a HEStore-ban az alkotóelemeket, és krimpelés helyett, forrasztod. Unalmas és lassú munka, de olcsó, és gyorsabb mint az E-bay.
(#) szitko válasza Seton hozzászólására (») Okt 15, 2012 /
 
Nekem már nem annyira. Illetve csak az RTC nem tetszik. Össze-vissza jár az óra. Van, hogy 5-6 óráig pontos, aztán elborul az agya, és elkezd sietni (valahova), vagy késni, attól függ, hogy milyen kedve van, egy óra alatt kb. 10 percet, majd lelassít, vagy felgyorsít, és utána megint pontos lesz egy ideig. De ez szerintem összefügg azzal, hogy a control 2 regisztert nem tudom kiolvasni, ill. mindenkiolvasás más-más értéket ad. /Csináltam egy ciklust amivel 20x kiolvasom a 0x70-0xf0 regiszterek értékeket 500ms-os szünetekkel, és mindegyik regiszter értéke, vagy az alapértelmezett, vagy a beállított, csak a 0xf0 regiszter ad minden kiolvasásra más értéket. Furcsa./
(#) s3toraph válasza szitko hozzászólására (») Okt 16, 2012 /
 
Az nem fog menni, mivel semmi felszerelésem nincs forrasztgatáshoz. Gyakorlatilag eddig nem is foglalkoztam elektronikával, ezért is kellene összeszerelt cucc, mert én nem tudom mivel megcsinálni.
(#) Grebi válasza s3toraph hozzászólására (») Okt 16, 2012 /
 
Hát én csináltam ilyen kábeleket, kb. 20 perces meló volt, HEStore-ról megrendeled az foglalatot meg a bele való sarut, UTP kábelt kibelezed, méretre vágod és egy fogóval simán rákrimpelheted.
(#) ZsoltiD hozzászólása Okt 17, 2012 /
 
Sziasztok!
Egy MSP430 (mondjuk G2553) uC-en lehet valahogy több szálas futtatást megvalósítani. Vagy ha nem, akkor több szál "egyidejű" futását/vagy hasonló működést hogyan valósítsak meg?
Zsolti
(#) DecebaL válasza ZsoltiD hozzászólására (») Okt 17, 2012 /
 
Használod a timer vagy watchdog időzitőt.
(#) putr4 hozzászólása Okt 18, 2012 /
 
Sziasztok!

Tudnátok segíteni egy kicsit abban, hogy a következő sort konkrétan, hogy kellene értelmezni?
"Az egyes lábakra legfeljebb -0,3 V és VCC +0,3 V közötti feszültség kapcsolható." adatlapon: "Voltage applied to any pin"
Tehát mondjuk, ha a tápfeszültségem 2,5V akkor 2,8-nál nagyobb feszültség nem mehet a lábakra. Jól gondolom?
(#) Grebi válasza putr4 hozzászólására (») Okt 18, 2012 / 1
 
Pontosan azt jelenti hogy minimális megengedett szint -0,3 V, és maximum a lábon a tápfeszültségtől 0,3 V-tal nagyobb feszültség kapcsolható. Valamint igen, jól gondolod
(#) icserny válasza putr4 hozzászólására (») Okt 18, 2012 /
 
Jól gondolod. Ez úgy értendő, hogy minden lábon van egy-egy Schottky védődióda a föld és a VDD láb felé. Ha a lábra kapcsolt feszültség kilóg a megadott sávból, akkor kinyit a megfelelő védődióda, s ha nincs áramkorlátozás, akkor ki is nyiffanhat...
(#) icserny hozzászólása Okt 18, 2012 / 2
 
Összekapcsoltam egy ENC28J60 Ethernet modult a Launchpad kártyával, s Duncan Frost blogjából kiindulva elkezdtem a felélesztését. Egyelőre az SPI kommunikáción (Ethernet LED-ek villogtatása) és az ARPtest próbán vagyok túl. (Egy ARP kéréssel a helyi hálón lekérdezhető egy IP címhez tartozó MAC cím, ami a kommunikáció első lépése). Ha lesz belőle valami értelmes dolog (TCP-IP-hez elég kicsi a RAM...), majd jelentkezem.

Következő: »»   81 / 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