Fórum témák
» Több friss téma |
Sziasztok!
Tudnátok segíteni abban, hogy itt mi is történik valójában?
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. Idézet: Nem létrehozunk, hanem kapunk egy mutatót. „Addig értem, hogy létrehozunk egy char típusú mutatót” Idézet: 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.„while ((c=*p_str))” Ja, tömörebben is írhatjuk:
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.
Azon gondolkodtam, hogy vajon mi a jobb? A fenti megoldás, vagy esetleg ez:
Előbbinél másolgatni kell, utóbbinál kétszer van indirekció.
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. 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.
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
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?
A hozzászólás módosítva: 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:
A beérkező adatot egyébként tényleg előjelesen kell értelmezni? Ha nem , akkor inkább uint32_t legyen. Idézet: 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.„Ez akkor nem azt jelentené, hogy deklarálunk egy char típusú pointert?” 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).
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
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):
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
Köszönöm így már jó lett!
A hozzászólás módosítva: Okt 12, 2012
Idézet: 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. „Csak azt nem értem, hogy 8 bitesként mért működött jól?”
Í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.
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)
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?
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.
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./
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.
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.
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
Használod a timer vagy watchdog időzitőt.
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?
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
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...
Ö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.
|
Bejelentkezés
Hirdetés |