www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Zagon LCDja na Texas Instruments uC

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> 16 bitni mlinčki
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Mihec
Član
Član



Pridružen-a: Pet 24 Mar 2006 20:10
Prispevkov: 412
Aktiv.: 1.88
Kraj: Mengeš

PrispevekObjavljeno: Ned Maj 03, 2009 12:19 pm    Naslov sporočila:  Zagon LCDja na Texas Instruments uC Odgovori s citatom

Pozdravljeni!

Vprašanje bom zastavil kar tule, če pa razdelek ni primeren ga prosim prestavite kam drugam.

Ukvarjam se z mikrokontrolerjem MSP430F2132 poizvajalca Texas Instruments. Za začetek bi rad vzpostavil delovanje običajnega LCDja 2x16. Spisal sem driver za začetno inicilizacijo ter brisanje LCDja, pa ni stvar nikakor ne deluje kot bi morala.

LCD je priklopljen na zunanjo napetost 4,5V, mikrokontroler se poganja s programatorja na napetosti 3,6V. Komunikacija je 4 - bitna. Po priklopu vseh sponk in napajanja se na LCDju pokažejo temni kvadratki, kot je običajno. Ob zagonu programske kode LCD narahlo utripa, proti koncu močneje in zopet obstane v začetnem stanju. Prilagam kodo napisano v Cju.

Koda:
//******************************************************************************
//  LCD
//   
//  Priključitev:   LCD        MSP430F2132
//                        
//
//      Vdd         p1         GND  (p13)   
//      Vss         p2         Vss  (p1)
//      RS         p4         P3.4 (p10)
//      R/W         p5         GND  (p14)
//      E         p6         P3.6 (p2)
//      DB4         p11         P3.0 (p11)
//      DB5         p12         P3.1 (p4)
//      DB6         p13         P3.2 (p8)
//      DB7         p14         P3.3 (p12)
//
//
//
//******************************************************************************



#include "msp430x21x2.h"


// Globalne funkcije
void init_lcm(void);       // Inicilizacija LCDja
void clr_lcm(void);        // Brisanje LCDja
void delay(int);           // Zakasnitev
void strobe(void);         // Omogočanje/onemogočanje 'Enable' signala



// Glavna funkcija

   void main()
      {
         int o;
         WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer         
         
         
         // LCD port
         P3DIR |= 0xFF;
            P3OUT &= 0x00;      
         
          for(o = 0; o < 0xEF; o++)delay(100);   // Začetna zakasnitev
          
          init_lcm();                // Inicilizacija LCDja
          clr_lcm();                           // Clear the disp[32] buffer
             
           
           
                  
      }



// Funkcije
   

void init_lcm(void)
{
   
   
   // Vzpostavitev 4 bitne komunikacije
   P3OUT = 0x00;          // Pošlji ukaz
   P3OUT |= 0x02;           // 4 bitna komunikacija
   strobe();
   delay(150);
   

   // Od sedaj naprej je omogočena 4 bitna komunikacija
   // 8 bitov se razdeli na dva dela. Najprej se pošlje zgornje(MSB-HN),
   // nato spodnje(LSB-LN) bite
   
   // Ukaz za dvovrstično delovanje LCDja (0x28)
   
   //HN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x02;         
   strobe();
   
   //LN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x08;      
   strobe();
   delay(150);
   
   // Nastavitev kurzorja (0x0F)
   
   //HN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x00;
   strobe();
   
   //LN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x0F;
   strobe();
   delay(150);
   
   
   // Brisanje LCDja (0x01)
   
   //HN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x00;
   strobe();
   
   //LN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x01;
   strobe();
   
   delay(3000); // 1,5ms
   delay(3000);
   
   // Inkrementno premikanje/omogoči premikanje po celotnem LCDju (0x07)
   
   //HN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x00;
   strobe();
   
   //LN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x07;
   strobe();
   
   delay(150);
   
}


void strobe(void)
{ // Vklaplanje 'E' porta
   P3OUT = P3OUT | 0x40; // Omogoči visoko
   delay(200);
   P3OUT = P3OUT & 0xBF; // Omogoči nizko
   delay(200);
}


