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

  • @nthp_2011 : Chào bạn, bạn có thể chi tiết về công việc bạn đang làm không, bạn dùng LCD nào? Bạn có thể up lên code mà bạn đang làm không, để anh em trong diễn đàn xem và ra hướng giải quyết.

    @robotden: Email của K là kamejoko80@yahoo.com, bạn cần bao nhiêu con LPC? Nếu tiện thì viết email he.

    Comment


    • em sẽ mail nha a
      thank a K
      All in one. Sài Gòn + Đồng Nai.

      Comment


      • HEE HEE;
        @kamejoko80:
        @robotden:
        Các bác viết tutorial ve cách sử dụng opensource di; GCC đê. em bu vào tham gia cho vui!

        Comment


        • @nthp_2011: không biết ban sài LCD nào.Nhưng nếu là LCD thường(16X2) thì code ở đây
          http://dientuvietnam.net/forums/show...t=12936&page=2

          còn GLCD thì bạn phải nói là loại nào anh em mới biết ngõ mà jup chứ

          Comment


          • Hướng dẫn cho Winarm

            Hi hbaocr, ku em có làm với WinArm lần nào chưa, có gì làm thử và đưa tutorial lên he. Về mặc ngôn ngữ C thì coi như chuẩn rồi, giống nhau đối với các trình biên dịch, chỉ các nhau một vài directive đặc biệt nào đó thôi.

            Tham khảo vài bước cài đặt sau đây he:


            WinARM is a collection of GNU tools for ARM MCU family packed by Martin Thomas that works on MS Windows. WinARM is developed by inspiration on WinAVR project and it is really simple to start working with it if you had a chance to try WinAVR. WinARM doesn't depend on cygwin or mingw-environment like GNUARM tools does. WinARM toolset is compilled to work with most ARM microcontrollers including LPC2000 series, Atmel's ARM microcontrollers and Analog devices ARM microcontrollers as well. Basically tools should work with any microcontroller with ARM architecture.
            Latest WinARM includes in Version 20060606:
            • GNU-C/C++-Compiler Version 4.1.1 incl. stdlib3. The configuration supports ARM-Mode, Thumb-Mode and Mixed(ARM/Thumb)-Mode, little/big-endian and floating point-emulation;
            • GNU-Binutil;
            • newlib Version 1.14.0;
            • newlib-lpc Rel.5a (reentrant syscalls for newlib and Philips LPCs)
            • GNU-Utils to support the compiler/linker;
            • ARM header-files (register-defintions);
            • Example applications with full source-code, makefiles, linker-scripts and startup-code for Philips LPC2000, ADuC7k and Atmel AT91SAM7 ARM7TDMI controllers.
            • Programmers Notepad Editor Version 2.0.6.1
            • The lpc21isp in-system-programming-software for Philips LPC2xxx and the Analog Devices ADUC 70xx family by Martin Maurer. Included Versions: 1.31 and 1.37(BETA)
            • Bray Terminal by Vlado Brajer
            • Insight-GDB 6.5.50-20060517 - Win32-Native from devkitpro.org
            • gdb (command-line without Insight) GNU gdb 6.4.50.20060226-cvs from;
            • Setup-Exe of Macraigor's OCDRemote (Wigger-gdb interface, Ver. 2.16);
            • Open On-Chip debugger (OpenOCD, SVN Version 65) made by Dominic Rath ;
            • H-JTAG (Ver. 0.2.1 beta 20060402) made by "twentyone" ;
            • J-Link gdb-Server V1.0 from the gnuarm yahoo-group;
            • There is still installer needs to be done.
              Few ease steps to start working with WINARM:
              • Download WinARM from here or more compressed 7zip package here.
              • Extract package contents in system root (for instant on C:\WinARM);
              • Set Environmental variables. Goto "Control Panel" -> "System" -> "Advanced Tab" -> "Environmental variables"
                Edit "System Variables" -> Path
                add the following lines in the end of the Path variable.
                (if you extracted WinARM to c:\) ;c:\WinARM\bin;c:\WinARM\utils\bin;
              You are set up. Now lets compile an example project:
              Open Programmers Notepad (pn.exe) from C:\WinARM\pn folder:
            Then in Programmes Notepad (PN) open example project from: c:\WinARM\examples\lpc2106_blink_switch\ folder called ledswitch.pnproj:
            And now you can compile(make) the program by selecting one of following commands:
            Make All - compile the program to hex file;
            Make Clean - remove all the object files and binaries of previous compilation;
            Make Program - run the lpc21isp to download the compiled hex file to your LPC ARM( makefile has to be set up for this operation).

            Comment



            • Có thể dùng mạch dây cable wigler trên để nạp LPC

              Comment


              • Nguyên văn bởi hbaocr Xem bài viết
                @nthp_2011: không biết ban sài LCD nào.Nhưng nếu là LCD thường(16X2) thì code ở đây
                http://dientuvietnam.net/forums/show...t=12936&page=2

                còn GLCD thì bạn phải nói là loại nào anh em mới biết ngõ mà jup chứ
                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é!
                Last edited by nthp_2011; 25-06-2009, 01:06.

                Comment


                • Nếu kết quả mô phỏng OK, mà không chạy khi test thực tế thì bạn thử xem lại kết nối phần cứng đúng hay chưa.

                  1> Để đảm bảo con LPC2148 chạy được hay không ta nên dùng chức năng debug qua cổng COM (dùng hàm printf, puts... chẳng hạn).

                  2> Kiểm tra lại xem bước kiểm tra cờ busy thành công hay không (đặt debug mesage tại bước này)

                  3> Nếu các bước trên không được bạn nên xem lại LCD có bị die hay không, dùng mạch chuyên dụng để test LCD nếu cần thiết.

                  Chúc thành công

                  Comment


                  • Nguyên văn bởi kamejoko80 Xem bài viết
                    Nếu kết quả mô phỏng OK, mà không chạy khi test thực tế thì bạn thử xem lại kết nối phần cứng đúng hay chưa.

                    1> Để đảm bảo con LPC2148 chạy được hay không ta nên dùng chức năng debug qua cổng COM (dùng hàm printf, puts... chẳng hạn).

                    2> Kiểm tra lại xem bước kiểm tra cờ busy thành công hay không (đặt debug mesage tại bước này)

                    3> Nếu các bước trên không được bạn nên xem lại LCD có bị die hay không, dùng mạch chuyên dụng để test LCD nếu cần thiết.

                    Chúc thành công
                    Mình kết nối trực tiếp các chân lcd với các chân ra của lpc2148 có lỗi gì không bạn?
                    Còn bước 1 và bước 2 mình không hiểu lắm.Bạn có thể nói cụ thể được không?
                    Thank

                    Comment


                    • Kết nối trực tiếp 3v3 và 5v chắc là không có vấn đề gì ?

                      Bạn kiểm tra kết quả của hàm "busy_lcd()" thử.

                      Comment


                      • Nguyên văn bởi kamejoko80 Xem bài viết
                        Kết nối trực tiếp 3v3 và 5v chắc là không có vấn đề gì ?

                        Bạn kiểm tra kết quả của hàm "busy_lcd()" thử.
                        Bạn thử xem chương trình con hàm"busy_lcd", có sai gì không nhé?Mình chẳng thấy gì sai cả.

                        Comment


                        • Ý K không phải đề cập chương trình viết đúng hay sai, mà đề cập đến phương pháp debug để tìm ra nguyên nhân, lúc bạn chạy, hàm này trả về kết quả như thế nào ???

                          Comment


                          • Mình vừa làm toi con lcd rùi,chán quá.
                            Cho mình hỏi tốc độ xử lý của lpc2148 có ảnh hưởng gì đến việc hiện thị của lcd không?

                            Comment


                            • Nguyên văn bởi nthp_2011 Xem bài viết
                              Mình vừa làm toi con lcd rùi,chán quá.
                              Cho mình hỏi tốc độ xử lý của lpc2148 có ảnh hưởng gì đến việc hiện thị của lcd không?
                              Nếu mô phỏng tốt mà làm thực tế không chạy thì ta có thể đoán được do hardware.

                              Tốc độ ảnh hưởng ở chỗ thời gian đáp ứng, ví dụ chân E xuống thấp và lên cao cần phải đảm bảo thời gian tối thiểu nào đó. Nếu tham khảo datasheet của driver chip thì sẽ rõ.

                              Có 2 cách giao tiếp LCD loại này:

                              1> Ta biết trước thời gian thực thi của một lệnh, theo đó, cần phải có một khoảng thời gian chờ cho lệnh trước hoàn tất.
                              2> Hoặc kiểm tra cờ busy trên bit 7 báo hiệu lệnh thực thi hoàn tất, trong trường hợp này, driver điều khiển sẽ thực hiện đoạn code chờ bit cờ thay đổi trạng thái. Nếu vì lí do gì đó bit cờ này không thay đổi, chương trình chúng ta sẽ bị loop ngay chỗ này, chính vì thế ta cần kiểm tra kết quả của hàm busy_lcd().

                              Comment


                              • Nguyên văn bởi kamejoko80 Xem bài viết
                                Kết nối trực tiếp 3v3 và 5v chắc là không có vấn đề gì ?

                                Bạn kiểm tra kết quả của hàm "busy_lcd()" thử.
                                Bạn lại xem datasheet của LCD , V input High của LCD 5V thường là 3.6V nên khi kết nối với LPC thì chưa đủ để tạo mức logic high . tuy nhiên vẫn có 1 số trường hợp "hên xui" vẫn chạy bình thường nhưng ko ổn đị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