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   93 / 139
(#) szitko válasza icserny hozzászólására (») Jan 20, 2013 /
 
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.
(#) icserny válasza szitko hozzászólására (») Jan 20, 2013 /
 
Köszönöm a tapasztalatokat, körülbelül ilyesmire számítottam! Lehet, hogy az msp430-gdb-vel kell megbarátkozni? Azt kipróbáltam egyszer, és működött a TI driverrel és az msp430-gdbproxy-val kombinálva. Csak egy kicsit barátságtalan, no meg a tudományom is kevés hozzá...
(#) ban.laszlo válasza ban.laszlo hozzászólására (») Jan 20, 2013 /
 
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
(#) szitko válasza ban.laszlo hozzászólására (») 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)
(#) szitko válasza ban.laszlo hozzászólására (») Jan 20, 2013 /
 
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?
(#) ban.laszlo válasza szitko hozzászólására (») Jan 20, 2013 /
 
igen, van benne, de még kezdő vagyok, s most próbálom!
(#) szitko válasza ban.laszlo hozzászólására (») Jan 20, 2013 /
 
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.
(#) ban.laszlo válasza szitko hozzászólására (») Jan 20, 2013 /
 
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?
(#) szitko válasza ban.laszlo hozzászólására (») Jan 20, 2013 /
 
Úgy értettem, hogy vagy elé, vagy után. Igazából mindegy.
(#) szitko hozzászólása Jan 21, 2013 /
 
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?

  1. if(!(UCB0CTL0 & UCMODE0)){ // ha UCMODE0 nem 1, akkor SPI módban van
  2.     i2c_mode();           // i2c mód be
  3.  ......
A hozzászólás módosítva: Jan 21, 2013
(#) icserny válasza szitko hozzászólására (») Jan 22, 2013 /
 
Ha tényleg csak ezt a két módot használod, akkor szerintem elég az UCMODE0 bit vizsgálata.
(#) szitko válasza icserny hozzászólására (») Jan 22, 2013 /
 
Köszönöm válaszod.

Igen csak ezt a két módot használom.
  1. I2C: UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C mód kiválasztása, I2C
  2. SPI: UCB0CTL0 = UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC;  // 3-pin, 8-bit SPI

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.)
(#) icserny válasza szitko hozzászólására (») Jan 22, 2013 /
 
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.
(#) szitko válasza icserny hozzászólására (») Jan 22, 2013 /
 
É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.
(#) szitko hozzászólása Jan 23, 2013 /
 
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:
  1. #pragma vector=PORT1_VECTOR
  2. __interrupt void Port2_int(void){
  3.      if(P1IFG & BIT3){              // ha a gomb le lett nyomva
  4.           TA1CTL &= ~TAIFG;         // Timer1 flag törlés
  5.           TA1R = 0;                 // Timer1 számláló törlés
  6.           while(!(P1IN & BIT3));    // gomb felengedés
  7.           button++;                 // gombnyomás számoló
  8.           if(TA1R > 20000){         // ha gombot ~2s-ig nyomtuk
  9.                P1OUT |= BIT6;       // zöld led be
  10.           }else if(button >=2){     // ha 2x nyomtuk a gombot
  11.                P1OUT &= ~BIT6;      // zöld led ki
  12.                button =0;           // gombnyomás számláló törlés
  13.           }else{
  14.                P1OUT ^= BIT0;       // ha csak egyszer lett a gomb megnyomva
  15.           }
  16.      }
  17.      P1IFG &= ~BIT3;                // gomb flag törlés
  18. }

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
(#) sunyeb válasza szitko hozzászólására (») 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
(#) szitko válasza sunyeb hozzászólására (») Jan 23, 2013 /
 
Igen tudom. Ezalatt a "kis" idő alatt ne is foglalkozzon mással a mikrovazérlő, csak a gombbal.
(#) kissi válasza szitko hozzászólására (») Jan 23, 2013 /
 
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
(#) szitko válasza kissi hozzászólására (») 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.)

main.c
    
(#) kissi válasza szitko hozzászólására (») Jan 23, 2013 /
 
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
(#) szitko válasza kissi hozzászólására (») Jan 23, 2013 /
 
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.
(#) Kovabe válasza szitko hozzászólására (») Jan 23, 2013 /
 
Szia csak érdeklödök hogy mivel méred a hömérsékletet? Én is hasonlon agyalok csak nem multi kijelzövel.
(#) szitko válasza Kovabe hozzászólására (») Jan 23, 2013 /
 
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.
(#) szitko válasza kissi hozzászólására (») Jan 23, 2013 /
 
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?
(#) kissi válasza szitko hozzászólására (») Jan 23, 2013 /
 
Í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
(#) szitko válasza kissi hozzászólására (») Jan 24, 2013 /
 
Köszi az összes segítséget!
Majdnem megoldottam, de csak "elméletben" működik:
  1. #pragma vector=PORT1_VECTOR
  2. __interrupt void Port2_int(void){
  3.      if(P1IFG & BIT3){
  4.           if(!(P1IES & BIT3)){          // ha p1.3 lefelé van húzva
  5.                P1IES |= BIT3;           // p1.3 felhúzás be
  6.                if(TA1R > 22000){        // ha ~2s-ig volt nyomva a gomb
  7.                     P1OUT |= BIT6;      // zöld led be
  8.                     TA1R = 0;           // Timer számláló törlés
  9.                }else if(button >=2){    // ha kétszer lett megnyova a gomb
  10.                     button=0;           // gomb számláló törlése
  11.                     P1OUT &= ~BIT0;     // piros led ki
  12.                     P1OUT &= ~BIT6;     // zöld led ki
  13.                     TA1R = 0;           // Timer számláló törlés
  14.                }else if(TA1R < 22000){  // ha csak egyszer lett megnyomva a gomb
  15.                     button++;           // gomb számláló
  16.                     P1OUT |= BIT0;      // piros led be
  17.                     TA1R = 0;           // Timer számláló törlés        
  18.                }
  19.           }else{
  20.                P1IES &= ~BIT3;          // p1.3 lefelé húzása
  21.                TA1R = 0;                // Timer számláló törlés
  22.           }
  23.      }
  24.      P1IFG &= ~BIT3;                // gomb flag törlés
  25. }

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.
(#) kissi válasza szitko hozzászólására (») Jan 24, 2013 /
 
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
(#) szitko válasza kissi hozzászólására (») Jan 24, 2013 /
 
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!
(#) icserny hozzászólása Jan 25, 2013 /
 
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.
(#) szitko válasza kissi hozzászólására (») Jan 26, 2013 /
 
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:
  1. #include "io430.h"
  2. #include "in430.h"
  3. #include "stdint.h"
  4. #include "stdbool.h"
  5.  
  6. #define RLED BIT0  // piros led
  7. #define GLED BIT6  // zöld led
  8. #define Gomb BIT3  // gomb
  9.  
  10. int button=0;
  11.  
  12. void main( void ){
  13.      
  14.      WDTCTL = WDTPW + WDTHOLD;      // WDT stop
  15.          
  16.      BCSCTL1= CALBC1_16MHZ;         // A gyárilag kalibrált 16 MHz
  17.      DCOCTL= CALDCO_16MHZ;          // DCO frekvencia beállítása
  18.      BCSCTL3 |= LFXT1S_2;           // VLO engedélyezése
  19.      
  20.      P1DIR |= (RLED + GLED);   // led PIN kimenet
  21.      P1OUT &= ~(RLED + GLED);  // led PIN alacsony
  22.      
  23.      P1DIR &= ~Gomb;   // p1.3 bemenet
  24.      P1REN |= Gomb;    // p1.3 felhúzóellenállás be
  25.      P1OUT |= Gomb;    // p1.3-at felfele húzzuk
  26.      P1IE |= Gomb;     // p1.3 megszakítás be
  27.      P1IES |= Gomb;    // p1.3 megszakítás felfutó élre
  28.      P1IFG &= ~Gomb;   // p1.3 flag törlése
  29.      
  30. // ------- Timer0 A ------------------------
  31.      TA1CTL = TASSEL_1 + TACLR;    // ACLK = VLO, upmode, clear
  32.      
  33.      _EINT();     // megszakítás be
  34.      while(1){
  35.           // ide kell a program...........
  36.      }  // while
  37. }  // main
  38. // --------------- Port 1 megszakítás ------
  39. #pragma vector=PORT1_VECTOR
  40. __interrupt void Port1_int(void){
  41.      if(P1IFG & Gomb){              // ha p1.3 okozta a megszakítást (elhagyható)
  42.           if(!(P1IES & Gomb)){      // ha p1.3 lefelé van húzva
  43.                TA1CCTL0 &= ~CCIE;   // akkor Timer1_A0 megszakítás tiltása
  44.                TA1CTL &= ~MC_2;     // Timer1_A0 számláló tiltás
  45.                P1IES |= Gomb;       // p1.3 felhúzás be
  46.                button++;            // gombnyomás számláló inkrementálása
  47.                if(TA1R > 20000){    // ha ~2s-ig volt nyomva a gomb
  48.                     P1OUT |= GLED;  // zöld led be
  49.                     button=0;       // gombnyomás számláló törlése
  50.                     TA1R = 0;       // Timer1_A0 számláló törlés
  51.                }else if(button >=2){// ha "gyorsan" kétszer lett megnyova a gomb
  52.                     button=0;       // gombnyomás számláló törlése
  53.                     P1OUT &= ~RLED; // piros led ki
  54.                     P1OUT &= ~GLED; // zöld led ki
  55.                }else{               // ha csak egyszer lett a gomb megnyomva
  56.                     TA1CCR0 = 6500; // Timer1_A0 felfele számolás eddig
  57.                     TA1CTL |= MC_2; // Timer1_A0 számláló indítása
  58.                     TA1CCTL0 = CCIE;// Timer1_A0 megszakítás engedélyezése
  59.                }
  60.           }else{
  61.                P1IES &= ~Gomb;    // p1.3 lefelé húzása
  62.                TA1CTL |= MC_2;    // Timer1_A0 számláló engedélyezés
  63.                TA1R = 0;          // Timer1_A0 számláló törlés
  64.           }
  65.      }
  66.      P1IFG &= ~Gomb;              // gomb flag törlés
  67. }
  68. // --------------- Timer1_A0 megszakítás ----------------------
  69. #pragma vector=TIMER1_A0_VECTOR
  70. __interrupt void Timer1(void){
  71.      
  72.      if (button==1){       // ha gomb csak egyszer lett lenyomva
  73.           P1OUT |= RLED;   // piros led be
  74.      }
  75.      button=0;             // gombnyomás számláló törlése
  76.      TA1CCTL0 &= ~CCIE;    // Timer1_A0 megszakítás tiltása
  77. }

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