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

                    • since0501
                      Trả lời cho Pin Li-FePO4 (pin sắt) rất dể hỏng! Các biện pháp ngăn ngừa.
                      bởi since0501
                      Mình đào mộ xíu, cho mình hỏi là pin của bác vẫn ok chứ? Mình vừa đóng khối pin 16 cell 40135 thì khi chạy điện áp nó sụt so với khi nghỉ như video mình dẫn link, vậy cho mình hỏi là dung lượng pin sẽ tính khi áp nghỉ hay áp đang hoạt động, và pin sụt áp như vậy là bình thường hay pin kém?
                      ht...
                      hôm nay, 17:56
                    • mèomướp
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi mèomướp
                      Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                      Hôm qua, 13:11
                    • tuyennhan
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi tuyennhan
                      Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                      Hôm qua, 09:25
                    • tuyennhan
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi tuyennhan
                      Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                      Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                      Hôm qua, 09:10
                    • Ng.Phuong.5
                      Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                      bởi Ng.Phuong.5
                      Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                      Mấy con...
                      09-01-2025, 19:44
                    • viettinh
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi viettinh
                      Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                      Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                      09-01-2025, 18:12
                    • nguyendinhvan
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi nguyendinhvan
                      Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                      Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                      Cách đơn giản...
                      09-01-2025, 00:04
                    • mèomướp
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi mèomướp
                      Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                      08-01-2025, 19:02
                    • tuyennhan
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi tuyennhan
                      Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                      08-01-2025, 15:43
                    • tuyennhan
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi tuyennhan
                      Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                      08-01-2025, 15:28
                    Đang tải...
                    X