Thông báo

Collapse
No announcement yet.

Thảo luận về ARM LPC 2138/2148

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Để mình coi lại xem nhé.Mai lên Hà nội mua con lcd mới vậy.Làm đủ mọi cách mà không thấy động tĩnh gì cả chỉ hiển thị vài ký tự linh tinh.
    Nhưng dù sao cũng cảm ơn các bác nhé.

    Comment


    • LPC 3v3 có thể giao tiếp trực tiếp được với LCD 5V, tham khảo schematic của board sau:



      http://www.olimex.com/dev/images/lpc-mt-2106-sch.gif

      Comment


      • Mình mới tìm hiểu về lpc2148 nên không hiểu điều sau:
        Mình ví dụ:chân 21 có ghi:P0.1/RXD0/PWM3/EINT0.Nếu mình muốn sử dụng chức năng PWM3 thì phải làm thế nào?
        Code:
          bit     ký hiệu    ý nghĩa
        +1:0      P0.0       00    GPIO Port 0.0 00
                                 01    TXD (UART0)
                                 10    PWM1
                                 11    Reserved
        Ai biết giải thích hộ mình bit(1:0)là thế nào?
        00...
        01...
        10...
        11... nghĩa là gì
        Thank !

        Comment


        • Nguyên văn bởi kamejoko80 Xem bài viết
          LPC 3v3 có thể giao tiếp trực tiếp được với LCD 5V, tham khảo schematic của board sau:



          http://www.olimex.com/dev/images/lpc-mt-2106-sch.gif

          Không phải LCD nào cũng có DC Characteristics giống nhau nên 1 số giao tiếp được với 3.3V và 1 số thì không.
          Như mình nói , phải xem lại DC Characteristics (Input voltage : VIL , VIH ) trong datasheet của cái LCD mình dùng.

          Comment


          • Không biết mấy chú ảm này thì sao. Nhưng mình vẫn dùng lcd 5V kết nối với pic 3v3 và chạy rất ổn ko gặp 1 chút ko ổn định nào.
            kit phát triển các loại:
            Đã có LPC2103 kit, AT91SAM7S kit và J_Link V.7.

            Comment


            • Nguyên văn bởi nthp_2011 Xem bài viết
              Mình mới tìm hiểu về lpc2148 nên không hiểu điều sau:
              Mình ví dụ:chân 21 có ghi:P0.1/RXD0/PWM3/EINT0.Nếu mình muốn sử dụng chức năng PWM3 thì phải làm thế nào?
              Code:
                bit     ký hiệu    ý nghĩa
              +1:0      P0.0       00    GPIO Port 0.0 00
                                       01    TXD (UART0)
                                       10    PWM1
                                       11    Reserved
              Ai biết giải thích hộ mình bit(1:0)là thế nào?
              00...
              01...
              10...
              11... nghĩa là gì
              Thank !
              bạn xem kỹ lai Usermanual cua LPC2148 nhé chức năng của thanh ghi PINSEL0
              để set chức năng PWM1 chon chân P0.1 .ta xem xét 2 bit : bit0 va bit1 của thanh ghi PINSEL. theo đó PWM1 thì bit 0 =0 ,và Bit 1 =1 .cách setip trong C
              PINSEL0 &= (unsigned int)(~0x03);//reset bit0 va bit 1 = 00
              PINSEL0 |=0x02;//bit0 =0;bit 1 =1
              Last edited by hbaocr; 26-06-2009, 11:48.

              Comment


              • Nguyên văn bởi nthp_2011 Xem bài viết
                Mình dùng con LCD thường(16x2) như hbaocr nói đó.Mình có đọc rùi nhưng kết nối như vậy không hề chạy,chán quá cơ.
                Mà code mình viết đây,các ban xem mình viết có gì sai không nhé?
                Code:
                /*------------------------------ CHUONG TRINH GIAO TIEP LCD------------------------------- */
                
                // Cac chan dung cho giao tiep LCD 
                //P0.0 - P0.7 = D0 - D7
                //P0.8 = LCD_EN
                //P0.9 = LCD_RS
                //P0.10 = LCD_RW
                
                /* Include file */
                #include <LPC214x.h>
                
                /* Define LCD PinIO Mask */
                #define  LCD_EN  0x00000100					 	// P0.8(0000 0000 0000 0000 0000 000x 0000 0000)
                #define  LCD_RS  0x00000200                  	// P0.9(0000 0000 0000 0000 0000 00x0 0000 0000)
                #define  LCD_RW  0x00000400                 	// P0.10(0000 0000 0000 0000 0000 0x00 0000 0000)
                #define  LCD_BUS 0x000000ff             		// P0.0-P0.7(0000 0000 0000 0000 0000 0000 xxxx xxxx)
                										   	
                #define  lcd_en_set() IOSET0 = LCD_EN                // EN = 1 (Enable)
                #define  lcd_en_clr() IOCLR0 = LCD_EN                // EN = 0 (Disable)
                #define  lcd_rs_set() IOSET0 = LCD_RS                // RS = 1 (Select Instruction mode)
                #define  lcd_rs_clr() IOCLR0 = LCD_RS                // RS = 0 (Select Data mode)
                #define  lcd_rw_set() IOSET0 = LCD_RW                // RW = 1 (Read)
                #define  lcd_rw_clr() IOCLR0 = LCD_RW                // RW = 0 (Write)
                
                /* Chon chieu cac IO pins giao tiep LCD*/
                #define  lcd_dir_write() IODIR0 |= 0x000007ff  	    //(0000 0000 0000 0000 0000 0xxx xxxx xxxx)
                #define  lcd_dir_read()  IODIR0 &= 0xffffff00  	    //(0000 0000 0000 0000 0000 0000 xxxx xxxx)
                
                /* Define cac thao tac co ban voi LCD */
                #define  lcd_clear()           lcd_write_control(0x01)	// Clear Display
                #define  lcd_cursor_home()     lcd_write_control(0x02)	// Set Cursor = 0
                #define  lcd_display_on()      lcd_write_control(0x0E)	// LCD Display Enable
                #define  lcd_display_off()     lcd_write_control(0x08)	// LCD Display Disable
                #define  lcd_display_blink()   lcd_write_control(0x0F)	// Set Cursor = Blink
                #define  lcd_cursor_on()       lcd_write_control(0x0E)	// Enable LCD Cursor
                #define  lcd_cursor_off()      lcd_write_control(0x0C)	// Disable LCD Cursor
                #define  lcd_cursor_left()     lcd_write_control(0x10)	// Shift Left Cursor
                #define  lcd_cursor_right()    lcd_write_control(0x14)	// Shift Right Cursor
                #define  lcd_display_sleft()   lcd_write_control(0x18)	// Shift Left Display
                #define  lcd_display_sright()  lcd_write_control(0x1C)	// Shift Right Display
                
                /* prototype */
                void lcd_init(void);					// Initial LCD
                void lcd_write_control(unsigned char);			// Write Instuction to LCD
                void lcd_write_ascii(unsigned char);			// Write LCD Display(ASCII)
                void goto_vitri(unsigned char);                        // Set Position Cursor LCD
                void lcd_hienthi(unsigned char*);							// Print Display to LCD
                char busy_lcd(void);									// Read Busy LCD Status
                void enable_lcd(void);	 								// Enable Pulse
                void delay(unsigned long int);							// Delay Function
                
                /* Chuong trinh chinh */
                int main(void)
                {      
                  lcd_init();											// Initial LCD
                  
                  // Loop Print Message to LCD16 x 2 //
                  while(1)	  											// Loop Continue
                  {
                	goto_vitri(0x80);									// Set Cursor Line-1
                    lcd_hienthi("ngay 15/06/09");						    // Display LCD Line-1    
                    goto_vitri(0xC0);									// Set Cursor = Line-2
                    lcd_hienthi("Chuong trinh LCD");						// Display LCD Line-2
                    delay(5000000);	                                    // Display Delay
                	lcd_clear();
                
                	goto_vitri(0x80);									// Set Cursor Line-1
                    lcd_hienthi("LPC2148-NXP");							// Display LCD Line-1    
                    goto_vitri(0xC0);									// Set Cursor = Line-2
                    lcd_hienthi("EASY ARM!!!");							// Display LCD Line-2
                    delay(5000000);										// Display Delay  
                	lcd_clear();
                
                	goto_vitri(0x80);									// Set Cursor Line-1
                    lcd_hienthi("Tac gia viet:");							// Display LCD Line-1    
                    goto_vitri(0xC0);									// Set Cursor = Line-2
                    lcd_hienthi("killer_hung yen");							// Display LCD Line-2
                    delay(5000000);										// Display Delay  
                	lcd_clear();
                  }  
                
                }
                /******************************************************/
                /* Initial LCD : 8bit,2-line display,5x7 dot charater */ 
                /******************************************************/
                void lcd_init()
                {
                	//unsigned int i;							// bien delay
                	PINSEL0 = 0x00000000;                   // GPIO cho cac pin P0.0 den P0.15(chon cac chan o Pinsel 0)
                	IODIR0 = 0x000007ff;                     // P0.0-P0.10 la output(gan cac chan p0.0-p0.10 lam dau ra)
                	delay(100000);				    // Power-On Delay (15 mS) 
                	
                	/* Check LCD*/
                	IOSET0 = 0x000007ff;                     // Reset all pins
                	IOCLR0 = 0x00000030;      		 		// D5:D4 = 11 (0000 0000 0000 0000 0000 0000 0011 0000) 
                    enable_lcd();                           // Xung enable cho LCD
                	delay(100000);                   	// Delay 4.1ms
                
                	IOCLR0 = 0x000007ff;	                    // Reset all pins
                	IOSET0 = 0x00000030; 					// D5:D4 = 11
                	enable_lcd();
                	while(busy_lcd());							// Xung enable cho LCD
                	delay(100000);                     // Delay 100 ms
                
                	IOCLR0 = 0x000007ff;
                	IOSET0 = 0x00000030;
                	enable_lcd();
                	while(busy_lcd());						//Wait LCD Execute complete
                
                	IOCLR0 = 0x000007ff;
                	IOSET0 = 0x00000030;
                	enable_lcd();
                	while(busy_lcd());						//Wait LCD Execute complete
                   
                    /* Config cho LCD */
                	//lcd_write_control(0x30);
                	lcd_write_control(0x38);  				// Function Set (DL=1 8-Bit,N=1 2 Line,F=0 5X7)
                    lcd_write_control(0x0C);  				// Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
                    //lcd_write_control(0x06);  				// Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
                    //lcd_write_control(0x01);  				// Clear Display  (Clear Display,Set DD RAM Address=0) 
                    delay(100000);				    // Wait Command Ready
                }
                
                /************************/
                /* thiet lap vi tri nhap nhay cua control*/
                /************************/
                void goto_vitri(unsigned char i)
                {
                	i |= 0x80;											// Set DD-RAM Address Command
                    lcd_write_control(i);  
                }
                
                /******************************/
                /* Write construction to LCD */
                /******************************/
                void lcd_write_control(unsigned char val)
                {
                    //unsigned int i;
                	lcd_rs_clr();
                	lcd_rw_clr();										// RS = 0 = Instruction Select
                	IOCLR0 = LCD_BUS;                                    // Reset Data pins RS=0
                	IOSET0 = (val & LCD_BUS);							// write value
                	enable_lcd();                                       // Xung enable LCD
                	while(busy_lcd());      							// Wait LCD Execute Complete  
                    delay(100000);								// Wait Command Ready
                }
                
                /*********************************/
                /* Write ascii character to LCD */
                /********************************/
                void lcd_write_ascii(unsigned char val)	
                {
                	unsigned int i;
                	lcd_rs_set();
                	lcd_rw_clr();										// RS = 1 = Data Select
                	IOCLR0 = LCD_BUS;                                    // Reset Data pins
                	IOSET0 = (val & LCD_BUS);					    	// write value
                	enable_lcd();                                       // Xung enable LCD
                	while(busy_lcd());      							// Wait LCD Execute Complete  
                   delay(100000);								// Wait Command Ready
                }
                
                /************************************/
                /* Print Display Data(ASCII) to LCD */
                /************************************/
                void lcd_hienthi(unsigned char* str)
                {
                  int i;
                	for (i=0;i<=16 && str[i]!=0;i++)
                	  	{					// 16 Character Print
                  		lcd_write_ascii(str[i]);
                		}						// Print Byte to LCD
                  	
                }
                
                /******************/
                /* Wait LCD Ready */
                /******************/
                
                /*char busy_lcd(void)
                {
                  unsigned long busy_status;							// Busy Status Read
                  unsigned int i;										// Delay Count
                
                  lcd_dir_read();										// LCD Data Bus = Read
                  lcd_rs_clr();		 									// Instruction Select
                  lcd_rw_set(); 										// Read Direction
                  lcd_en_set();											// Start Read Busy
                
                  for (i=0;i<100;i++);	  								// Delay Before Read
                  busy_status = (IOPIN0 & 0x00000080);                    // D7 la busy flag
                
                   if(busy_status == 0x00800000)  						// Read & Check Busy Flag
                  {
                    lcd_en_clr();  										// Disable Read
                	lcd_rw_clr();										// Default = Write Direction
                	lcd_dir_write();									// LCD Data Bus = Write
                    return 1;											// LCD Busy Status
                  }
                  else
                  {
                    lcd_en_clr();  										// Disable Read
                	lcd_rw_clr();										// Default = Write Direction
                	lcd_dir_write();									// LCD Data Bus = Write
                    return 0;											// LCD Ready Status
                  }
                }*/
                
                
                /***********************/
                /* Enable Pulse to LCD */
                /***********************/
                void enable_lcd(void)	 								// Enable Pulse
                {
                  //unsigned int i;										// Delay Count
                  lcd_en_set();  										// Enable ON (EN=1)
                  delay(100000);
                  lcd_en_clr();  										// Enable OFF(EN=0) 
                }
                
                /***********************/
                /* Delay Time Function */
                /*    1-4294967296     */
                /***********************/
                void delay(unsigned long int count1)
                {
                  while(count1 > 0) {count1--;}                            // Loop Decrease Counter    
                
                }
                Mình test trên protes chạy ngon


                Mình kết nối trực tiếp các đầu ra của lpc2148 với các chân điều khiển và data của lcd.Như vậy có gì sai không các bạn?Giúp mình nhé!
                kinh nghiệm cho thấy 1 số LCD (hên xui) . bit Busy (bit 7) đọc không được dẫn tới tình trạng treo chương trình. nên để chắc cú cho lcd_busy() nên đễ 1 hàm delay .

                Comment


                • Nguyên văn bởi hbaocr Xem bài viết
                  bạn xem kỹ lai Usermanual cua LPC2148 nhé chức năng của thanh ghi PINSEL0
                  để set chức năng PWM1 chon chân P0.1 .ta xem xét 2 bit : bit0 va bit1 của thanh ghi PINSEL. theo đó PWM1 thì bit 0 =0 ,và Bit 1 =1 .cách setip trong C
                  PINSEL0 &= (unsigned int)(~0x03);//reset bit0 va bit 1 = 00
                  PINSEL0 |=0x02;//bit0 =0;bit 1 =1
                  Theo mình biết thì:
                  p0.0 là đại diện của các giá trị 0, 1, 2, 3.
                  p0.1 là đại diện của các giá trị 0, 4, 8, 12.
                  p0.2 là đại diện của các giá trị 0, 16, 32, 48.
                  Nghĩa là muốn set chức năng chân TXD(UART0) và RxD(UART0) ta khai báo:
                  PINSEL0 |=0x00000001;//set P0.0=TxD(UART0)
                  PINSEL0 |=0x00000004;//set P0.1=RxD(UART0)
                  Có đúng không bạn?
                  Nhưng không có cách nào set chân P0.0 là GPIO Port 0.0 sa0?

                  Comment


                  • Từ trước đến bây giờ, K giao tiếp 5V và 3v3 trực tiếp không gặp vấn đề gì rắc rối cả,
                    5V thì có VH min cỡ 2.5V, ngõ ra 3v3 thì sụt áp không đến nỗi dưới 2.5V vì vậy vấn đề giao tiếp không có vấn đề gì.

                    Comment


                    • Có ai có code điều khiển động cơ 1 chiều dùng vi điều khiển ARM không cho mình đi.Đang làm điều khiển động cơ 1 chiều nè.LCD ngon rùi.
                      Thank tất cả các bác nhé !

                      Comment


                      • Nguyên văn bởi nthp_2011 Xem bài viết
                        Theo mình biết thì:
                        p0.0 là đại diện của các giá trị 0, 1, 2, 3.
                        p0.1 là đại diện của các giá trị 0, 4, 8, 12.
                        p0.2 là đại diện của các giá trị 0, 16, 32, 48.
                        Nghĩa là muốn set chức năng chân TXD(UART0) và RxD(UART0) ta khai báo:
                        PINSEL0 |=0x00000001;//set P0.0=TxD(UART0)
                        PINSEL0 |=0x00000004;//set P0.1=RxD(UART0)
                        Có đúng không bạn?
                        Nhưng không có cách nào set chân P0.0 là GPIO Port 0.0 sa0?
                        bạn set như vậy là đúng rồi;
                        muốn set P0.0 là GPIO thì thì bít 1 va bit 0 của PINSEL0 là : 00 = 0
                        P0.1 là RxD thì thì bít 3 va bit 2 của PINSEL0 là: 01 = 1
                        P0.2 là CAP0.0 thì thì bít 5 va bit 4 của PINSEL0 là : 10 = 2
                        Như vậy để config 3 chức năng cho 3 chân như trên ta làm như sau:
                        PINSEL0 |=(0x00<<0)|(0x01<<2)|(0x02<<4);

                        Comment


                        • Sao mình khai báo:
                          PINSEL0 |=(0x00<<0);//set chan P0.0 là GPIO
                          Nhưng không hề có tín hiệu?
                          Khi mình đổi thành:
                          PINSEL0 |=(0x01<<0);//set chan P0.0 là TxD(UART0)
                          Thì lại thấy tín hiệu là sao?

                          Comment


                          • Nguyên văn bởi nthp_2011 Xem bài viết
                            Sao mình khai báo:
                            PINSEL0 |=(0x00<<0);//set chan P0.0 là GPIO
                            Nhưng không hề có tín hiệu?
                            Khi mình đổi thành:
                            PINSEL0 |=(0x01<<0);//set chan P0.0 là TxD(UART0)
                            Thì lại thấy tín hiệu là sao?
                            bạn cần xem lại 2 điều
                            1.Bạn xem lại bit0 hoặc bit 1 của PINSEL đã được set trước đó chưa!Nếu chúng đã dc set lên 1 trước đó rồi thì PINSEL0 |=(0x00<<0) ko co tac dụng.Vì thực chất dòng lệnh này chả có tác dụng gì đối với PINSEL cả mình chỉ viết để minh họa cho rõ trình tự phải làm khi set chức nag8 cho các PIN thô(hii cho giống với datasheet 00 la GPIO thui) Tra bảng chức năng trong datasheet và dịch bit thui.vì OR với 0 thì do nothing .Vì thế để chắc cú bạn phải clear tất cả các bit trong PINSEL cần tác động để chọn chức năng cho PIN tuơng ứng.vd de set P0.0 la GPIO va P0.1 là UART(RXD). thì ta cần tác động tới bit 0-->bit 3 của PINSEL0.nên ta làm như sau
                            PINSEL0 &=unsigned int (~0x0F);//clear bit 0 to 3
                            PINSEL0 |=(0x01<<2); //set PO.0 la GPIO va p0.1 la RXD
                            vì lúc này bit0 va bit 1 mặc nhiên đã bằng 0 nen P0.0 la GPIO

                            2.nếu bạn đã chọn đúng chân P0.0 la GPIO thì bạn đã set chiều dữ liệu chưa(IODIR).Bạn muốn out put dữ liệu thì chon IODIR0 |=(1<<0);sau đó mới tiến hành set hay clear(bang IOSET va IOCLR) thì tín hiệu mới ra được.ngược lại nếu bạn muốn đọc dữ liệu từ chân này thì phải set nó là input pin đã IODIR0 &=usnigned int(~0x01) sau đó mới đọc dữ liệu bằng IOPIN.

                            Comment


                            • Bạn hbaocr,bạn có tài liệu gì liên quan đến LPC2148 không?
                              Nếu có bạn send cho mình qua mail này nhé:nthp.2011@gmail.com
                              Mà bạn đã làm với động cơ một chiều và động cơ bước chưa vậy?
                              Mình đang chuẩn bị làm mà chưa biết hướng ra sao.
                              Last edited by nthp_2011; 28-06-2009, 01:19.

                              Comment


                              • Sao không ai giúp mình nhỉ?

                                Comment

                                Về tác giả

                                Collapse

                                emdaikho Tìm hiểu thêm về emdaikho

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X