Thông báo

Collapse
No announcement yet.

[help] hiển sỗ xung của encoder lên LCD

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

  • #46
    Bạn ơi ,mình thấy chỗ này chưa hiểu lắm :
    unsigned char chuoi[3];
    cái này khai báo trong SRAM phải ko?
    Và câu lệnh:
    lcd_putsf(chuoi);
    cái 'chuoi ' nay hình như khai báo trong flash thì phải?

    Comment


    • #47
      Nguyên văn bởi Le Thi Bich Xem bài viết
      Chương trình của em hơi cồng kềnh, các anh chịu khó đọc xem giúp em nhé,
      chỉ có lỗi ở hàm itoa thôi còn các vấn đề khác nói chung tốt, em vân chưa soạn xong toàn bộ nhưng lại gặp lỗi rồi. Có file đính kèm phía các anh giúp em với nhé em cảm ơn nhiều nhiều
      hic.. đúng là thua bạn luôn.. trong folder có 2 source l
      à main.c và main1.c
      trong main1.c thì có khai báo stdlib.h.
      trong main.c thì không

      trong project thì sử dụng source main.c... làm sao compile nó không lỗi cho được... và thêm 3 chỗ lcd_putsf()... mà như bạn enter88 đã nói nữa.

      may mà bạn post lên nguyên cái project folder chứ post cái source ko thì cũng thua.
      mình đã sửa lại và build ok. bạn load về chạy thử xem.
      chiet_rp.zip

      mà bạn ko cần viết hàm ghi và đọc eep như vậy đâu. nó ko dc tối ưu cho lắm

      Comment


      • #48
        Nguyên văn bởi enter88 Xem bài viết
        Bạn ơi ,mình thấy chỗ này chưa hiểu lắm :
        unsigned char chuoi[3];
        cái này khai báo trong SRAM phải ko?
        Và câu lệnh:
        lcd_putsf(chuoi);
        cái 'chuoi ' nay hình như khai báo trong flash thì phải?
        Em không rõ là thế nào là khai bao ở flash, em chỉ làm theo mẫu thôi các anh xem jup em nhé
        Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

        Comment


        • #49
          Bạn vào phần help của codevision có hướng dẫn khá cụ thể đó

          Comment


          • #50
            Nguyên văn bởi dt_love Xem bài viết
            hic.. đúng là thua bạn luôn.. trong folder có 2 source l
            à main.c và main1.c
            trong main1.c thì có khai báo stdlib.h.
            trong main.c thì không

            trong project thì sử dụng source main.c... làm sao compile nó không lỗi cho được... và thêm 3 chỗ lcd_putsf()... mà như bạn enter88 đã nói nữa.

            may mà bạn post lên nguyên cái project folder chứ post cái source ko thì cũng thua.
            mình đã sửa lại và build ok. bạn load về chạy thử xem.
            [ATTACH]17903[/ATTACH]

            mà bạn ko cần viết hàm ghi và đọc eep như vậy đâu. nó ko dc tối ưu cho lắm
            Đúng là chương trình của em còn rất nhiều chỗ cồng kềnh em đang sửa lại dần cho gọn và đỡ tốn bộ nhớ hơn.
            Việc ghi vào eeprom em cũng thử dùng cach khai báo
            eeprom unsigned char bien @0x01;
            nhưng sét cho cùng cũng dùng một chương trình con trong thư viện của Codevision nên khi dịch chắc cũng không gọn hơn.
            Em muốn dùng chương trình con để không phải viết lặp lại cho mỗi vòng while nhưng không biết khai báo biến vào chương trình con thế nào vì mỗi lần phải viết những dòng chữ khác nhau lên LCD nên đành phải viết cồng kềnh như vậy.
            Em thử lại chương trình của em chạy tốt rồi em cảm ơn các anh rất nhiều, em sẽ cố gắng học hỏi thêm nhiều hơn
            Ở đây chương trình của em để lập trình trên màn hình cài đặt thông số cho máy chiết ấy mà, đèn lightback em dùng chân D.7
            máy gồm một băng tải chay liên lục và 2 cảm biến cửa vào(PD.2) và cửa ra(PD.3) nếu số chai chạy vào đủ thì của vào(PC.5) đóng lại khi số chai chiết ra hêt thì cửa ra(PC.4) đóng lại. Khi cả cửa vào cửa ra đều đóng thì hạ vòi rồi chiết, đầy chai thì dừng nâng vòi sau mở cả cửa ra, cửa vào rồi quay lại từ đầu. Việc đếm chai vao ra dùng 2 ngăt ngoài(vì em không biết cách dùng counter).Bàn phím cài đặt có 4 nút SET, EXIT, UP, DOWN đùng để đặt số lượng chai mỗi lần chiết và thời jan chiết(chính là dung lượng chiết)thời jan chiết để chính sac em đặt bằng s, 0.1s và 0.01s. các phím đầu vào tích cực mức 0. Chương trình với các pro thì không là j nhưng với các bạn sinh viên có thể là một tham khảo em đưa lên mong các anh góp ý bàn luận về chương trình để được hoàn thiện hơn.
            Attached Files
            Last edited by Le Thi Bich; 28-08-2009, 11:16.
            Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

            Comment


            • #51
              Như bạn dt_love nói thì bạn xem source main .c đã khai báo stdlib.h chưa?

              Comment


              • #52
                Lại gặp vấn đề với chương trình này của em rồi các bác ơi!
                Khi nhấn nút Set lcd chỉ hiện mỗi số 255 ở đầu màn hình, vậy em sai ở đâu nhỉ
                Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                Comment


                • #53
                  Nguyên văn bởi Le Thi Bich Xem bài viết
                  Lại gặp vấn đề với chương trình này của em rồi các bác ơi!
                  Khi nhấn nút Set lcd chỉ hiện mỗi số 255 ở đầu màn hình, vậy em sai ở đâu nhỉ
                  Khiếp quá. Bạn Bích uỵch cả cái code lên đây làm giề. Bạn wan tâm đến phần nào thì post phần đóa lên thoai.

                  Vào đọc cái code của bạn thấy cóa cái này:

                  Code:
                  lcd_gotoxy(1,12);               // Dua con tro ve goc, dong 1, cot 12
                  
                          itoa(so,chuoi);             // Ham gan so vao chuoi de hien thi lên LCD)
                  
                          lcd_puts(chuoi);               // Hien thi so chai len LCD
                  Bạn thử đổi cái itoa thành sprintf xem dư lào. Ví dụ của nóa bạn xem thêm trong ví dụ THERMLCD project của CV xem sao.
                  AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                  Xem thêm tại Online Store ---> Click here
                  Mob: 0982.083.106

                  Comment


                  • #54
                    Nguyên văn bởi Le Thi Bich Xem bài viết
                    Lại gặp vấn đề với chương trình này của em rồi các bác ơi!
                    Khi nhấn nút Set lcd chỉ hiện mỗi số 255 ở đầu màn hình, vậy em sai ở đâu nhỉ
                    ngồi đọc cái ý tưởng của bạn với lại cái prog mà bạn viết.. có một số lỗi như sau:
                    việc quét phím của bạn hơi thô sơ, chưa kiểm tra chống nảy,kiểm tra khi phím nhả..

                    các biến s,0.1s,0.01s bạn nên cho vào một biến chứ ko nên tách ra mấy giá trị như vậy.

                    việc bạn quản lí địa chỉ lưu vào eep rom như vậy là giống như cách quản lí khi viết trên asm và rất dễ bị lỗi mà compile ko phát hiện ra được. cụ thể là trong prog của bạn đã mắc phải
                    Click image for larger version

