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

  • LPC2148 chạy nhanh cỡ nào???

    Mình dùng thạch anh 12MHz, PLL để được clock CPU = 60MHz; MAM = 2; PCLK = CCLK/2. Sau vài thử nghiệm thì được kết quả thế này:
    lệnh asm NOP mất 0.03125us = 1.875 cycle
    lệnh i++ với i là số unsigned int mất 0.226us = 13.6 cycle
    lệnh IOSET0=0x80000000 (bật led P0.31) mất 0.209us = 12.5cycle
    các lệnh if, while, gọi hàm... chưa đo chính xác nhưng còn chậm hơn nữa.

    Kết quả đo bằng timer, ko dùng ngắt, timer thì đã đo thử bằng đồng hồ thật, chạy chính xác. Thử nghiệm xong thất vong, sao lại chậm thế nhỉ? có gì sai ko nhỉ?

    Xem instruction set của ARM7TDMI-S, mà phần cycle timing rối rắm quá, ko hiểu gì cả
    Last edited by mgdaubo; 16-09-2010, 15:45.
    Phạm Minh Tuấn

    (+84) 982006467

    Comment


    • Hic, lệnh i++, với unsigned int i khai báo cục bộ trong hàm test thì chỉ mất 1 cycle clock. Nhưng unsigned int i khai báo toàn cục thì mất tới 13.6 cycle.
      Và: i++ mất 0.226us; nhưng i++; j++; (2 lệnh liên tiếp), mất 0.322us.

      Mình dùng keil C 4. Bác nào giải thích giúp sao lại có sự khác biệt thế? làm thế nào tối ưu tốc độ...?
      Phạm Minh Tuấn

      (+84) 982006467

      Comment


      • Chỉ mình em solo với cái vụ tối ưu tốc độ này thôi sao?

        Vẫn chưa hiểu vì sao có sự khác biệt khi xử lý 1 biến cục bộ với 1 biến toàn cục.

        Còn về IOSET với IOCLR, nó chậm vì nó "accessed via VPB addresses", tức là dùng clock của peripheral đã qua VPB divider. Để cải thiện tốc độ IO ta có thể dùng Fast GPIO.
        FIOSET với FIOCLR nhanh tương đương với 1 lệnh asm NOP.
        Phạm Minh Tuấn

        (+84) 982006467

        Comment


        • bạn test bang timer thế nào vậy có thể đưa doạn code đó lên xem.Quá trình test ! chu minh tya con nay chay nhanh lắm mà! đã test tính toán lọc kalman ma trận 6x6 tính toán trên số thực( mặc dù chú này ko co Floating point) tính chưa het 10ms).
          Hồi trước cũng có vọc test bằng dao động ký thấy đâu có giống như bác nói!

          Comment


          • Nguyên văn bởi hbaocr Xem bài viết
            bạn test bang timer thế nào vậy có thể đưa doạn code đó lên xem.Quá trình test ! chu minh tya con nay chay nhanh lắm mà! đã test tính toán lọc kalman ma trận 6x6 tính toán trên số thực( mặc dù chú này ko co Floating point) tính chưa het 10ms).
            Hồi trước cũng có vọc test bằng dao động ký thấy đâu có giống như bác nói!
            Thạch anh 12MHz
            PLL config: MSEL=5; PSEL=2; => CCLK=60MHz.
            VPP divider = CPU closk /2 = 30MHz.

            init timer0:
            T0PR = 30; //timer0 prescale register value = 30
            T0TCR |= 0x01; //enable timer0 & prescale timer0

            Rồi mình test thế này:
            T0TC = 0; //reset timer0
            for(i=0; i<1000; i++){
            ... đặt vài phép tính ở đây
            }
            duration = T0TC; //lấy thời gian cần đo.

            Ban đầu cho chạy vòng for mà ko đặt phép tính nào bên trong, để lấy được thời gian tính toán của vòng for. Sau đó mình đặt vài câu lệnh cần test vào và đo lại duration, rồi trừ ra phần duration của for thì được thời gian tính toán của đoạn code, đem chia cho 1000 (vì lặp 1000 lần trong vòng for).

            Ko biết đo đạc vậy có đúng ko, nhưng nếu tính toán với biến cục bộ trong 1 function thì nhanh lắm, còn dùng biến toàn cục cho cả chương trình thì nó tính hơi lâu, như mình đã post đó.
            Phạm Minh Tuấn

            (+84) 982006467

            Comment


            • em đang nghiên cứu phần enthernet của lpc1768 . xin phép được hỏi phần enthernet là dùng để trao đổi dữ liệu giữa các trạm vậy khi mình dùng lpc thì có phải nó đóng vai trò moderm o . và em có thể dùng nó để liên kết 2 máy tính o . mong đươc giúp đỡ

              Comment


              • Các bác giúp em với ạ! Em đang làm đồ án môn dùng LPC2138 giao tiếp với nhau theo chuẩn SPI bác nào đã làm rùi có thể gợi ý cho em với cách truyền và cách nhận với ARM theo chuẩn SPI với ạ! Em đã tham khảo bài của anh Connection up nhưng bài đó quá khó hiểu.
                Thanks các bác trước!!

                Comment


                • cho mình hỏi 1 câu hỏi nhỏ nhé: có bạn nào đã mô phỏng ADC của con LPC 21xx thành công trên Proteus 7.7 chưa? Mình loay hoay cả buổi tối, đọc code ko có gì sai mà nó vẫn ko thể nào mô phỏng dc.

                  Comment


                  • chào mọi người!
                    e là lính mới đang nghiên cứu về ARM mà chưa biết gì. bác nào có tài liệu về LPC1768 tiếng việt cho e xin tham khảo với. và có thể chỉ giúp e xem LPC1768 và LPC2000 khác nhau như thế nào? có thể dùng code của con này cho con kia được không. e xin cảm ơn nhiều

                    Comment


                    • em chào các bác!
                      các bác cho em hỏi với em có được thầy giáo cho kiểm tra một mạch có lpc 2214 . lpc2214 kết nối với màn hinh lcd 4 hang .em đo các chân nguồn của lpc 2214 như
                      datasheet của nó thì thấy có điện áp bình thường đều tốt, nhưng khi đo chân giao động thì ko thấy có xung chân giao động dùng giao động nội.
                      Các bác cho em biết mà tại sao con này không giao động không .mà như thầy em bảo thì bật nguồn nên thì màn hình lcd hiển thị nhưng em đo thì không thấy có xung
                      cho chân enable.
                      có bác nào biết thì giúp em với nhá cảm ơn cả nhà

                      Comment


                      • help me!!!
                        ai biết lập trình truyền nhận data qua cổng uart của vđk lpc2378 thì chỉ giáo mình với , sửa đi sửa lại nhưng ko được. huhhuhuh. mình đang rất cần,

                        Comment


                        • Cho mình hỏi là khi dùng input capture, nếu ở AVR có thể dùng timer overflow interrupt để tăng biến overflow+=0xFF, đồng thời cả input capture để đo chu kì. Nhưng ở LPC2138, Vectored interrupt của Timer 0 hoặc 1 sử dụng 1 địa chỉ cho cả Match và Input capture. Vậy có thể dùng được đồng thời 2 interrupt này không? Giải pháp là sử dụng 2 Timer cùng nhịp, mỗi timer chịu 1 interrupt, hay là khai báo interrupt như thế nào ạ?

                          Comment


                          • Ai đã mô phỏng ADC trên proteus chưa cho mình tham khảo với , mình mới chuyển sang ARM loay hoay mãi mà không chạy được gì cả

                            Comment


                            • các bác giúp em sửa lỗi code UART không sử dụng ngắt này tại sao ko hoạt động được: em dùng thạch anh 20Mhz
                              .
                              #include <LPC213X.H>
                              void UART0_init()
                              {
                              //Assign P0.0 as TXD and P0.1 as RXD
                              PINSEL0 = 0x00000005;
                              //UART0 Line Control Register, used to configure Serial Port Parameters
                              U0LCR = 0x83; //8-bit Data, No Parity and 1-Stop Bit

                              //U0DLL and U0DLM Values to be loaded, to get Baud Rate of 9600bps
                              U0DLL = 0X5D;
                              U0DLM = 0X00;
                              U0FDR = 0X00000052;
                              U0LCR = 0X03;
                              }

                              void UART0_Write(unsigned char value)
                              {
                              while((U0LSR&0x20) == 0);
                              //While U0THR Contains Some Valid Data Stay Here
                              U0THR = value;
                              }
                              unsigned char UART0_ReadByte(){
                              /*U0LSR0 is Set When U0RBR Contains Some Valid Data
                              otherwise U0LSR0 is Clear*/
                              while((U0LSR&0x01) == 0);
                              //Stay Here until U0LSR0 set to 1
                              return U0RBR;
                              }
                              int main(){
                              UART0_init();
                              UART0_Write('H');
                              return 0;

                              }

                              Comment


                              • Hỏi về ADC

                                Bác nào xem giúp em đoạn code sau với ạ. Em code ADC mà sao kết quả nó cứ chạy loạn lên ấy ạ. Thanks các bác ạ.
                                void ADC_Init (void)
                                {
                                PCONP |= ( 1<<12 );
                                AD0CR = ( 15 << 8 ) |
                                ( 0 << 16 ) |
                                ( 0 << 17 ) |
                                ( 1 << 21 ) |
                                ( 0 << 24 ) |
                                ( 0 << 27 );
                                }

                                unsigned int ADC_Read (unsigned char _vrc_Chanel)
                                {
                                unsigned int vrui_val;
                                AD0CR |= ( 1 << _vrc_Chanel );
                                AD0CR |= ( 1 << 24 );
                                while ( (AD0STAT & (1<<_vrc_Chanel)) == 0);
                                if (_vrc_Chanel == 0)
                                {
                                vrui_val = AD0DR0;
                                }
                                if (_vrc_Chanel == 1)
                                {
                                vrui_val = AD0DR1;
                                }
                                if (_vrc_Chanel == 2)
                                {
                                vrui_val = AD0DR2;
                                }
                                if (_vrc_Chanel == 3)
                                {
                                vrui_val = AD0DR3;
                                }
                                if (_vrc_Chanel == 4)
                                {
                                vrui_val = AD0DR4;
                                }
                                if (_vrc_Chanel == 5)
                                {
                                vrui_val = AD0DR5;
                                }
                                if (_vrc_Chanel == 6)
                                {
                                vrui_val = AD0DR6;
                                }
                                if (_vrc_Chanel == 7)
                                {
                                vrui_val = AD0DR7;
                                }
                                vrui_val >>= 6;
                                vrui_val = vrui_val & 0x03ff;
                                AD0CR |= ( 0 << 24 );
                                AD0CR |= ( 0 << _vrc_Chanel );
                                return (vrui_val);
                                }

                                Let's go!!!

                                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