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   71 / 139
(#) icserny válasza Ragathol hozzászólására (») Aug 31, 2012 /
 
Lehet, hogy megemlegetjük még ezt az előrendelést! Túl hosszú a hibalista...
(#) Gezaba válasza icserny hozzászólására (») Aug 31, 2012 /
 
Azta! Működik ezen valami?
(#) icserny válasza szitko hozzászólására (») Aug 31, 2012 /
 
A SLAU144i.pdf 17.4 szekciója tartalmazza, hogy reset után mi az USCI B0 alegységgel kapcsolatos regiszterek állapota. Ezeket visszaállíthatod, bár én túlzásnak tartom. (Ha jól értem a G2553 adatlapját, akkor abban csak A0 és B0 egység van?)

Arra külön fölhívják a figyelmet, hogy bizonyos regisztereknél csak a releváns biteket állítsuk át, nehogy mellékhatásként valamit elállítsunk!
(#) szitko válasza icserny hozzászólására (») Aug 31, 2012 /
 
Idézet:
„Ha jól értem a G2553 adatlapját, akkor abban csak A0 és B0 egység van?”

Igen, és ez a bajom.
Megpróbálom csak azokat a regisztereket visszaállítani, amiket az i2c-vel állítok, hátha... Bár nem szeretek próbálgatni, mert abból még jó soha nem származott. De ennek meg az lesz a hátránya, hogy túl sok időt fog felemészteni a váltás, és akkor már nem lesz értelme az egésznek.
Egy "egyszerű" kazánvezérlés lenne belőle, melyben lenne egy, i2c-s real time óra ic, az óra/dátum kijelzéshez, egy i2c-s eeprom, az adatrögzítéshez, egy bluetooth modul, a PC + telefon kapcsolathoz, és egy SPI-s JD-T1.8"-as lcd a kijelzéshez. Plusz még két hőmérő szenzor, de az valószínü analóg lesz. Lehet, hogy túl sok modult akarok egy ilyen "kis" vezérlőre ráakasztani?
(#) krobert válasza icserny hozzászólására (») Aug 31, 2012 /
 
Van rá esély, hogy rövidebb lesz a lista?

Vagy ezt már így kapjuk meg és szevasz...
(#) moderboy válasza krobert hozzászólására (») Aug 31, 2012 /
 
Szerintem még sokat kiírtanak belőle, nem szoktak "szemetet" árulni. Még az is lehet hogy a hibák miatt késni fog a megjelenés, bár kétlem.
(#) moderboy válasza szitko hozzászólására (») Aug 31, 2012 /
 
Ha ennyi a vesződés vele, akkor miért nem keresel egy "nagyobb" procit amiben elég kommunikációs periféria van?
(#) szitko válasza moderboy hozzászólására (») Aug 31, 2012 /
 
Ez inkább kihívás. Néztem nagyobb procit, de túl sok lába van, és sajnálnám felhasználni. A g2553-nak is marad szabad kivezetése, az előzetes tervek szerint.
(#) putr4 válasza putr4 hozzászólására (») Aug 31, 2012 /
 
Na, ma jutott időm próbálgatni a port lábakat és úgy tűnik, hogy a p1 és p2 portnak csak a felső 4 bitjét fogadja el az lcd adatvonalnak. Amint átállítom az alsó 4re vagy köztes bitekre egyből előjön a mandarin az lcd-ből.

Ezzekkel a módosításokkal működik:

  1. /* LCD port és vezérlő bitek megadása */
  2. #define LCD_PORT     P2OUT
  3. #define LCD_PORT_DIR P2DIR
  4. #define LCD_MASK     BIT7+BIT6+BIT5+BIT4
  5. #define LCD_RS       P2OUT_bit.P0
  6. #define LCD_RS_DIR   P2DIR_bit.P0
  7. #define LCD_E        P2OUT_bit.P1
  8. #define LCD_E_DIR    P2DIR_bit.P1
  9.  
  10. /**----------------------------------------------
  11.         *   Egy bájt kiküldése az LCD vezérlőjének
  12.         *-----------------------------------------------
  13.         * param val a kiírandó érték
  14.         * param cmd regiszterválasztó bit (0: parancs, 1: adat)
  15.         */
  16. void lcd_write(uint8_t val, uint8_t cmd) {
  17.   LCD_RS = cmd;
  18.   ChangeBits(LCD_PORT,((val&0xF0)),LCD_MASK);
  19.   lcd_toggle_E();
  20.   ChangeBits(LCD_PORT,((val&0x0F)<<4),LCD_MASK);
  21.   lcd_toggle_E();
  22.   __delay_cycles(1000);
  23. }
(#) icserny válasza putr4 hozzászólására (») Szept 1, 2012 /
 
Idézet:
„úgy tűnik, hogy a p1 és p2 portnak csak a felső 4 bitjét fogadja el az lcd adatvonalnak.”
Természetesen nem az LCD ennyire háklis, hanem az általam "takarékosan" megírt lcd_write() függvény.

Ha visszakeresel a topikban, megtalálod a megoldást: (keresés lcd_write-ra)
(#) szitko hozzászólása Szept 1, 2012 /
 
Sikerült!
Ha valakit érdekel, a g2553-ban a hardveres SPI és az I2C működik együtt, egy modulon (UCB0), illetve felváltva.
A hiba bennem volt ismét. Megint benéztem az operátorokat, illetve ott használtam, és olyan operátort, ahol nem kell, és nem jó.
Pl. az I2C-t így állítottam be: (részlet)
  1. UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;

Az SPI-t meg így:
  1. UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC + UCMODE_0;

A hiba: |= . De ebbe a csapdába egyszer már beleestem.
A lényeg, hogy az SPI, és az I2C adatvonal, mehet nyugodtan egy lábról, mert még a felhúzó ellenállás sem zavar be!
A hozzászólás módosítva: Szept 1, 2012
(#) szikorapéter hozzászólása Szept 1, 2012 /
 
Helló.Egy olyat szeretnék kérdezni hogy msp430g2231-es ic-vel lehet az 1soros 16 karakteres kijelzőn szöveget léptetni?(futtatni).A program mely a kjelzőt vezérli a hobbielektronika egyik cikkéből van és azzal megy,bár én nagyobb szöveget szeretnék vele kiíratni mint 16 karakter és ezért lenne szükség a léptetésre.Aki tud segíteni ebben a problémában annak előre is köszönöm!
(#) icserny válasza szikorapéter hozzászólására (») Szept 1, 2012 /
 
Igen, lehet, a 0x18-as parancs kiküldése balra lépteti a szöveget.
(#) szikorapéter válasza icserny hozzászólására (») Szept 1, 2012 /
 
ÉS azt hova kell a főprogramba beleírni mert annyira azért nem értek hozzá.
(#) szitko hozzászólása Szept 1, 2012 /
 
Kiolvasom az eeprom tartalmát egy tömbbe (rx_ee_adat). A kiolvasott tartalmat ki szeretném íratni az lcd-re, de valamit elrontok. Mit?
  1. unsigned char rx_ee_adat[12];
  2.           .....
  3.           for(char i=0; i<12; i++){
  4.                drawChar(i+5, 50, rx_ee_adat[i]);
  5.           }
  6.           ....
  7. void drawChar(char x, char y, char c){
  8.      char col = 0;
  9.      char row = 0;
  10.      char bit = 0x01;
  11.      while (row < 8){
  12.           while (col < 5){
  13.                if (font[c - 0x20][col] & bit)
  14.                     drawPixel(x + col, y + row);
  15.                col++;
  16.           }
  17.           col = 0;
  18.           bit <<= 1;
  19.           row++;
  20.      }
  21. }

Az eepromba ezt írom be:
  1. unsigned char tx_ee_adat[] = { 0x00, 0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x20, 0x57, 0x4F, 0x52, 0x4C, 0x44};    // 0Hello World

Az eredeti lcd vezérlő programban, a drawChar függvényt, így hívja meg a szerző: drawChar(10, 1, 'A');
(#) putr4 válasza icserny hozzászólására (») Szept 1, 2012 / 1
 
Kedves Icserny!

Lehet rosszul fogalmaztam. Az lcd_write-nál a biteltolást mindig megcsináltam, úgy ahogy régen írtad. A probléma nem mindig jön elő valamikor helyesen ír, de valamikor nem, viszont a felső 4 bitnél mindig jó.
Elkezdtem utána olvasni és rátaláltam colosseum kommentjére amiben van egy jó példa az egyszerű adatvonal kezelésre. Ezzel sikerült megoldanom gondomat, így bármelyik portlábról működik és csak a portvezérlő bitek megadásánál kell matatni.

Kirakom hátha találtok benne hibát:
  1. #include "io430.h"
  2. #include "stdint.h"
  3. #include "intrinsics.h"
  4.  
  5. unsigned char i,d;
  6. const unsigned char *ptr1, *ptr2;
  7. const unsigned char betwk[] = {0x02,0x04,0x0E,0x01,0x0F,0x11,0x0F,0x00,    //á
  8. 0x02,0x04,0x0E,0x11,0x1F,0x10,0x0E,0x00,    //é
  9. 0x02,0x04,0x0C,0x04,0x04,0x04,0x0E,0x00,    //í
  10. 0x02,0x04,0x0E,0x11,0x11,0x11,0x0E,0x00,    //ó
  11. 0x02,0x04,0x11,0x11,0x11,0x13,0x0D,0x00,    //ú
  12. 0x0A,0x00,0x11,0x11,0x11,0x13,0x0D,0x00,    //ü
  13. 0x05,0x0A,0x11,0x11,0x11,0x13,0x0D,0x00,    //ű
  14. 0x05,0x0A,0x0E,0x11,0x11,0x11,0x0E,0x00};   //ő
  15.    
  16.    
  17.     #define LCD_RS          P2OUT_bit.P0
  18.     #define LCD_RS_DIR      P2DIR_bit.P0
  19.     #define LCD_E           P2OUT_bit.P1
  20.     #define LCD_E_DIR       P2DIR_bit.P1
  21.     #define D5DIR           P2DIR_bit.P2
  22.     #define D5              P2OUT_bit.P2
  23.     #define D6DIR           P2DIR_bit.P3
  24.     #define D6              P2OUT_bit.P3
  25.     #define D7DIR           P2DIR_bit.P4
  26.     #define D7              P2OUT_bit.P4
  27.     #define D8DIR           P2DIR_bit.P5
  28.     #define D8              P2OUT_bit.P5
  29.  
  30.  
  31. void bitshift(uint8_t abit){
  32.   D8 = (abit&8)>>3;
  33.   D7 = (abit&4)>>2;
  34.   D6 = (abit&2)>>1;
  35.   D5 = (abit&1);
  36.  
  37. }
  38.  
  39.  
  40. void delay_ms(uint16_t delay) {
  41.          uint16_t i;
  42.          for(i=0; i<delay; i++) {
  43.            __delay_cycles(1000);
  44.          }
  45. }
  46.  
  47.  
  48. void lcd_toggle_E() {
  49.          LCD_E = 1;
  50.            __delay_cycles(500);
  51.          LCD_E = 0;
  52.            __delay_cycles(500);
  53. }  
  54.  
  55.  
  56. void lcd_write(uint16_t val, uint8_t cmd) {
  57.              LCD_RS = cmd;
  58.              bitshift((val&0xF0)>>4);
  59.          
  60.              lcd_toggle_E();
  61.              bitshift((val&0x0F));
  62.          
  63.              lcd_toggle_E();
  64.              __delay_cycles(1000);
  65.     }
  66.  
  67.  
  68. void lcd_init (void){
  69.          bitshift((0x00)>>4);
  70.          D5DIR=1;
  71.          D6DIR=1;
  72.          D7DIR=1;
  73.          D8DIR=1;
  74.          P2SEL = 0;
  75.          LCD_RS = 0;
  76.          LCD_RS_DIR = 1;
  77.          LCD_E = 0;
  78.          LCD_E_DIR = 1;
  79.          delay_ms(50);                      
  80.          bitshift((0x30)>>4);
  81.          lcd_toggle_E ();
  82.          delay_ms(5);                      
  83.          lcd_toggle_E ();
  84.          __delay_cycles(100);                
  85.          lcd_toggle_E ();
  86.          __delay_cycles(40);                
  87.          bitshift((0x20)>>4);
  88.          lcd_toggle_E ();
  89.          delay_ms(5);                        
  90.          lcd_write(0x28,0);                  
  91.          delay_ms(5);                        
  92.          lcd_write(0x08,0);                  
  93.          lcd_write(0x01,0);                  
  94.          lcd_write(0x0C,0);                  
  95. }
  96.  
  97.  
  98. void lcd_puts(char* p_str) {
  99.          char c;
  100.          while ((c=*p_str)) {
  101.              lcd_write(c,1);
  102.              p_str++;
  103.          }
  104. }
  105.  
  106.  
  107. int main(void) {
  108.          WDTCTL = WDTPW + WDTHOLD;                    
  109.          lcd_init();
  110.          lcd_puts("random adatvonal");
  111.          lcd_write(0xC0,0);                  
  112.          lcd_puts("    kezeles     ");
  113.          while(1) {
  114.  
  115.          }
  116. }
(#) icserny válasza szikorapéter hozzászólására (») Szept 1, 2012 /
 
Idézet:
„ÉS azt hova kell a főprogramba beleírni?”
Lehetőleg egy ciklusba, mivel egy 0x18 parancs kiküldése csak egy karakterhellyel lépteti balra a kijelzőt, tehát ismételgetni kell. Például így:

  1. int main(void) {
  2.   WDTCTL = WDTPW + WDTHOLD;           //watchdog letiltása
  3.   P1DIR |= 0x01;
  4.   lcd_init();
  5.   lcd_puts(""******Hello, my name is Bob********"");
  6.   lcd_write(0xC0,0);                  //A második sor elejére lép
  7.   lcd_puts("-----these lines are moving!-------");
  8.   while(1) {
  9.       lcd_write(0x18,0);         //display léptetés balra
  10.     __delay_cycles(250000);
  11.   }
  12. }


(A második sorba léptetés és a második sor kiírása elhagyandó, ha csak egysoros a kijelző, s természetesen az inicializálást is módosítani kell.)
(#) putr4 válasza icserny hozzászólására (») Szept 2, 2012 /
 
Kipróbáltam a linkelt programsorokat kiváncsiságból és nálam az lcd mindkét sorát lépteti egyszerre. Létezik olyan beállítás, hogy az egyik sor fix a másik pedig mozog?
Valamint, ha jól számoltam maximum 40 karaktert képes léptetni utána előlről kezdi. Lehet ezen bővíteni?
A hozzászólás módosítva: Szept 2, 2012
(#) icserny válasza putr4 hozzászólására (») Szept 2, 2012 /
 
Nem és nem. Mármint ha az LCD képességeire vonatkoztak a kérdések.

Szoftveres megoldás nyilván mindenre található...
1. Ha csak az első sort akarod görgetni, akkor a képernyő léptetése helyett mindig újra kell írni azt a 16 karakternyi szöveget, amit az ablakban láttatni akarsz (az lcd_write(0x80,0) paranccsal előttte mindig meg kell címezni az első sort). Itt akkor nem a képernyő görög, hanem egy mutatót léptetsz, ami a memóriában tárolt szövegből az első kiolvasandó karakter címére mutat (ha a tömb végére értél, akkor vissza kell ugratni az elejére!

2. A fenti módszerrel természetesen 40 karakternél hosszabb szöveg is kiíratható.
(#) szitko hozzászólása Szept 3, 2012 /
 
IAR-ban hol lehet azt beállítani, hogy úgy mentsen el egy projektet, hogy a régebbi verziók is meg tudják nyitni?
Csináltam egy egyszerű projektet az 5.50-el, és az 5.40-el nem tudom megnyitni.
(#) Mybuster válasza szitko hozzászólására (») Szept 4, 2012 /
 
Erre én is kíváncsi vagyok.
A hozzászólás módosítva: Szept 4, 2012
(#) szitko válasza Mybuster hozzászólására (») Szept 4, 2012 /
 
Találtam némi dokumentációt ezzel kapcsolatban, és arra jutottam, hogy a válasz: sehogy. Igaz, hogy nem az MSP-s szekcióban volt, hanem az AVR-ben, de azt írják, hogy egy magasabb verziószámú IAR-al írt projekt, nem kompatibilis az alacsonyabb verziószámú IAR-al, valami driver miatt. A lényeg, hogy az egyik gépemre feltettem a 30 napos 5.50-et, írtam benne egy kis led villogtató progit, és az 5.40-el nem tudtam megnyitni a projektet. Sőt miután felraktam az 5.50-et, egyik projektet sem tudtam lefordítani az 5.40-el, valami licenc hiba miatt, de erről is írnak az IAR oldalán. Úgyhogy csak vigyázni a frissítéssel!
A hozzászólás módosítva: Szept 4, 2012
(#) ban.laszlo hozzászólása Szept 5, 2012 /
 
Sziasztok! Ha jól tapasztalom, akkor az msp430 nem kezeli a tizedes számokat.
(#) idlob válasza ban.laszlo hozzászólására (») Szept 6, 2012 /
 
Attól függ mire gondolsz, nincs benne FPU, de ilyen nem sűrűn fordul elő ilyen pici mikrovezérlőkben.
Ettől függetlenül számolhatsz törtekkel, csak lassabb lesz mint egészekkel.
(#) ban.laszlo válasza idlob hozzászólására (») Szept 6, 2012 /
 
Csak arra gondoltam, hogy megcsináltam a belsőhőfokmérő projektet az 2x16 char LCD kijelzővel. S mindig egész számú szobahőfokot kapok, melyet a belső hőmérő mér. Még kezdő vagyok az msp témában.
(#) icserny válasza ban.laszlo hozzászólására (») Szept 6, 2012 /
 
Nézz szét a topikban ("outdec" a varázsszó), találsz rá megoldást! A hőmérsékletet tizedfok egységekre konvertáld, s a kiíratásnál jelezzük, hogy egy tizedesre kérjük a kiíratást.

Ugyanezt a módszert használom soros porti kiíratásnál is. Bővebben: link.
(#) szitko hozzászólása Szept 7, 2012 /
 
Sziasztok.
Lenne pár kérdésem.
Egy új számítógép nem túl boldog tulajdonosa lettem. Feltelepítettem az IAR 5.40.2 vagy 3-at, ami megy is szépen, egész addig amíg nem nyomok rá a "Make Restart Debugger" gombra. Kétszer-háromszor lefordítja a programot, és szimulálható is, de aztán folyamatosan hibát ír. A hiba, hogy nem találja a launchpad-ot, és csak akkor tudom újra elindítani a szimulációt, ha lehúzom és visszadugom a launchpad-ot.
Mitől lehet ez? Valaki tudna valami ötletet adni, hogy mit csináljak vele, mert ez így elég idegesítő. A "régi" és új lp-vel egyaránt csinálja. Op: win7 x64.

A másik. Lcd kérdés lenne, JD-T1800. Bár lehet, hogy csak én kísérletezek ilyen lcd-vel, és erre is magamtól kell rájöjjek.
A problémám a képen látható. A fent említett lcd-re próbáltam szerkeszteni nagyobb karaktereket, de nem sikerült, mert valamiért csak össze-visszaságot írt ki. Próbáltam nagyobb karaktertáblát (8x12, 9x16, stb) is, de azt sem írta ki. Ezért úgy döntöttem, hogy összerakom pixelekből. Ez legalább félig sikerült. A kérdés az lenne, hogy miért hagyott ki a betűkből, számokból egy csomó pixelt? A programrészlet, az http://www.43oh.com/forum/viewtopic.php?f=35&t=2246&sid=17e510cdc0c...art=20 innen letöltött program átirata. Nem én írtam, csak kiegészítettem!

A válaszokat előre is köszi.
A hozzászólás módosítva: Szept 7, 2012
(#) DecebaL válasza szitko hozzászólására (») Szept 7, 2012 /
 
A Column és Row addres beállításait nézd át én úgyanígy szívtam a 3510i szines lcd -vel mikor nagyobb karakterekkel kísérleteztem és ott Column és Row beálításokat kellett módosítanom, hogy helyesen jelenjenek meg a nagyobb karakterek. Igaz a két lcd össze sem hasonlítható, de lehet itt is az a bibi
A hozzászólás módosítva: Szept 7, 2012
(#) icserny válasza szitko hozzászólására (») Szept 7, 2012 /
 
Idézet:
„miért hagyott ki a betűkből, számokból egy csomó pixelt?”
Nem ismerem sem a kijelzőt, sem a program felépítését, de az a gyanúm, hogy a betu_meret() függvényben a for ciklus belsejében kellene meghívi a SetAddress() függvényt. Nem lehet, hogy most minden pontot ugyanarra a címre küld ki?
Idézet:
„Bár lehet, hogy csak én kísérletezek ilyen lcd-vel
Én nekem is tetszik, de most elköltöttem a zsebpénzem egy hobbi routerre (TL-WR703N), amelyen openwrt-vel szeretnék játszani. Ja, egyelőre időm sem lenne rá...

A hozzászólás módosítva: Szept 7, 2012
(#) szitko válasza DecebaL hozzászólására (») Szept 7, 2012 /
 
A pontos hiba, hogy szélességben jó a pl. 8 vagy 9 pont, az megjelenik, de hosszúságban csak 6 vagy 7 pont jelenik meg, és ebbe sűríti bele a 11-12.. pontot. Pedig átírtam a "drawChar" függvényben, mind a két while ciklust.
Következő: »»   71 / 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