Name:	untitled.JPG
Views:	1
Size:	29.6 KB
ID:	1339088
                    chỗ màu đỏ trong hình có lẽ là 0x04.

                    khi sử dụng CV thì giá trị ban đầu của eeprom là 0xff chứ ko phải là 0x00.

                    Comment


                    • #55
                      Nguyên văn bởi VNarmy Xem bài viết
                      Khiếp quá. Bạn Bích uỵch cả cái code lên đây làm giề. Bạn wan tâm đến phần nào thì post phần đóa lên thoai.

                      Vào đọc cái code của bạn thấy cóa cái này:

                      Code:
                      lcd_gotoxy(1,12);               // Dua con tro ve goc, dong 1, cot 12
                      
                              itoa(so,chuoi);             // Ham gan so vao chuoi de hien thi lên LCD)
                      
                              lcd_puts(chuoi);               // Hien thi so chai len LCD
                      Bạn thử đổi cái itoa thành sprintf xem dư lào. Ví dụ của nóa bạn xem thêm trong ví dụ THERMLCD project của CV xem sao.
                      em có thử đổi thành:
                      sprintf(so);
                      lcd_putsf(so);
                      và khai báo #include<stdio.h> nữa nhưng chương trình báo lõi
                      không biết sai từ đâu nên đưa cả lên để các anh xem giùm
                      @ dt_love:
                      Đúng là việc quét phím của em hơi thô sơ nhưng đọc thấy tín hiệu thì thực hiện lệnh tiếp theo không cần quan tâm phím còn tác động hay không và em cũng để một khoảng thời jan trễ sau mỗi vòng lặp lại nên không lo chống dội anh ạ, chỉ có tín hiệu vào 2 ngắt là cần quan tâm chống dội thì em đã thiết kế phần cứng chống dội rất tốt rồi.
                      Việc điều chỉnh thời jan bắt buộc phải điều chỉnh chính xác đến 0.01s nên phải chia ra thành từng phần s, 0.1s, 0.01s thì điều chỉnh mới nhanh được, giả sử đang chiết 122.23s chỉnh về 5.02s nếu chỉ để một biến 0.01s thì chỉnh rất mất thời jan.
                      Việc ghi đọc eeprom em đã sửa lại anh ạ nhưng vẫn không được
                      em biết mặc định là 0xff nên nó hiện giá trị 255 nên, nhưng đúng ra đầu tiên nó phải hiện chữ "CHUONG TRINH CAI DAT" ở dòng trên sau đó hiện chữ "So chai" ở dưới, cuối dòng dưới mới hiện 255.
                      Phần cứng em đã test từng tí một đều ok cả
                      Các anh xem và chỉ giáo cho em với nhé!!...
                      Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                      Comment


                      • #56
                        Nguyên văn bởi Le Thi Bich Xem bài viết
                        em có thử đổi thành:
                        sprintf(so);
                        lcd_putsf(so);
                        và khai báo #include<stdio.h> nữa nhưng chương trình báo lõi
                        không biết sai từ đâu nên đưa cả lên để các anh xem giùm
                        @ dt_love:
                        Đúng là việc quét phím của em hơi thô sơ nhưng đọc thấy tín hiệu thì thực hiện lệnh tiếp theo không cần quan tâm phím còn tác động hay không và em cũng để một khoảng thời jan trễ sau mỗi vòng lặp lại nên không lo chống dội anh ạ, chỉ có tín hiệu vào 2 ngắt là cần quan tâm chống dội thì em đã thiết kế phần cứng chống dội rất tốt rồi.
                        Việc điều chỉnh thời jan bắt buộc phải điều chỉnh chính xác đến 0.01s nên phải chia ra thành từng phần s, 0.1s, 0.01s thì điều chỉnh mới nhanh được, giả sử đang chiết 122.23s chỉnh về 5.02s nếu chỉ để một biến 0.01s thì chỉnh rất mất thời jan.
                        Việc ghi đọc eeprom em đã sửa lại anh ạ nhưng vẫn không được
                        em biết mặc định là 0xff nên nó hiện giá trị 255 nên, nhưng đúng ra đầu tiên nó phải hiện chữ "CHUONG TRINH CAI DAT" ở dòng trên sau đó hiện chữ "So chai" ở dưới, cuối dòng dưới mới hiện 255.
                        Phần cứng em đã test từng tí một đều ok cả
                        Các anh xem và chỉ giáo cho em với nhé!!...
                        bạn dùng một biến mà vẫn có thế điều chỉnh từng con số trong biến đó. thay đổi phần mềm tí thôi mà. thay vì +1 thì +10,+100 sau mỗi lần nhấn nút set.
                        ko biết bạn ghi đọc eep thế nào, nhưng mấy lệnh
                        lcd_gotoxy().. hình như bị sai rồi.

                        Comment


                        • #57
                          Nguyên văn bởi Le Thi Bich Xem bài viết
                          ...nhưng đúng ra đầu tiên nó phải hiện chữ "CHUONG TRINH CAI DAT" ở dòng trên sau đó hiện chữ "So chai" ở dưới, cuối dòng dưới mới hiện 255...
                          Các anh xem và chỉ giáo cho em với nhé!!...
                          Mình tò mò nên có đọc qua code của bạn.
                          Nhận xét chung là chương trình của bạn viết tương đối lộn xộn (Nói thật đừng tự ái nhé). Chính vì thế debug sẽ bất tiện, kể cả với bạn chứ chưa kể đối với người khác. Sau này bạn nên sửa. Vấn đề thứ 2 là bạn chưa tìm hiểu kĩ về C và và cũng chưa tìm hiểu kĩ về Codevision.

                          Bạn đọc kĩ phần sau nhé:
                          Trong C người ta phân biệt mảng và xâu kí tự. Xâu kết thúc bởi kí tự '\0', còn mảng thì tự do. Có thể nó giải thích một phần cho việc hiển thị không như ý muốn của bạn. Bạn khai báo 3 byte cho biến có tên là chuoi. Và bạn dùng hàm itoa để chuyển một giá trị nguyên thành xâu. Như vậy, nếu giá trị nguyên là 255 thì chuoi sẽ phải chiếm đến 4 kí tự là '2', '5', '5' và '\0'. Như vậy, kí tự '\0' sẽ nằm ở vùng nhớ ngay sau 3 kí tự được khai báo, và nó có thể đè lên một biến khác hoặc một hằng nào đó trên RAM. Và đương nhiên đây là lỗi nghiêm trọng trong lập trình, nó thậm chí có thể ngay lập tức làm sập chương trình. Tóm lại, bạn nên phân phối 4 byte cho biến chuoi.

                          Một lỗi nữa, đoạn tính toán này có thể nảy sinh một vấn đề về tràn số:
                          so=EEPROM_doc(0x02)*1000+EEPROM_doc(0x03)*100+EEPR OM_doc(0x0)*10;

                          Cái biến so bạn chỉ cấp cho nó 16 bit (kiểu int). Như vậy có có giá trị lớn nhất là 65535 (nếu là unsigned). Và nếu xem lại công thức trên thì nếu cái giá trị lưu trong EEPROM mà lớn hơn 65 thì so sẽ không được tính đúng. Mặc dù khi tính vế phải, trình dịch có thể chuyển sang kiểu long (32 bit) để tính đúng, nhưng kết quả của phép gán cho vế trái lại không đúng. Tóm lại, nếu tính toán kiểu này thì nên khai báo biến so kiểu long.

                          Tiếp theo, :, Trong Codevision có sẵn thủ tục ghi EEPROM nên bạn không cần viết lại hàm này. Bạn cứ khai báo biến, đọc ghi như bình thường, như thế sẽ nhàn hơn.

                          Còn nữa, mình không đọc kĩ lắm ý tưởng của bạn nhưng mà cũng không hiểu lắm tại sao bạn chỉ kiểm tra người ta nhấn nút SET duy nhất 1 lần (!!!) vào lúc bắt đầu chương trình.

                          Hi vọng những thông tin trên giúp được bạn. Have Fun!

                          Comment


                          • #58
                            Nguyên văn bởi Le Thi Bich Xem bài viết
                            em có thử đổi thành:
                            sprintf(so);
                            lcd_putsf(so);
                            và khai báo #include<stdio.h> nữa nhưng chương trình báo lõi
                            không biết sai từ đâu nên đưa cả lên để các anh xem giùm
                            Nói chung mình rất thất vọng với bạn. Cái nào bạn ko biết thì phải tra help, xem ví dụ chứ. Hàm sprintf mà bạn dùng như kia thì bảo sao nó chả lỗi.
                            AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                            Xem thêm tại Online Store ---> Click here
                            Mob: 0982.083.106

                            Comment


                            • #59
                              Em đã sửa được rồi các anh ạ, anh dt_love cũng hướng dẫn em. Vấn đề mấu chốt là em dùng sai lệnh lcd_gotoxy thôi, em đặt sai hàng thành cột. Tuy ctr đã chạy như ý tưởg ban đầu nhưng còn nhiều vấn đề em phải cải tiến cho gọn hơn như các anh đã hướng dẫn góp ý. Mong các anh sẽ giúp đỡ em để ctr hoàn thiện hơn. Em cảm ơn các anh rất nhiều
                              Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

                              Comment


                              • #60
                                Nguyên văn bởi nbb3i Xem bài viết
                                Đây là 2 cái hàm mình viết thêm vào thư viện của LCD tùy bạn dùng theo yêu cầu của số:
                                Code:
                                void lcd_number2(int32 number)//HIEN THI SO TU NHIEN 32 BIT RA MAN HINH LCD
                                {
                                int8 i;
                                int32 temp,exp10;
                                unsigned char a[10];
                                
                                temp=number;
                                exp10=1000000000;
                                for (i=9;i>=2;i--)
                                    { 
                                    a[i]=temp/exp10;
                                    temp=temp%exp10;
                                    exp10=exp10/10;
                                    }
                                a[1]=temp/10;
                                a[0]=temp%10;
                                
                                for (i=9;i>=1;i--)
                                {
                                    if (a[i]>0)
                                    {
                                    lcd_putc(a[i]+48);
                                    delay_us(10);
                                    }
                                }
                                lcd_putc(a[0]+48);
                                delay_us(10);
                                
                                }
                                
                                void lcd_number(int32 so)//HIEN THI SO CO 3 CHU SO RA MAN HINH LCD
                                  {int t;
                                  unsigned char a[3];
                                  //setLCD();
                                
                                  a[2]=so%10;
                                  so=so/10;
                                  a[1]=so%10;
                                  a[0]=so/10;
                                  for(t=0;t<3;t++)
                                     {
                                     lcd_putc(a[t]+48);delay_us(10);
                                     }
                                  }
                                Hàm lcd_number nên dùng để hiển thị số <999 định dạng của nó sẽ là xxx . VD: lcd_number(1) sẽ hiện trên LCD là: 001
                                Hàm lcd_number2 dùng hiện số 32 bit đầy đủ các số 0 đằng trước sẽ không được in ra trên màn hình. VD: lcd_number2(12453) thì sẽ hiện ra LCD là: 12453, lcd_number2(1) sẽ hiện trên LCD là 1
                                à, nếu có thể thì bạn viết bằng ASM chút được không?, hàm lcd_putc() ở đây là gì vậy?. Mình mới đọc chút về LCD và ASM, mong các bạn giúp, mình cũng đang cần làm bài dạng như vậy
                                ---$---$---$---$---$---$---$---
                                T*D*T*T

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X