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   105 / 139
(#) SBahadurD válasza mechanika hozzászólására (») Máj 12, 2013 /
 
Tárold el az információs memóriában. Pár kommenttel korábban le lett írva a menete, éppen én kérdeztem.
(#) mechanika válasza SBahadurD hozzászólására (») Máj 12, 2013 /
 
Köszi a gyors választ!
Ehhez még nőnöm kell egy kicsit...
(#) szitko válasza mechanika hozzászólására (») Máj 12, 2013 /
 
Nem kell megijedni tőle.
- deklarálsz egy változót
- Flash setup
- flash tartalom másolása változóba
- változó használata.....
-----
- a megváltoztatott változót mented rögtön a flash-be.
A függvények, és a setup.
(#) mechanika válasza szitko hozzászólására (») Máj 13, 2013 /
 
Köszi!

Egy nagyon egyszerű próbát kreáltam és működik (magam is csodálkozom ezen )
A biztonság kedvéért bemásolom a kódot, hogy nincs-e benne valami nagy hiba. Ha rápillantanál azt megköszönném!


  1. #include "io430.h"
  2. #include "stdint.h"
  3.  int i=0;
  4.  
  5. int *Flash_ptr;        // flash mutató
  6. uint16_t ftemp;
  7. //------------------------------- Flash törlés ---------------------------
  8. void flash_clear(int cim){
  9.      Flash_ptr = (int *) cim;   // flash mutató cim=0x
  10.      FCTL1 = FWKEY + ERASE;     // erase bit 1-be, kulcs
  11.      FCTL3 = FWKEY;             // lezárás kikapcsolása
  12.      *Flash_ptr = 0;            // segmens törlése
  13.      while (FCTL3 & BUSY);      // írás kikapcsolása
  14.      FCTL3 = FWKEY + LOCK;      // lezárás
  15. }  // void
  16. //------------------------------- Flash írás ------------------------------
  17. void flash_write(int cim, int val, char cim_1){
  18.      Flash_ptr = (int *) cim + cim_1;     // flash mutató
  19.      FCTL3 = FWKEY;                       // lezárás kikapcsolása
  20.      FCTL1 = FWKEY + WRT;                 // írás engedélyezése
  21.      *Flash_ptr = val;                    // érték beírása
  22.      while (FCTL3 & BUSY);
  23.      FCTL1 = FWKEY;                       // írás kikapcsolása
  24.      FCTL3 = FWKEY + LOCK;                // lezárás
  25. } // void
  26. //------------------------------- Flash olvasása -----------
  27. uint16_t flash_read(int cim, char cim_1){
  28.      Flash_ptr = (int *) cim + cim_1;   // olvasás
  29.      ftemp = *Flash_ptr;                // mutató másolása
  30.      return ftemp;
  31. }
  32.  
  33. int main(void) {
  34.          WDTCTL = WDTPW|WDTHOLD;    // Letiltjuk a watchdog időzítőt
  35.          BCSCTL1= CALBC1_1MHZ;      // A gyárilag kalibrált 1 MHz
  36.          DCOCTL= CALDCO_1MHZ;       // DCO frekvencia beállítása
  37.          P1DIR |= (BIT6 + BIT0);    //P1.0 legyen digitális kimenet
  38.          P1DIR &= ~BIT3;            //P1.3 legyen digitális bemenet
  39.          P1OUT |= BIT3;
  40.          P1REN |= BIT3;             // P1.3 felhúzása
  41.          
  42.          // ------- Flash memoria setup ------------
  43.      FCTL2 = FWKEY + FSSEL0 + FN1;             // Flash kulcs, órajel beállítása
  44.  
  45.  
  46.      
  47.      // -- Flash olvasás --
  48.      i = flash_read(0x1000,0);     // beolvassuk a flash-ből az adatot
  49.          
  50.   while(1) {
  51.     if (!(P1IN & BIT3)){
  52.       __delay_cycles(500000);       //Várakozás kb. 250 ms ideig
  53.       i++;
  54.       i &= 0x01;             // i nem lehet 2-nél nagyobb!
  55.            // -- FLash művelet i változó mentése --
  56.      flash_clear(0x1000);                  // flash törlése, írás előtt kell!
  57.      flash_write(0x1000, i, 0);    //  írás a flash-be
  58.     }  
  59.     if (i==0){  
  60.       P1OUT &= ~BIT0;       //LED1 kikapcsolása
  61.       P1OUT |= BIT6;        //LED2 bekapcsolása
  62.          
  63.     }
  64.         if (i==1){  
  65.      P1OUT &= ~BIT6;       //LED2 kikapcsolása
  66.      P1OUT |= BIT0;        //LED1 bekapcsolása
  67.        
  68.   }
  69.   }
  70. }
A hozzászólás módosítva: Máj 13, 2013
(#) szitko válasza mechanika hozzászólására (») Máj 13, 2013 /
 
Így első ránézésre jónak tűnik.
Egy javaslat a flash (info memory) írással kapcsolatban.
Ha hosszútávra tervezed a programot, és sűrűn használod a flash írást, akkor érdemes egy szegmenset teleírni. (pl. jelen esetben, "flash_write(0x1000, i, 0);" következő írás: "flash_write(0x1000, i, 2);"..... Tehát az első írás a 0. címre, a következő írás az első adat nagyságától függően a következő üres bájra, szóra történjen. Így nem kell minden írás előtt törölni, csak ha megtelik a szegmens. Plusz még az újraírhatóság is véges, arra is oda kell figyelni.
(#) moderboy válasza szitko hozzászólására (») Máj 14, 2013 /
 
Nekem is flashel kapcsolatban lenne pár kérdésem...

Nekem lebegőpontos értéket is kellene tárolnom, nem teljesen vagyok tisztában a címzéssel és a flash felépítésével. Ha jól gondolom a függvényeddel bele tudom írni azt is, csak utána a címet egy floatnyival kell eltolni, hogy a következő érték is jó helyre kerüljön? Az én procim 16MHz-en fut, eddig arra jutottam, hogy ACLK órajelről, osztó bekapcsolással tudom a kellő sebességet biztosítani neki, ehhez esetleg van készen kód? Az ACLK lassítása melyik perifériákat lassítja?
(#) szitko válasza moderboy hozzászólására (») Máj 14, 2013 /
 
Idézet:
„Nekem lebegőpontos értéket is kellene tárolnom”

Mivel nem támogatja a mikrovezérlő ezért inkább csinálj belőle "long" típust, vagy más támogatott típusú értéket. Jobban jársz.
Idézet:
„ACLK órajelről, osztó bekapcsolással tudom a kellő sebességet biztosítani neki”

Kinek?
Idézet:
„Az ACLK lassítása melyik perifériákat lassítja?”

Amelyiknek azt mondod, hogy az ACLK órajelet használja.
(#) moderboy válasza szitko hozzászólására (») Máj 14, 2013 /
 
Tettem egy próbát a kóddal amit fentebb írtatok. Ha jól sejtem akkor a lebegőpontos változómat fel kell szorozni egész értékre és úgy eltárolni a javaslatod szerint. Megprobáltam átírni a függvényeket, hogy tudjak long-ot írni és olvasni, de nem teljes a siker. Az int változókat probléma nélkül tudom beírni és kiolvasni, de a long változót valamiért nem menti el. Meg tudnád mondani hol a hiba vagy tudnál küldeni olyan függvényt, amivel longot is tudok menteni? A cim_1 eltolás jól gondolom, hogy a menteni kívánt változó hossza lenne bájtban? Tehát egy longot így kéne mentenem flash_write(0x1000, long változóm,0); és a következő flash_write(0x1000,long változó2,4); ?

  1. int *Flash_ptr;        // flash mutató
  2. long ftemp;
  3. //------------------------------- Flash törlés ---------------------------
  4. void flash_clear(int cim){
  5.      Flash_ptr = (int *) cim;   // flash mutató cim=0x
  6.      FCTL1 = FWKEY + ERASE;     // erase bit 1-be, kulcs
  7.      FCTL3 = FWKEY;             // lezárás kikapcsolása
  8.      *Flash_ptr = 0;            // segmens törlése
  9.      while (FCTL3 & BUSY);      // írás kikapcsolása
  10.      FCTL3 = FWKEY + LOCK;      // lezárás
  11. }  // void
  12. //------------------------------- Flash írás ------------------------------
  13. void flash_write(int cim, long val, char cim_1){
  14.      Flash_ptr = (int *) cim + cim_1;     // flash mutató
  15.      FCTL3 = FWKEY;                       // lezárás kikapcsolása
  16.      FCTL1 = FWKEY + WRT;                 // írás engedélyezése
  17.      *Flash_ptr = val;                    // érték beírása
  18.      while (FCTL3 & BUSY);
  19.      FCTL1 = FWKEY;                       // írás kikapcsolása
  20.      FCTL3 = FWKEY + LOCK;                // lezárás
  21. } // void
  22. //------------------------------- Flash olvasása -----------
  23. long flash_read(int cim, char cim_1){
  24.      Flash_ptr = (int *) cim + cim_1;   // olvasás
  25.      ftemp = *Flash_ptr;                // mutató másolása
  26.      return ftemp;
  27. }
(#) szitko válasza moderboy hozzászólására (») Máj 15, 2013 /
 
Nem egészen jó az elméleted! Nézz utána a változótípusoknak!

A "float" hogy jön létre? Nem lehetne eleve "long" értéket megadni, vagy létrehozni?

Az infó memóriába max. 16 bites változókat/értéket tudsz tárolni.
Tehát, ha Te long típust szeretnél tárolni, (vagy float típust) azt szét kell szedni 16 bites értékekre, és a függvénybe "int" helyett "uint"-et kell megadni. Ennek a legegyszerűbb módja, ha a long típusú változóból, két uint változót csinálsz, és azokat mented az infó memóriába.
Valahogy így!?:
  1. unsigned int value_h=0, value_l=0;
  2. long longval;
  3.   longval=0x12345678;
  4.   value_l = longval;
  5.   value_h = longval >> 16;
  6.   flash_write(0x1000, (unsigned int)value_h,  0);
  7.   flash_write(0x1000, (unsigned int)value_l,  1);
  8. .....

Az IAR-ban, ha bekapcsolod a "View/Memory->INFO" opciót, akkor látod mit is csinálsz.
Azt még hozzá kell tegyem, hogy ennyire még nem mélyedtem el a flash kezelésben, ezért lehet, hogy van egyszerűbb módja is ennek a folyamatnak.
A hozzászólás módosítva: Máj 15, 2013

long.jpg
    
(#) Fizikus hozzászólása Máj 21, 2013 /
 
Főként HeStore-os alkatrészekből, kb. 5-6000 Ft-ból, építettem egy alacsony költségvetésű kis vonalkövető robotot. icserny kolléga nagyszerű Launchpad-es cikkei adták az ötletet hozzá.
Az angol nyelvű cikk a Let's Make Robots weboldalról:
SiLi LiLa BOT
(#) szitko válasza Fizikus hozzászólására (») Máj 21, 2013 /
 
Jól néz ki. Nekem speciel az újrahasznosított dolgok tetszenek.
(#) gyengus hozzászólása Máj 22, 2013 /
 
Sziasztok!

MSP430-al lehet valahogy érzékelni a rövidzárat? (Valószínűleg MSP430G2553-at fogok használni).
Van egy ATX tápom amiről táplálom az áramköröket fejlesztés során. Tudom, hogy van benne rövidzár védelem, de mivel mást is hajtok róla (pl. Raspberry Pi-t) nem szeretném, hogy az egész táp lekapcsoljon.
Ezért arra gondoltam, hogy csinálok egy kapcsolódobozt amivel külön-külön tudom kapcsolgatni a feszültségeket ki/be és van benne rövidzár védelem csatornánként (3,3V, 5V, 12V).
(#) sunyeb válasza gyengus hozzászólására (») Máj 22, 2013 /
 
pl. teszel a tápvonalakba egy-egy soros (mondjuk 0,01 Ohmos) ellenállást és méred rajta a feszültséget, így akár konkrét beállított áramnál is lekapcsolhatod. De lehet ágyúval verébre dolog erre MCU-t használni. Egy áteresztő/kapcsoló tranzisztor/FET mindkét esetben kell, áramfigyelő ellenállás szintén. Onnan meg kb. plusz egy tranzisztor és meg van oldva a sima, vagy visszahajló karakterisztikájú áramkorlátozás.
Mondjuk nagyobb áramoknál már kapcsolóüzemű szabályzókat érdemes használni, különben nem lesz gond a fűtéssel sem

Google a barátod...
A hozzászólás módosítva: Máj 22, 2013
(#) idlob válasza gyengus hozzászólására (») Máj 22, 2013 /
 
A tápban a rövidzárvédelem gyors és analóg. Ezzel nem fogja tudni felvenni egy kis uC a versenyt (ADC konverzióhoz idő kell, feltételt kell vizsgálni, parancsot kiadni), különösen több csatorna esetén.
(#) gyengus válasza sunyeb hozzászólására (») Máj 22, 2013 /
 
Azért használok MCUt, mert Capacitive Touch gombokat szeretnék

idlob szerint a táp védelme gyorsabban fog reagálni. Ez esetben kénytelen leszek analóg megoldást választani.

Köszönöm mindkettőtöknek a hozzászólást!
(#) VaZso8 hozzászólása Máj 26, 2013 /
 
Sziasztok!

Volt egy kis szenvedésem, amit szeretnék megosztani.

Vettem Ebayen Nokia 1202 kijelzőt, mert olcsó volt és szükségem lesz majd néhány darabra.
Láttam, hogy többen meghajtották, de mindenhol bitbang-es megoldást találtam, ezzel pedig túlságosan nem voltam kibékülve, ha már az MCU ismeri az SPI-t is.

A probléma ott kezdődik, hogy a kijelző 9-bitet vár a buszon, az MSP430 pedig 7 vagy 8-bites üzemmódban tud működni.
Ugyan a vezérlője ismer I2C, három vagy négyzetékes SPI-t (itt a D/!C nevű bit is elérhető), de a kijelzőn csak a háromvezetékesnek nevezett változat van kivezetve.
(Hogy miért SDA-t emleget az adatlap SPI-nél, azt azért nem tudom, de mindegy is.)

Tehát úgy kell kiküldeni az adatot a kijelzőnek, hogy az első bit ez a bizonyos D/!C legyen, az összes többi pedig mehet utána.

A következő kérdés, hogy kiküldhetem ugyan 8-bites sorozatokban az adatomat, de mi lesz a maradék bitekkel?
Első gondolatom az volt, hogy legrosszabb esetben megkeresem a legkisebb közös többszöröst és gyakorlatilag 9-byteot küldök ki egyszerre. Ez rendben is lenne, ráadásul találtam egy NOP utasítást is (bár lenne másik, amivel helyettesíthetném), de ez azért mégiscsak pazarlásnak tűnik.

Neten keresgélve máshol javasolták, hogy egyes esetekben a vezérlő az utolsó X byte-ot veszi figyelembe (amolyan shift-regiszterbe érkezik az adat és a CS felfutó élénél dolgozza fel).

Ám végül az adatlap további olvasgatása hozott eredményt: ha az adott byte nem teljes (és itt byte alatt 9-bitet kell érteni), akkor a csonkolt adatot a kijelző vezérlője egyszerűen eldobja.
Úgy éreztem, ez kell nekem.

Tehát a következőket csinálom jelenleg:
- Megnézem az LSB-t, hogy 1 vagy 0 volt
- Jobbra tolom a küldendő byte-ot
- Az MSB-t 1-be billentem a kijelző írásához és 0-ba parancshoz (ez a D/!C bit)
- Kiküldöm
- Második byte első bitje lesz az előbb elmentett LSB, második bitet szintén 1 vagy 0-ba billentem, bár erre lehet, nincs is szükség.
- Kiküldöm

Ezzel a módszerrel tökéletesen működik a "9-bites SPI-t" igénylő kijelzőm hardveres SPI támogatással.

Csatoltam egy képet róla.
A NYÁK nem túl jó, amolyan tesztként lett összerakva (nem akartam letépni a szalagkábelét) és a háttérvilágítás áramkorlátozó ellenállását valószínűleg nagyobbra cserélem majd.
Reset lábnak nem láttam értelmét kivezetni (bár indokot elfogadok, miért kellene), LED-et pedig a FET kapcsolja, elég egy GPIO kimenet hozzá.

A kijelző csatlakozója amúgy egész jól forrasztható, ára 2.49 AUD volt.
Ez Google szerint jelenleg 538 Ft.

A kiírt adatsor ismerős lehet, egyelőre egy meglévő programban írtam át az SPI-kezelést (van benne egy "hiba" a kiírt karaktereknél a nagy I környékén).
...de azt hiszem, kicsit másként fogom majd megoldani a vezérlését - egyelőre az volt a lényeg, hogy működjön az SPI hardveres támogatással.

Bocs a hosszú írás miatt.

kijelzo.jpg
    
(#) icserny válasza VaZso8 hozzászólására (») Máj 26, 2013 /
 
Ebben milyen vezérlő van? Nokia 5110 kijelzőnél (PCD8544 vezérlő) ki van vezetve a D/C láb, és akkor nem kell 9 bitet küldeni.
(#) VaZso8 válasza icserny hozzászólására (») Máj 26, 2013 /
 
Ebben STE2007 van, de sajnos nincs kivezetve a D/C láb. :S

Kiosztás pl. itt látszik
(#) szitko válasza VaZso8 hozzászólására (») Máj 26, 2013 /
 
Olyan ismerős ez a kijelző...Mintha lenne egy "marékkal" ebből a fajtából nekem. Van egy képed a hátuljáról?
(#) icserny válasza szitko hozzászólására (») Máj 26, 2013 /
 
Google Nokia1202 LCD keresésre a képtalálatok között találsz néhányat.
(#) szitko válasza icserny hozzászólására (») Máj 26, 2013 /
 
Megvan, köszi.
(#) icserny válasza icserny hozzászólására (») Máj 26, 2013 /
 
Egy hasonló termék (eeről nem írják, hogy Nokia kijelző volna) pedig ezen a fórumon található.
(#) VaZso8 válasza szitko hozzászólására (») Máj 26, 2013 /
 
Látom, találtál már, de azért készítettem róla képet (ez még egy "felhasználatlan" darab).

Mondjuk sok nem látszik ebből...
(#) szitko hozzászólása Máj 27, 2013 /
 
Egy furcsa jelenségre keresem a választ.
Készítek egy programot, valamilyen g2xxx vezérlővel. Általában, az esetek 99%-ban, kihasználom az UART-ot ellenőrzés, kontroll céljából. Csak akkor nem, ha minden I/O foglal. Az, hogy melyik UART-ot használom (HW/SW), az mindegy.
A hibajelenség, hogy tízből nyolcszor, egyszerűen nem ismeri fel, vagy nem jelenít meg semmit, sem a PUTTY, sem a Hyperterminal. Ilyenkor a Launchpad USB ki/be húzgálásával, és a program (Putty, Hyper) újraindításával (többször), egyszer csak elindul.
Mielőtt valaki a COM port beállításokra gyanakodna, azokkal semmi gond nincs. Van egy olyan LP-om, amin már nem is megy, sem a HW UART, sem az SW.
Találkozott már valaki ilyesmivel? Vagy van valakinek valami ötlete, hogy mi lehet a gond?
OP: Win 7 x64.
(#) icserny válasza szitko hozzászólására (») Máj 27, 2013 /
 
Idézet:
„van valakinek valami ötlete, hogy mi lehet a gond?”
Valószínűleg ez: "OP: Win 7 x64."

Az alapértelmezett 9600 Baud-dal szokott a legnagyobb valószínűséggel elindulni. PuTTY-val szokott a legnehezebben elindulni. Szégyen, nem szégyen: ha nagyon nem megy, akkor az Amicus18 IDE terminál emulátorát szoktam elővenni.

Az a sejtésem, hogy néha a Win8 Bluetooth-os programjai is bekavarnak. Amit lehet, azokat ki szoktam lőni, de mivel Bluetooth egerem van, mindent nem tudok leállítani.

Ha valami komoly dologhoz kell a kapcsolat, akkor tegyél az MSP430 mellé egy CP2102, PL2303HX vagy FTDI FT232 USB-UART protokol konvertert!
A hozzászólás módosítva: Máj 27, 2013
(#) szitko válasza icserny hozzászólására (») Máj 27, 2013 /
 
Köszi.
Mivel "Amicus18 IDE" programot nem ismerem, marad a szenvedés...Már próbáltam a Bluetooth kikapcsolni, más terminál programokkal is próbáltam (TeraTerm, HyperTerminal Private Edition...), de az eredmény ugyanaz. A Baud mindig az alapértelmezett 9600, csak kivételes esetekben szoktam megváltoztatni.
Ja, és a Win 7 x86-os gépen is ugyanez a hibajelenség van, pedig azon nincs is Bluetooth.
Rejtély....
(#) DecebaL válasza szitko hozzászólására (») Máj 27, 2013 /
 
Én rengetegszer, még nem sikerült rájönnöm mi okozza nálam is WIN7X64.
Viszont azt tapasztaltam, hogy ha elsőnek bedugom a LP -t utánna indítom a terminalt majd utoljára a CCS -t- akkor nem kel vacakolnom az LP ki/be húzgálással.
(#) szitko válasza DecebaL hozzászólására (») Máj 27, 2013 /
 
Ez jó. Kipróbálom, de így fejleszteni elég nehéz, pláne ahogy én szoktam.
Röviden a fejlesztési stílusomról: dugdosós panel - "tele" külső alkatrésszel - összekötve a LP-el - IAR vagy CCS - program futtatás/debug - teszt - ha nem jó valami, LP lehúz, ilyenkor, ha elfelejtem, az IAR kiabál, hogy eltűnt a LP, - alkatrész csere - LP visszadug - újra futtatás.

Ha minden egyes alkalommal mindent újra kellene indítanom.....
Pl. egy a képen látható projektnél, az időm nagy részét az újraindítással tölteném, töltöm most is.

1.jpg
    
(#) icserny válasza DecebaL hozzászólására (») Máj 27, 2013 /
 
Idézet:
„ha elsőnek bedugom a LP -t utánna indítom a terminalt”
Khmmm, ezt mindenféle USB CDC eszköznél eleve így kell csinálni. A Microchip mintapéldák között volt egy Plug and Play mintaalkalmazás, az kivételesen képes (de nem mindig!) kapcsolódni az utólag bedugott eszközhöz.

A Launchpad esetében az a probléma, hogy a mikrovezérlőnek csak valami szoftveresen emulált kapcsolat jut, ami bizonytalan működésű. Eleve elfuserált konstrukció...
(#) DecebaL válasza szitko hozzászólására (») Máj 27, 2013 /
 
A képen mi látható?
Következő: »»   105 / 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