Thông báo

Collapse
No announcement yet.

Thắc mắc các kiểu biến trong lập trình cho AVR

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

  • Thắc mắc các kiểu biến trong lập trình cho AVR

    chào mọi người, mình làm về 8051 thì nhiều nhưng làm về AVR thì ít, dạo này gần đây có gặp 1 số vấn đề về kiểu biến, mong mọi người giúp đỡ, có thể có những câu hỏi hơi gà mờ
    1. Mình làm cái I2C giao tiếp DS1307, sử dụng thư viện có sẵn của avr, trong các phím sét giờ có 3 phím SET Up Down, cái này chắc mọi người làm rồi cũng biết, nhưng vấn đề là giả sử phút đang là 3 mình muốn chuyển nó về 59, thì theo như lập trình sẽ là ấn Down cho giảm về 00 sau đó ấn tiếp nó sẽ nhảy sang 59, nhưng ko rõ do nguyên nhân gì mà nó ko thể sang 59 mà cứ chết ở 00 và mình đã chú ý từng dòng lệnh khi nó bien dịch file hex, biến min(phút) mình khai báo kiểu char(-127 to 127) khi biên dịch đoạn code là if(min<0) min=59; thì nó đưa ra cảnh báo, cái này là tại sao nhỉ, mình thay if(min==-1) min=59; vẫn đưa ra cảnh báo nằm ngoài rải giá trị kiểu biến char ,mặc dù giá trị biến nằm trong rải biến. và cũng chính vì cái cảnh báo này mà khi mình ấn down nó cứ chết ở 00. Mình đã khắc phục = cách dùng 1 biến trung gian dạng int để chuyển biến min sang thì được. Nhưng hi vọng mọi người giải thích giùm vấn đề này. Mình làm ở 8051 ko hề có lỗi này
    2. Mình có làm cái lưu 1 giá trị bất kỳ vào eeprom ngoài, cụ thể là giờ báo thức sẽ đc ghi vào eeprom, giả sử mình ghi là cứ phút 15 thì chuông báo thức kêu, cái này chạy ngon, nhưng hễ ghi 0 phút là trên cái màn hình LCD khi mà nó đang 59 chuẩn bị nhảy nên 00 để đổi giờ khác thì nó cứ chết 59 tại chỗ
    3. Ai có hàm giao tiếp I2C cho DS1307 sử dụng thư viện tự viết cho AVR có thể post cho mình xem được ko? tại chưa hiểu hết cái thanh ghi DDR, chỉ biết 1 là làm output và 0 là input, nhưng mà có lần mình sét DDR=0xff mà có cái button lắp trên 1 chân của Port đó nó vẫn đọc được trạng thái, mình nghĩ chỉ =0 nó mới đọc được chứ
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

  • #2
    Giá trị đọc ra từ ds1307 là kiểu bcd, bạn muốn tăng hay giảm thì nên chuyển về số hex, sau khi điều chỉnh xong ta chuyển dữ liệu cập nhật trở lại kiểu bcd và ghi vào ds1307.

    Thân.

    Comment


    • #3
      có lẽ bạn ko đọc kỹ, và bên cạnh đó về cái giá trị BCD đọc từ DS ra cái này mình làm vs 8051 nhiều rồi nên mình hiểu, vấn đề là nó bị lỗi vs cái hàm ghi và đọc trong thư viện có sẵn của con AVR, cụ thể là của Codevision, mình tính chuyển hết sang int nhưng do cái hàm ghi và đọc trong thư viện của nó dùng kiểu char, khai báo int nó sẽ báo Error là ko thể convert dc từ int sang char, 8051 thì ko bị lỗi này và mình thấy nó đúng hơn do char là 1 kiểu con của int, nếu giá trị nằm trong vùng thỏa mãn cả 2 kiểu biến vẫn oke
      Website chính thức đổi địa chỉ website thành
      Mời các bạn ghé thăm !!!

      Comment


      • #4
        Theo mình trong AVR tốt nhất không sử dụng số âm

        Comment


        • #5
          xảy ra điều này vì điều kiện trong câu lệnh if() không diễn ra. Bạn xem lại toàn bộ chương trình xem thế nào nhé. Có lẽ ở chỗ nào đó biến min có giá trị nhỏ nhất là 00
          Rễ của sự học tập thì đắng
          Quả của sự học tập thì ngọt

          Comment


          • #6
            Bạn dùng trình biên dịch codevision phải không?
            nếu phải thì :
            unsigned char rtc_read(unsigned char address);
            void rtc_write(unsigned char address,unsigned char data);
            void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out);
            void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec);
            void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec);
            void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year);
            void rtc_set_date(unsigned char date,unsigned char month,unsigned char year);
            đây là các hàm trong thư viện DS1307 biến min họ khai báo kiểu unsigned char chứ không phải kiểu char...
            bạn đổi khai báo của mình lại thành unsigned char ....

            void status_button(void)//ham kiem tra phim bam
            {if(up&&down&&set&&sb==1) //chua co phim nao duoc nhan
            {
            sb=0;
            }

            }
            if(up==0&&sb==0)
            {
            if(min==59) min=0;
            else min++;
            }

            Comment


            • #7
              Đúng roài, khi xử lý các biến liên quan đến RTC thì là unsigned char chứ không phải char. Nếu thắc mắc bạn post cả code lên, chắc chắn mình sẽ giúp được bạn

              Comment


              • #8
                bác hohoanganhfu nói đúng rùi, mình ko để ý thư viện của nó là unsigned char, lúc kích vào cái header của của ds1307 mới thấy. còn vs 8051 ko bị lỗi vì thư viện là toàn do mình tự viết chứ ko có sẵn, và mình toàn viết khai báo char thay vì unsigned char như hàm có sẵn
                còn việc bác viết đoạn code kia là UP chứ ko phải Down, lỗi của mình là ấn down về 00, ấn tiếp ko lên 59 thôi. như đã nói ở đầu câu hỏi, mình dùng biến trung gian chuyển giá trị của nó sang dạng int, sau đó mới thực hiện lệnh, thực hiện xong mình gán lại cho nó là oke vì khi chỉnh giờ hay phút thì nếu ấn qua 00 nó sẽ về -1 mà -1 ko thuộc kiểu unsigned char, do đó mình mới chuyển biến trung gian
                có ai có cách khác ko nhỉ???
                Website chính thức đổi địa chỉ website thành
                Mời các bạn ghé thăm !!!

                Comment


                • #9
                  Tốt nhất là đừng cho nó về -1, cách này thấy không hiệu quả , và chuyể sang kiểu int tốn RAM (int 2byte)
                  Đây là cách của mình.......

                  đối với down bạn viết ngươc lại thôi...chú ý hàm status_button hàm này để khi bạn nhấn phím thì giá trị min chỉ tăng lên 1.
                  void status_button(void)//ham kiem tra phim bam
                  {if(up&&down&&set&&sb==1) //chua co phim nao duoc nhan
                  {
                  sb=0;
                  }

                  }
                  if(down==0&&sb==0)
                  {
                  if(min==0) min=59;
                  else min--;
                  sb=1;///khi thưc hiệc xong set sb về 1 sẽ làm if(down==0&&sb==0) ở trên sai và biến min không giản đi nữa.
                  }
                  Bạn chú ý hàm ở trên kiểm tra bằng 0 trước mới giảm giá trị sau. VD: khi min=1 nhấn down sẽ về 0,(thực hiện else min--
                  khi min=0 nhấn down
                  thì nó bằng min=59 chứ không giảm giá trị min(thưc hiên if(min==0) min=59
                  chúc thành công!!!

                  Comment


                  • #10
                    oke men, kiểu này k cần sét biết trung gian, nhưng sẽ phải kiểm tra đk trước khi Down, mình thì toàn Down rồi mới kt đk. tks
                    Website chính thức đổi địa chỉ website thành
                    Mời các bạn ghé thăm !!!

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X