Thông báo

Collapse
No announcement yet.

bật tắt đèn dùng atmega8

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

  • bật tắt đèn dùng atmega8

    Chào các bác trong dd!
    Em đang định làm 1 công tắc bật tắt đèn bằng 1 nút bấm dùng atmega mà ko biết viết code như thế nào,E là dân điện đang mò mẫm vào vdk mong các bác tận tình giúp đỡ!
    E cám ơn trước ạ!

  • #2
    Hướng dẫn - [Phần 2] Lập trình cổng vào ra (IO) | Cộng đồng cơ điện tử Việt Nam | Mechatronics
    Email:
    Đau đầu vì điện tử

    Comment


    • #3
      Thanks bác lowpass! Bài IO e cũng đọc qua rồi, nhưng khi viết code rồi nạp vào thì bấm nút đèn nó sáng, buông ra là nó tắt, e dùng CodeVisionAVR. E muốn nó như 1 công tắc nhấn nhả ý, bấm 1 phát đèn sáng, bấm tiếp đèn tắt, có thể cho 1 cổng hoạc cả POTD luôn cũng đc.
      Bác viết cho e xin 1 đoạn code làm ví dụ thì tốt quá!
      Thanks bác!

      Comment


      • #4
        cảm ơn thì có nút cảm ơn rùi đó bạn.mình viết luôn đây cho bạn
        DDRB=0x00;
        PORTB=0x00;
        DDRD=0xff;
        PORTD=0x00;
        void main()
        {
        while(1)
        {
        if(PINB.0==1){PORTD.0~PORTD.0;}
        }
        }
        đay là cơ bản bạn copy vào là ok.
        hãy làm theo cách của bạn!

        Comment


        • #5
          Nguyên văn bởi tjeunjnzah Xem bài viết
          cảm ơn thì có nút cảm ơn rùi đó bạn.mình viết luôn đây cho bạn DDRB=0x00; PORTB=0x00; DDRD=0xff; PORTD=0x00; void main() { while(1) { if(PINB.0==1){PORTD.0~PORTD.0;} } } đay là cơ bản bạn copy vào là ok.
          Lâu k dùng AVR nhưng theo mình nhớ thì code trên thiếu dấu = ở phép gán PORTD. Các cài đặt cho cổng thì bạn phải cho vào main và trước vòng while mới đúng.

          Vote hộ tớ với. Thanks!

          Comment


          • #6
            Bạn viết thêm lời giải thích vào mỗi dòng code cho người mới học đc không? Vd DDRB=0X00// cấu hình portB làm input DDRD=0xFF// PORDD làm output, PORDB=0X00// portb =0b0000000; PORDD=0XFF// kích họat điện trở treo tại portD, bình thờng portD=1 , PORD .... if(PINB.0==1)//nếu nút đượC nhấn...? Phải có delay chống rung phím...? PORD.0=~PORD.0// PORD.0 đảO trạng thái ?
            Haiz! Viết bằng đtdd mệt quá....
            Last edited by lowpass; 07-12-2013, 03:36.
            Email:
            Đau đầu vì điện tử

            Comment


            • #7
              ok!tại mình vội đi làm nên viết nhanh như vậy mình đã có dòng chữ là cơ bản mà bây giờ mình viêt lại cho đủ!
              void main(void)
              {
              DDRB=0X00;//cấu hình portb là đầu vào
              PORTB=0x00;//không sử dụng điện trở treo(pullup)
              DDRD=0xFF;//cấu hình portd là đầu ra
              PORTD=0x00;//không sử dụng điện trở treo(pullup)
              while(1)//vòng lặp vô hạn
              {
              if (PINB.0==1)//kiểm tra phím bấm
              while (PINB.0==1)//trờ phím bấm được nhả thì thực hiện lệnh chống rung phím
              PORTD.0=~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
              }
              }
              hãy làm theo cách của bạn!

              Comment


              • #8
                ok!tại mình vội đi làm nên viết nhanh như vậy mình đã có dòng chữ là cơ bản mà bây giờ mình viêt lại cho đủ!
                void main(void)
                {
                DDRB=0X00;//cấu hình portb là đầu vào
                PORTB=0x00;//không sử dụng điện trở treo(pullup)
                DDRD=0xFF;//cấu hình portd là đầu ra
                PORTD=0x00;//không sử dụng điện trở treo(pullup)
                while(1)//vòng lặp vô hạn
                {
                if (PINB.0==1)//kiểm tra phím bấm
                while (PINB.0==1)//trờ phím bấm được nhả thì thực hiện lệnh chống rung phím
                PORTD.0=~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
                }
                }
                hãy làm theo cách của bạn!

                Comment


                • #9
                  Mạch này đơn giản đâu cần đến vi điều khiển làm gì cho phức tap ?
                  Linh Kiện ĐIỆN TỬ 4U
                  - Website: www.dientu4u.com
                  - Đ/c: 59, Ngõ 120, Trần Cung, B.Từ Liêm, Hà Nội

                  Comment


                  • #10
                    Nguyên văn bởi tjeunjnzah Xem bài viết
                    ok!tại mình vội đi làm nên viết nhanh như vậy mình đã có dòng chữ là cơ bản mà bây giờ mình viêt lại cho đủ!
                    void main(void)
                    {
                    DDRB=0X00;//cấu hình portb là đầu vào
                    PORTB=0x00;//không sử dụng điện trở treo(pullup)
                    DDRD=0xFF;//cấu hình portd là đầu ra
                    PORTD=0x00;//không sử dụng điện trở treo(pullup)
                    while(1)//vòng lặp vô hạn
                    {
                    if (PINB.0==1)//kiểm tra phím bấm
                    while (PINB.0==1)//trờ phím bấm được nhả thì thực hiện lệnh chống rung phím
                    PORTD.0=~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
                    }
                    }
                    Code này cũng chưa chạy được. Giải thuật sai và thiếu ";" ngay tại vòng while chờ thả phím nhấn. Mình sửa lại như sau:

                    void main(void)
                    {
                    DDRB=0X00;//cấu hình portb là đầu vào
                    PORTB=0x00;//không sử dụng điện trở treo(pullup)
                    DDRD=0xFF;//cấu hình portd là đầu ra
                    PORTD=0x00;//không sử dụng điện trở treo(pullup)
                    while(1)//vòng lặp vô hạn
                    {
                    if (PINB.0)//kiểm tra phím bấm
                    {
                    delay_ms(20);//Chống rung phím khi nhấn.

                    while (PINB.0);//Chống rung phím khi thả.
                    PORTD.0 = ~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
                    }
                    }
                    }
                    Last edited by OpenDoor; 07-12-2013, 09:47.

                    Comment


                    • #11
                      Nguyên văn bởi OpenDoor Xem bài viết
                      Code này cũng chưa chạy được. Giải thuật sai và thiếu ";" ngay tại vòng while chờ thả phím nhấn. Mình sửa lại như sau:

                      void main(void)
                      {
                      DDRB=0X00;//cấu hình portb là đầu vào
                      PORTB=0x00;//không sử dụng điện trở treo(pullup)
                      DDRD=0xFF;//cấu hình portd là đầu ra
                      PORTD=0x00;//không sử dụng điện trở treo(pullup)
                      while(1)//vòng lặp vô hạn
                      {
                      if (PINB.0)//kiểm tra phím bấm
                      {
                      delay_ms(20);//Chống rung phím khi nhấn.

                      while (PINB.0);//Chống rung phím khi thả.
                      PORTD.0 = ~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
                      }
                      }
                      }
                      sai chỗ nào vậy bác.thấy bác sửa mỗi chỗ delay thui mà lại sai thiếu dấu 1 dấu ; với giải thuật như này e đã ứng dụng vào mạch thật chạy ầm ầm.không cần phải thêm phần delay vào làm gì.e vứt mạch trong khu vực công nghiệp nhìu nhiễu mà vẫn chạy ok!mỗi người có cách viết riêng xử lý riêng không ai giống ai bác à!
                      Last edited by tjeunjnzah; 07-12-2013, 17:22.
                      hãy làm theo cách của bạn!

                      Comment


                      • #12
                        Nguyên văn bởi tjeunjnzah Xem bài viết
                        ok!tại mình vội đi làm nên viết nhanh như vậy mình đã có dòng chữ là cơ bản mà bây giờ mình viêt lại cho đủ!
                        void main(void)
                        {
                        DDRB=0X00;//cấu hình portb là đầu vào
                        PORTB=0x00;//không sử dụng điện trở treo(pullup)
                        DDRD=0xFF;//cấu hình portd là đầu ra
                        PORTD=0x00;//không sử dụng điện trở treo(pullup)
                        while(1)//vòng lặp vô hạn
                        {
                        if (PINB.0==1)//kiểm tra phím bấm
                        while (PINB.0==1)//trờ phím bấm được nhả thì thực hiện lệnh chống rung phím
                        PORTD.0=~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
                        }
                        }
                        Với code này của bạn, khi nhấn nút PINB.0 thì PORTD.0 sẽ thay đổi trạng thái liên tục, lúc thả nút PINB.0 ra thì trạng thái PORTD.0 là ngẫu nhiên, ko xác định. Chương trình delay tôi viết thêm để code chống rung phím tốt hơn thôi.
                        Tôi hiểu ý đồ giải thuật của bạn nhưng khi viết code bạn đã ko thể hiện được đúng ý đồ.
                        Last edited by OpenDoor; 07-12-2013, 18:30.

                        Comment


                        • #13
                          bác có nhầm không nhỉ.giả sử nút được bấm thì lệnh if là đúng thực hiện lệnh trong if nhưng khi đến hàm while mcu sẽ dừng lại ở hàm while nếu nút chưa được nhả ra nên không thể có hiện tượng PORTD thay đổi trạng thái liên tục được chỉ khi phím bấm được nhả thì mcd mới sử lý đến lệnh đảo bít ở PORTD thôi nên mỗi lần ấn chỉ thực hiện 1 lần đảo!nếu bác ấn và giữ phím thì thì lệnh đảo bít sẽ không được thực hiện đâu!bác test hộ e cái máy e đang bị virus nên không test được cho bác xem!
                          hãy làm theo cách của bạn!

                          Comment


                          • #14
                            Nguyên văn bởi OpenDoor Xem bài viết
                            Code này cũng chưa chạy được. Giải thuật sai và thiếu ";" ngay tại vòng while chờ thả phím nhấn. Mình sửa lại như sau:

                            void main(void)
                            {
                            DDRB=0X00;//cấu hình portb là đầu vào
                            PORTB=0x00;//không sử dụng điện trở treo(pullup)
                            DDRD=0xFF;//cấu hình portd là đầu ra
                            PORTD=0x00;//không sử dụng điện trở treo(pullup)
                            while(1)//vòng lặp vô hạn
                            {
                            if (PINB.0)//kiểm tra phím bấm
                            {
                            delay_ms(20);//Chống rung phím khi nhấn.

                            while (PINB.0);//Chống rung phím khi thả.
                            PORTD.0 = ~PORTD.0;//ban đầu PORTB.0=0 thì khi gặp lệnh này PORTB.0 được đảo lên 1 tức là PORTB=1 nếu =1 thì đảo về 0
                            }
                            }
                            }
                            Cho mình hỏi sau while(PINB.0) lại có dấu '';' và lệnh PORTD.0=~PORTD.0 vậy? Nếu đã có 2 lệnh đó thì phải đặt cả 2 khối lệnh này trong dấu ngoặc {} chứ nhỉ?
                            Email:
                            Đau đầu vì điện tử

                            Comment


                            • #15
                              bạn đọc lại ngôn ngữ c sẽ hiểu nhé.mình đang cài lại máy nên không làm gì được đợi mày cài xong mình sẽ post bản thử nghiệm giữ code mình viết và code của bác OpenDoor
                              hãy làm theo cách của bạn!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X