void clr_lcm(void)
{
   // Zbriši LCD   
   //HN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x00;
   strobe();
   
   
   //LN
   P3OUT = 0x00; // Pošlji ukaz
   P3OUT |= 0x01;
   strobe();
   
}



void delay(int d)
{ // Zakasnitev
   int i;   
   for(i = 0; i <5*d; i++);


Možno da je kakšna manjša ali večja napaka v celotni zadevi, saj sem še bolj začetnik na tem področju. Kakršnakoli pomoč bi mi prav prišla.

Hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
piroman
Član
Član



Pridružen-a: Čet 23 Okt 2003 12:06
Prispevkov: 2707
Aktiv.: 12.19
Kraj: Ljubljana

PrispevekObjavljeno: Ned Maj 03, 2009 12:58 pm    Naslov sporočila:   Odgovori s citatom

Takole na hitro, imaš dovolj dolge zakasnitve ob inicializaciji? Če ti MSP teče na DCO je to približno 800kHz, LCDji so na začetku precej picajzlasti glede teh delayev...


Tule je en košček neke moje stare kode za inicializacijo takega displaya. Ja, vem, štorasto je napisano, je ena izmed mojih prvih stvaritev v Cju...
Koda:

void LCD_Port_Init(void)
{
   Port1_Dir |= (LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4 );   //Definira podatkovne izhode
   Port2_Dir |= (LCD_RS + LCD_E );            //Definira kontrolne izhode
}


//miganje z ENABLE nogico
void LCDE(void)                      //pomigam z E
{
 Port2_Out |= LCD_E;
 delay(100);
 Port2_Out &= ~LCD_E;
 delay(100);
}


void LCDinit(void)
{

   LCD_Port_Init();   
   
        Port2_Out &= ~LCD_RS;                  // LCD_RS PIN=Lo (CMD)         
   Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4);   // Spraznim Output

    delay(1000);
    Port1_Out = 0x03;
    LCDE();                         //1

    delay(1000);
    Port1_Out = 0x03;
    LCDE();                        //2

    delay(100);
    LCDE();                         //3

    P1OUT = 0x02;
    LCDE();                        //4

    putCMD(0x10);
    putCMD(0x08);
    putCMD(0x01);
    putCMD(0x06);
    putCMD(0x0C);   //cursor off, display on, 0E - cursor on + blink, 0F - cursor on
    putCMD(CLS);                            //pobriše display in gre domov                  // Entry mode 01IS ; I =(0 cursor decrement, 1 cursor increment); S=(0 shift off, 1 shift on)
}

//pošljem Char na LCD
void putCHAR(char temp)
{
  Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4);
  Port2_Out |= LCD_RS;
  send_data(temp);
  Port2_Out &= ~LCD_RS;
  }

void send_data(unsigned char data)
{
   unsigned char tmp;                     //Zacasna spremenljivka

   tmp=(data>>4);                        //Hi Nibble
   
   for (char i=0; i<2;i++)
   {
      Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4);   //Spraznim Output
      
      if ( BIT3 & tmp ) {Port1_Out |= LCD_Data7;}            //Priklop
      if ( BIT2 & tmp ) {Port1_Out |= LCD_Data6;}
      if ( BIT1 & tmp ) {Port1_Out |= LCD_Data5;}
      if ( BIT0 & tmp ) {Port1_Out |= LCD_Data4;}
      
      LCDE();
      
      tmp = data & 0x0F;                  //Maska samo LO-Nibble
   }
}

//pošljem CMD na display
void putCMD(char temp)
{
  Port1_Out &= ~(LCD_Data7 + LCD_Data6 + LCD_Data5 + LCD_Data4);
  Port2_Out &= ~LCD_RS;
  send_data(temp);
  Port2_Out |= LCD_RS;
  }


_________________
One shouldn’t work on semiconductors, that is a filthy mess; who knows if they really exist!
Wolfgang Pauli, 1931
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> 16 bitni mlinčki Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group