Thông báo

Collapse
No announcement yet.

Dung C cho AVR

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

  • #16
    Chương trình trên mình viết theo từng module mà, lcd_lib hoàn toàn không có lỗi gì. Chỉ có lỗi của ngắt thôi. Nhưng thư viện đó có sẵn trong WINAVR mà, cú pháp thì chắc không có gì sai đúng ko?
    :-B

    Comment


    • #17
      ! Mình tìm ra lỗi rồi, cám ơn mọi người đã quan tâm nhé!
      Đúng là cú pháp lẫn thư viện chả có cái gì sai cả, nó sai ở vị trí đặt hàm ngắt mà thôi!
      :-B

      Comment


      • #18
        Nguyên văn bởi quoc_thaibk Xem bài viết
        So sánh thì về tính chuyên nghiệp nhìn Avrstudio khá là pro.
        Cũng okie lập trình nó thì hiểu nhiều hơn và thư viện trên thế giới người ta viết cho nó cũng khá là nhiều.
        Còn CV thì hay ở chỗ là có template code cho mình.
        Nhưng cũng hổng an toàn.
        Theo mình người lập trình phần nhúng mà dùng template quá nhiều không ổn vì dùng template sẽ không hiểu cấu trúc của con chip bạn đang dùng.

        Điều thứ 2 nữa là CV dịch ra tốt hơn Winavr (Winavr Avrstudio là 1 đều là GCC ) ở 1 số chỗ.
        Ví dụ trong datasheet ở đoạn đọc epprom của họ atmega (mình chưa xài họ khác) nếu bạn dùng code ghi của nó thì chỉ chạy bên CV còn avrstudio không hoạt động vì cách dịch của GCC không tối ưu mã nên nó không đúng thời gian đáp ứng trong datasheet.
        ví dụ:
        Đây là code trong datasheet:
        Code:
        void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
        {
        /* Wait for completion of previous write */
        while(EECR & (1<<EEWE))
        ;
        /* Set up address and data registers */
        EEAR = uiAddress;
        EEDR = ucData;
        /* Write logical one to EEMWE */
        EECR |= (1<<EEMWE);
        /* Start eeprom write by setting EEWE */
        EECR |= (1<<EEWE);
        }
        Đây là code mình mod lại cho chạy dc với AVRStudio:
        Code:
        void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
        {
        /* Wait for completion of previous write */
        while(EECR & (1<<EEWE))
        ;
        /* Set up address and data registers */
        EEAR = uiAddress;
        EEDR = ucData;
        /* Write logical one to EEMWE */
        EECR |= (1<<EEMWE);
        //EECR |= (1<<EEWE);
        /* Start eeprom write by setting EEWE */
        asm("sbi 0x1C,1");
        }
        Chỗ (1<<EEWE) GCC không hiểu là hằng số không tính trước mà lại thành lện h tính toán trong AVR làm tốn chu kì.
        Nên nếu làm với GCC thì cẩn thận nên coi nó dịch mã ASM ra như thế nào đảm bảo an tâm chút .
        Trời, pác hiểu sai rồi, phép tính (1<<EEWE) chỉ thực hiện ở compiler thôi kết quả compiler cuối cùng là sbi 0x1C,1. AVR-GCC cực kỳ thông minh đấy, pac thử sẽ biết

        Comment


        • #19
          Nguyên văn bởi tui Xem bài viết
          Trời, pác hiểu sai rồi, phép tính (1<<EEWE) chỉ thực hiện ở compiler thôi kết quả compiler cuối cùng là sbi 0x1C,1. AVR-GCC cực kỳ thông minh đấy, pac thử sẽ biết
          Mình đã thử và đã chứng minh.
          bạn có thể thử.
          Cam đoan về kết quả.

          Sông dài, Thuyền lớn, Biển rộng bao la.
          Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

          Comment


          • #20
            Nguyên văn bởi quoc_thaibk Xem bài viết
            Mình đã thử và đã chứng minh.
            bạn có thể thử.
            Cam đoan về kết quả.
            Bạn kiểm tra lại mức độ optimization của bạn xem, nếu ở mức thấp thì AVR GCC dịch ra rất nhiều code thừa tuy nhiên nếu chọn chế độ cao thì nó cũng chẳng thua gì CodeVision đâu.
            NVT2
            Tín đồ AVR giáo.

            Comment


            • #21
              Nguyên văn bởi nvt2 Xem bài viết
              Bạn kiểm tra lại mức độ optimization của bạn xem, nếu ở mức thấp thì AVR GCC dịch ra rất nhiều code thừa tuy nhiên nếu chọn chế độ cao thì nó cũng chẳng thua gì CodeVision đâu.
              NVT2
              Ừ sau khi chỉnh lại ức optimization của GCC thì thấy nó cũng tối ưu

              Code:
              13:       EECR |= (1<<EEWE);
              +00000227:   9AE1        SBI     0x1C,1           Set bit in I/O register
              Cảm ơn NVT nhỉ.

              Sông dài, Thuyền lớn, Biển rộng bao la.
              Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

              Comment


              • #22
                các anh biết không tui rất tốn thời gian lên đây học AVR nhung các anh không chiệu tải tài liệu co bản lên thi tui mần sao ma học được nhỉ . tui đề nghị mấy anh giúp tủi em nhiệt tinh hơn có được không . những cái ma các anh tưởng chừng như đơn giản thì tui em cảm thấy khó cực ky đấy .thank you

                Comment


                • #23
                  Nguyên văn bởi quoc_thaibk Xem bài viết
                  Ừ sau khi chỉnh lại ức optimization của GCC thì thấy nó cũng tối ưu

                  Code:
                  13:       EECR |= (1<<EEWE);
                  +00000227:   9AE1        SBI     0x1C,1           Set bit in I/O register
                  Cảm ơn NVT nhỉ.
                  Anh Thái lâu nay chuyên PIC mà giờ cũng làm AVR nhuyễn nhừ rồi hen, hôm trước NVT2 lên BK có gặp anh (hình như ngồi sau lưng luôn thì phải ) mà không biết anh còn nhớ không !

                  NVT2
                  Tín đồ AVR giáo.

                  Comment


                  • #24
                    Mọi người cho mình hỏi chút về tầm vực của biến trong Winavr:
                    1. Mình khai báo biến toàn cục ngay dưới phần khai báo header nhưng không thể sử dụng trong các hàm được. Các hàm không bắt khai báo lại nhưng khi vào hàm biến bị khởi tạo lại nên không thể sử dụng kết quả từ hàm này sang hàm khác được. Ngoài ra vi điều khiển cũng rất dễ bị treo
                    2. Mặc định của biến khi khai báo là static, tức là cho phép thay đổi và lưu giá trị khi thoát ra khỏi hàm đúng ko? Mình cũng đã thử thêm từ khóa static vào phần khai báo mà không khả quan hơn .
                    3. Giải thuật cho việc quét một số bất kỳ(4,5... chữ số) từ ma trận bàn phím 4x4. Hiện giờ mình đang sử dụng biến đếm cho hàng chục, trăm... và định thời chờ quét phím kế tiếp nhấn trước khi thoát khỏi vòng lặp. Tuy nhiên cách này mình làm gặp chút rắc rối: LCD chạy loạn xạ, không thể hiện thị số được. Mình đính kèm tập tin, mọi người xem sai ở đâu giùm mình nhé!
                    Attached Files
                    :-B

                    Comment


                    • #25
                      Nguyên văn bởi dinhhieu Xem bài viết
                      Mọi người cho mình hỏi chút về tầm vực của biến trong Winavr:
                      1. Mình khai báo biến toàn cục ngay dưới phần khai báo header nhưng không thể sử dụng trong các hàm được. Các hàm không bắt khai báo lại nhưng khi vào hàm biến bị khởi tạo lại nên không thể sử dụng kết quả từ hàm này sang hàm khác được. Ngoài ra vi điều khiển cũng rất dễ bị treo
                      2. Mặc định của biến khi khai báo là static, tức là cho phép thay đổi và lưu giá trị khi thoát ra khỏi hàm đúng ko? Mình cũng đã thử thêm từ khóa static vào phần khai báo mà không khả quan hơn .
                      Không phải mặc định khi khai báo là static bạn nhầm lẫn ở chỗ này.
                      Nếu muốn Static thì phại phải tự khai báo,hoặc sử dụng biến toàn cục.
                      Mình không đọc hết ct của bạn nhưng thấy 1 số điểm ở bạn khai báo sai như sau
                      Code:
                      int temp, result,view,hundreds, tens, ones,count;
                      		count++;
                      		DDRB  = 0XFF;
                      Biến count++ theo mình thấy có lẽ bạn muốn sử dụng kiểu static.Vậy thì nên khai báo riêng cho biến count
                      như sau:
                      Code:
                      int temp, result,view,hundreds, tens, ones;
                                static int count=0;//việc cho count bằng 0 này chỉ 1 lần sau khi cấp điện cho vđk sau đó nó là static.
                      		count++;
                      		DDRB  = 0XFF;

                      Sông dài, Thuyền lớn, Biển rộng bao la.
                      Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                      Comment


                      • #26
                        Nguyên văn bởi nvt2 Xem bài viết
                        Anh Thái lâu nay chuyên PIC mà giờ cũng làm AVR nhuyễn nhừ rồi hen, hôm trước NVT2 lên BK có gặp anh (hình như ngồi sau lưng luôn thì phải ) mà không biết anh còn nhớ không !

                        NVT2
                        Ặc.nvt2 lộn mình với Anh Thái mod của Luồng mạch điện ứng dụng rồi.
                        Mình là quoc_thaibk không phải anh Thái Moderator.Hỉu nhầm ngại quá.

                        Sông dài, Thuyền lớn, Biển rộng bao la.
                        Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                        Comment


                        • #27
                          1. Mình đã thử khai báo toàn cục mà không được, trong hàm không đòi khai báo lại biến nhưng khi nạp xuống chip thì nó chạy tùm lum à. Không hiểu sao nữa ! Nếu khai báo trong mỗi hàm thì hàm khác lại không sử dụng được nó .
                          2. Mình thấy trên một số diễn đàn về WINAVR nói là static là mặc định khi khai báo biến mà, hơn nữa mình cũng đã thử khai báo static rồi mà kết quả cũng vậy thôi.
                          :-B

                          Comment


                          • #28
                            Nguyên văn bởi dinhhieu Xem bài viết
                            1. Mình đã thử khai báo toàn cục mà không được, trong hàm không đòi khai báo lại biến nhưng khi nạp xuống chip thì nó chạy tùm lum à. Không hiểu sao nữa ! Nếu khai báo trong mỗi hàm thì hàm khác lại không sử dụng được nó .
                            2. Mình thấy trên một số diễn đàn về WINAVR nói là static là mặc định khi khai báo biến mà, hơn nữa mình cũng đã thử khai báo static rồi mà kết quả cũng vậy thôi.
                            Sử dụng toàn cục nạp xuống chip chạy tùm lum hơi lạ à nha.
                            Bạn thử viết 1 chương trình nhỏ không liên quan tới ct LCD gì của bạn đấy.ví dụ điều khiển led chẳng hạn.
                            Rồi khai báo biến toàn cục đưa nó ra led coi.
                            Ví dụ:
                            Code:
                            unsigned char test;
                            void main()
                            {
                            	test=0x55;
                            	DDRB=0xff;
                            	while(1)
                            	{
                            		test--;
                            		PORTB=test;
                                            delay(1000);
                            	}
                            }
                            Vấn đề mặc định là static hay không là tùy.
                            Nếu khai báo trong hàm con thì tuỳ theo cơ chế trình biên dịch.
                            Có thể sử dụng trực tiếp các thanh ghi để làm biến khi thoát khỏi hàm con thì trả thanh ghi đó về cho chương trình khác.Nếu khai báo static thì lúc đó mới sử dụng 1 vùng nhớ dành riêng cho ct con.
                            Còn biến toàn cục đc dành riêng 1 vùng nhớ ban đầu từ lúc ct bắt đầu đến khi nó hết điện .
                            Last edited by quoc_thaibk; 08-08-2007, 10:49.

                            Sông dài, Thuyền lớn, Biển rộng bao la.
                            Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                            Comment


                            • #29
                              Nguyên văn bởi quoc_thaibk Xem bài viết
                              Ặc.nvt2 lộn mình với Anh Thái mod của Luồng mạch điện ứng dụng rồi.
                              Mình là quoc_thaibk không phải anh Thái Moderator.Hỉu nhầm ngại quá.
                              Oh, thật xin lỗi, hình như trong list yahoo của mình có add bạn mà trông tấm hình trên avata giống anh Thái quá nên cứ ngỡ...là gặp rồi. Xin lỗi nha !

                              NVT2
                              Tín đồ AVR giáo.

                              Comment


                              • #30
                                Bạn đúng !Vấn đề không phải tại nó không hiểu biến mà do mình khai báo khi sử dụng hàm sprintf sai. Khi thử bằng led khoanh vùng lại mới thấy được lỗi của nó! Cám ơn bạn nhiều nhé!
                                :-B

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X