Fórum témák
» Több friss téma |
Tegnap volt egy kis időm foglalkozni az Eclipse-el. (Kb. egész nap)
Az első jó benyomások hamar a kútba estek. Kezdődött azzal, hogy a drivert elég nehézkes felrakni, még úgy is, hogy az eredeti drivert letörli az ember. Bár később kiderült, hogy nem muszáj letörölni (uninstallálni) a TI drivert. A folytatás, egy egyszerű led villogtató megírása, debuggolása volt. Egy pár óra ráment arra, hogy elmagyarázzam a fordítónak, hogy milyen MCU-ról van szó, és hogy megértessem vele, mi az a P1OUT. Ehhez hozzá kell tegyem, hogy a leírtak alapján, a projekt létrehozásánál kiválasztottam a mikrovezérlő típusát. Még a soros porti kommunikációt is megpróbáltam, de sajnos a leírtaknak ismét igaza volt. Nem támogatja a kommunikációt. Egy külső USB<->RS232-es átalakítóval meg lehet oldani, de az már..... Egy szóval, jobb ha maradunk a gyártó által ajánlott fejlesztői programoknál/eszközöknél.
Sziasztok!
Én még mindig a DS18B20-nél vagyok. Szóval sikerült a uart-os mód összehozása a korábban csatolt kóddal. Most HD44780-ra szeretném kijeleztetni a hőfok értéket amit a DS18B20 mér. A I. cikk szerint a HD44780 is jól működik, sőt azt már jó régóta tudom sikeresen használni. Vajon hogyan "gyúrjam" össze a DS18B20-as progit, melyből "kiherélem" az uart-ot és HD44780-ra íratom ki a mért hőfok értéket. A hozzászólás módosítva: Jan 20, 2013
Készíts egy pl. "HD44780.c" + "HD44780.h" fájlt. Rakd bele az lcd vezérlést, csatold be, és már kész is.
Idézet: „melyből "kiherélem" az uart-ot” Én nem venném ki, elfér az benne. Ha nem akarod használni, nem küld el az adatokat. (Ha később kell egy olyan program, ami használja az UART-ot is, nem kell megírni. Pl. ráraksz egy Bluetooth modult, és a hőmérőd a PC-nek is elküldi az aktuális hőmérsékletet)
Bevallom őszintén, hogy a csatolt programba nem néztem bele, ezért elnézést kérek. Most viszont pótoltam ezt, és nekem úgy tűnik, hogy amit csatoltál "main.c" forrásfájlt, abban van LCD vezérlés. Miért nem használod azt?
igen, van benne, de még kezdő vagyok, s most próbálom!
A program elején (#define LCM_PIN_RS BIT0......) található az LCD bekötése:
LCD RS=P1.0, LCD EN=P1.1 stb. Ezek után, az "int main(){" részben vedd ki kommentből az inicializálást, és a képernyő törlést, állítsd be a kurzor pozíciót, és az UART küldés után, elé, rakd be a HD44780_outdec..... sort.
Alapvetőleg én is hasonlóan gondolom, de még nem jó. Ha jó lesz megosztom.
Pontosan, hova gondolod az UART küldés elé és után?
Úgy értettem, hogy vagy elé, vagy után. Igazából mindegy.
Sziasztok.
G2553-nál SPI és I2C módot használok. Az SPI-nél a 3-PIN-est. Szeretném megvizsgálni, hogy épp melyik módban van. Elég ha az UCMODEx egyik bitjét vizsgálom, vagy a biztonság kedvéért mind a kettőt megvizsgáljam?
A hozzászólás módosítva: Jan 21, 2013
Ha tényleg csak ezt a két módot használod, akkor szerintem elég az UCMODE0 bit vizsgálata.
Köszönöm válaszod.
Igen csak ezt a két módot használom.
Csak azért nem vagyok biztos a dolgomban, mert az SPI beállításra az IAR folyamatosan figyelmeztet, hogy nem jó a sorrend, de csak akkor, ha az "io430.h" van becsatolva ami az "io430g2553.h"-t csatolja be. (Mintha nem lenne mindegy, hogy melyik bitet állítom először. Vagy tényleg nem mindegy a sorrend? Akkor az i2c beállításnál miért nem kiabál az IAR.)
Szerintem azért pampog, mert az io430g2553.h-ban többször van definiálva néhány bit (pl. UCCKPH). Nálam nem a sorrendet kifogásolja az IAR, hanem arra figyelmeztet, hogy több enumerated típus van összekeverve az UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC kifejezésben.
Ez nyilván az SPI-nél jön elő, mert az lehet USCI_A0 és USCI_B0 is.
Érdekes.
Nekem biztos, hogy a sorrend volt a baja, mert ahogy "sorba" raktam a bit neveket, többet nem figyelmeztetett. Pl.: UCB0CTL0 = UCSYNC + UCMODE_0 + UCMST + UCMSB + UCCKPH; // 3-pin, 8-bit SPI De az is lehet, hogy nálam valami más keveredik, mert már, vagy öt féle/fajt IAR van telepítve, és néha azt sem tudom, hogy melyiket indítottam/indítom el.
Sziasztok.
Egy gombbal szeretnék megoldani három feladatot. Az elképzelésem a következő lenne: 1: gomb egyszeri megnyomása, pl.: A+B. 2: gomb "dupla katt" pl.: A+B+C. 3: gomb "hosszan nyomása, pl.: A+C. Mindezt nagyjából meg is valósítottam, de nem tudom, hogy megszakításban jó-e/szabad-e így:
A DCO 16MHz, Timer1 = VLO 12kHz (azt hiszem), és nem számoltam ki pontosan a 2s-os gombnyomást. Tesztelésből a LP ledjetit kapcsolgatom/nám, azért az szerepel a programrészletben, de a "teszt" LP-n bedöglött a nyomógomb, ezért nem tudtam letesztelni a programot. A hozzászólás módosítva: Jan 23, 2013
A while blokkol. Amíg a gombot fel nem engeded megáll minden.
Jah' és jó eséllyel prellezni is fog... A hozzászólás módosítva: Jan 23, 2013
Igen tudom. Ezalatt a "kis" idő alatt ne is foglalkozzon mással a mikrovazérlő, csak a gombbal.
Remélem jól látom:
A 6.sor blokkoló részlet, ha ezt beírod, akkor amíg nyomja, addig más funkció nem működik ( a megszakításban "csak" jelezni kellene ezeket az eseményeket egy-egy bittel és a főprogramban "ugrálni ennek megfelelően!)! Steve szerk.: Közben beszélgettem egy kollégával és látom, megelőztek... A hozzászólás módosítva: Jan 23, 2013
Jó, Jó, akkor kezdjük a legeslegelején (a programozást).
Az értem, hogy a megszakításba nem "szabad" blokkoló utasítást rakni. De miért nem? Ha a blokkolás ideje alatt nem kell mást csinálni, akkor miért nem lehet? Jelen esetben csak egy bitet figyelek, nem változik semmi, csak ennek az egy bitnek az állapota. Nem kötekedni akarok, csak megérteni! Mindenhol, mindet lehet olvasni a mikrovezérlők felépítéséről, perifériák használatáról, és itt nem csak az MSP-re gondolok, de arról nem sokat lehet hallani/olvasni, hogy egy programot, hogy kell/lehet felépíteni, szervezni, megírni. Amúgy a program amit írok, "sajnos" telis-tele van ilyesmivel. Pl. megszakításból írok LCD-re. Csatolom a félkész program "main.c" fájllát. (Nem röhögni. Egyenlőre ennyire telik tőlem.)
A megszakításnak az a lényege, hogy ne terheljük feleslegesen a processzort, legyen ideje mással (is) foglalkozni, gyorsan tudjon eseményekre reagálni. Persze, nem történik "semmi baj", ha a megszakításban vársz a NY-ra, de akkor nincs értelme a megszakításnak, mert ezt megtehetnéd a főprogramban is, hiszen nem akarsz semmire gyorsan reagálni! Ezt azért nem jó megszokni ( noha most működne ), mert később, ha bővíteni akarod a programodat ( vagy másik programmal más, gyorsabb reagálást akarsz megoldani!), akkor nagy valószínűséggel szükséged lesz a "gyors reagálásra", de akkor újra kell szervezned a programod, ill. nem alakul ki a megfelelő szemlélet!
Összegezve: ez így működhet ( az általad leírt "körítéssel"), csak általánosságban nem tesz lehetővé hatékony programozást, ezért célszerű "nem megszokni" ! Steve
Köszönöm!
A programom jelen állásában, mindezt viszonylag egyszerűen meg tudom oldani, csak még több változó kell. Az érdekes az, hogy még a "gyári" mintaprogramokban is használnak "blokkoló" utasításokat megszakításban. Lásd, pl.: "msp430....uart_01_9600.c" .... while (!(IFG2&UCA0TXIFG)); .... Tulajdonképp ez is egyfajta "blokkoló" utasítás. Vagy tévedek? Ja, és még egy. Az alap elméletem a programban először az volt, hogy egy sima óra, és hőmérséklet mérés lesz, de ezt hamar "továbbgondoltam" és ezért maradt pl az lcd kijelzés a megszakításban. Tehát először a program fő feladata az óra megjelenítése volt másodperc alapon, az RTC által idézett megszakításban, és ha már megszakítást kelt az RTC, miért ne lenne ott rögtön a kijelzés. Mindezek ellenére, azért rengeteg sikerélményem volt eddig, ezzel a programmal, és persze sok kudarc is, és a mostani állapotában, pont azt csinálja amit "elképzeltem". Íme egy-két kép a félkész cuccról.
Szia csak érdeklödök hogy mivel méred a hömérsékletet? Én is hasonlon agyalok csak nem multi kijelzövel.
Mivel nem "labor" hőmérő lesz, ezért egyszerű analóg hőszenzorokat használok. MCP9700A, TC1047A. Jelen programban csak "víz" hőmérsékletet mérek, illetve levegő hőmérsékletet.
Kiszedtem minden blokkoló rutint a megszakításokból. A program így is tökéletesen működik. Viszont így most nem tudom, hogy oldjam meg a három funkciós nyomógombot, illetve csak a "nyomva tartás"-al vagyok bajban.
Arra gondoltam, hogy ha megnyomom a gombot, a megszakításban átállítom a gomb figyelését felfutó élre (eredetileg lefutó élre van állítva), elindítok egy számlálót, és mérem a két él között eltelt időt. Az idő függvényében tudok cselekedni. Ez működhet?
Így van és akkor a gomb elengedésekor a számláló állapotától függően beállítasz biteket ( a lehetséges állapotok számától függően ) és a főprogramban ennek megfelelően cselekedsz ( vagy egy ütem változót állítasz és switch-case !)!
Steve
Köszi az összes segítséget!
Majdnem megoldottam, de csak "elméletben" működik:
A gondom már csak az "egy rövid" gombnyomással van. Mi van ha a következő gombnyomásnak is egy rövidnek kell lennie! A fenti kód szerint ez nem lehetséges, mert a számláló (button++) mindenképp ugrik egyet, de nem tudok rájönni, hogy ezt hogy oldjam meg.
Nincs itt a TAIR működtetése... annak valahogy úgy kellene működni, hogy alapból nullázom, ha nem nyomják a gombot. Ha nyomják, akkor növelem az értékét. Ha elengedik a gombot, akkor meghozom a döntést ( a mellékelt programodnak megfelelően ). Ha 1, ill. két rövid nyomás is lehet, akkor a rövid nyomás kiértékelése után el kell indítanom még egy számlálót, ami ha lejár, akkor megnézem, hogy nyomják-e a gombot, ha igen akkor kétszer akarta nyomni, ha nem, akkor egyszer ( így még gond lehet, hogy utána egyből hosszút akart nyomni, de ezzel a logikával szerintem megoldod )!
Steve Idézet: „Nincs itt a TAIR működtetése...” Azaz TA1R, a Timer1 számlálóregisztere. Jelen esetben a Timer1_A a VLO frekit használja, ami ~12kHz. Felfele számolás adott értékig, ami 65501-1. Ezeket az értékeket, mint a "if(TA1R > 22000)..." értéket is, csak hasra ütve adtam meg. Ha jól számolok, akkor ebben az esetben a TA1R 5,45s-ként csordul túl, de addig biztos nincs nyomva a gomb. (A 22000= 1,8s) Idézet: „akkor a rövid nyomás kiértékelése után el kell indítanom még egy számlálót” Valami hasonlóra gondoltam én is, annyi különbséggel, hogy ha már úgyis mérem az időt két gombnyomás közt, akkor ezt is mérhetem vele. De ez így elsőre bonyolult..... Köszönöm a segítséget!
A https://github.com/jlhonora/mspgcc-install címen található egy leírás, telepítő script és néhány kiegészítő az mspgcc Ubuntu alá történő telepítéséhez. Én nem tudom hol kipróbálni, de már maga a leírás is hasznosnak látszik.
Végre lett egy kis időm..., és örömmel közlöm, hogy sikerült összehozni, az egy gomb három funkció programrészletet. Mivel sok segítséget kaptam, úgy érzem aljasság lenne részemről nem megosztani a programot, ezért összeállítottam, egy LaunchPad-en futtatható verziót:
LaunchPad S2 gomb rövid nyomásra, piros led bekapcsol, kb 2s-ig nyomva tartva zöld led kapcsol be, és kétszer egymás után megnyomva mindkettő kikapcsol. De lehet variálni is. Sajnos a VLO frekit nem nagyon értem, mert kicsit tovább kell nyomva tartani a gombot mint 2sec, pedig a számítás szerint még 2s-ig sem kellene. Remélem itt már helyesen használom a megszakításokat, és az egyéb funkciókat is. Köszönöm még egyszer a segítséget. |
Bejelentkezés
Hirdetés |