Thông báo

Collapse
No announcement yet.

Em mới học AVR đang bị mắc 1 chút.

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

  • Em mới học AVR đang bị mắc 1 chút.

    Em có 1 bài toán thế này. dùng PA.0 làm nút ấn. PB0,PB1,PB2,PB3 là đầu ra. yêu cầu như sau:
    Ấn nút lần 1. PB0=1 ( delay 20ms rồi lại tắt )
    Ấn nút lần 2. PB1=1 ( delay 20ms rồi lại tắt )
    Ấn nút lần 3. PB2=1 ( delay 20ms rồi lại tắt )
    Ấn nút lần 4. PB3=1 ( delay 20ms rồi lại tắt )
    cứ thế thôi. em làm mãi ko đc ( làm trên code vision). bác nào giúp em với. em cảm ơn !
    Last edited by plugionhikop; 28-06-2011, 12:09.

  • #2
    bạn phải khai báo PA.0 là PINA.0 chứ không phải là PORTA.0.
    Never forget who you are!

    Comment


    • #3
      có liên quan đến intterrupt đó, bạn tìm hiểu thử xem. Khi gặp vấn đề về lỗi code hay mô phỏng thì có thể hỏi thêm!!!

      Comment


      • #4
        while (1)
        {
        if(PINA.0==1)
        {i++;
        if (i==5)i=1;
        delay_ms(30);
        if (i==1)
        {PORTC.0=1;};
        delay_ms(30);
        if (i==2)
        {PORTC.1=1;};
        delay_ms(30);
        if (i==3)
        {PORTC.2=1;};
        delay_ms(30);
        if (i==4)
        {PORTC.3=1;};
        delay_ms(30);
        }





        };
        }

        bài của em đây ạ.các bác gỡ hộ em với

        Comment


        • #5
          Nguyên văn bởi plugionhikop Xem bài viết
          while (1)
          {
          if(PINA.0==1)
          {i++;
          if (i==5)i=1;
          delay_ms(30);
          if (i==1)
          {PORTC.0=1;};
          delay_ms(30);
          if (i==2)
          {PORTC.1=1;};
          delay_ms(30);
          if (i==3)
          {PORTC.2=1;};
          delay_ms(30);
          if (i==4)
          {PORTC.3=1;};
          delay_ms(30);
          }
          };
          }

          bài của em đây ạ.các bác gỡ hộ em với
          Code của bạn chưa thể sử dụng được vì nó sẽ ko cho phép bạn kiểm tra trạng thái bấm.
          Nếu muốn viết code nhận phím phải viết dưới dạng sau:
          B1: Kiểm tra có bấm phím;
          B2: Nếu có bấm phím thì đợi cho tới khi nhả phím;
          B3: Nếu nhả phím thì thực hiện lệnh
          Code:
          if (PINA.0 == 1)
          {
              while(PINA.0 == 0);
              i++;
          }
          Ngoài ra bạn có thể tham khảo thêm một số code khác liên quan tới vấn đề chống rung phím bấm có rất nhiều trên diễn đàn.
          Góp ý một chút: chắc bạn mới học C, phần câu lệnh "if" phía sau nên dùng cấu trúc Switch ... case cho gọn hơn.
          Chúc bạn nhanh chóng làm quen với AVR.

          Comment


          • #6
            Nói thật em làm về ô tô. em đang phải làm cái mô hình bộ chia điện. do có biết tí tì ti về avr nên em muốn làm = điện cho đơn giản hơn co khí. chỉ có 1 nút bấm là co tín hiệu từ cảm biến bộ chi điện chỉ có 1 đầu ra và chia điện cho 4 buji nên phải chia lần lượt. 1 2 3 4. bác nào chỉ rõ hộ em hơn nữa với. em ko rành lắm.

            Comment


            • #7
              bạn đưa luôn cả mạch cảu bạn lên, mọi người xem hộ xem có đúng không nưa, chứ thấy bạn nói như trên mình ngi ngờ bạn vẽ mạch cũng có chỗ sai đó

              Comment


              • #8
                Dạ em chưa vẽ mạch. mạch em thấy đơn giản nên ko cần đâu ạ. chỉ cần code ok. chạy giả lập trên protus ok là xong thôi ạ.

                Comment


                • #9
                  Của bạn đây.
                  http://www.mediafire.com/?5s3d7fat17v5hgb
                  Vào file đk led phần nhấn phím.
                  Ko biết đã đúng theo yêu cầu của bạn chưa.
                  Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
                  http://diencongnghiep360.com/
                  http://tudienhathe.vn/

                  Comment


                  • #10
                    while (1)

                    {
                    if(PINA.0==1)
                    {
                    while(PINA.0==0); //Doi nha phim
                    {
                    i++;
                    if (i==5)i=1;

                    if (i==1)
                    {
                    PORTC.0=1;
                    delay_ms(30);
                    PORTC.0=0 ;
                    }
                    if (i==2)
                    {
                    PORTC.1=1;
                    delay_ms(30);
                    PORTC.1=0;
                    }
                    if (i==3)
                    {
                    PORTC.2=1;
                    delay_ms(30);
                    PORTC.2=0;
                    }
                    if (i==4)
                    {
                    PORTC.3=1;
                    delay_ms(30);
                    PORTC.3=0;
                    }
                    }
                    };
                    }
                    }
                    Em thấy chương trình này ko có vấn đề gì nhưng sao giả lập ko chạy đc. hjx . vẫn chưa đc các anh ạ. các đèn từ PC0 đến PC3 sáng lần lượt mà ko cần tác động vào PA0. yêu cầu là
                    ấn PA0 lần 1 -> PC0 sáng
                    ấn PA0 lần 2 -> PC1 sáng
                    ấn PA0 lần 3 -> PC2 sáng
                    ấn PA0 lần 4 -> PC3 sáng
                    Em thấy vấn đề là sau lần ấn phím thứ nhất. PA0==0 luôn ( do nhả phím ) vì vậy vòng lặp thực hiện liên tục
                    Last edited by plugionhikop; 28-06-2011, 17:48.

                    Comment


                    • #11
                      Bạn có thể nói rõ hơn cho mình ko?

                      Comment


                      • #12
                        Cái nút nhấn bạn mắc như cái nút reset cho MCU .Nghĩa là phím nhấn thì giá trị là 0.ngược lại là 1.
                        khai báo hàm con như sau :
                        void setValue(char i)
                        {
                        PORTC |=1<<i ; //dịch trái bit
                        delay_ms(30);
                        PORTC &=~(1<<i); //xóa bit

                        }

                        hàm chính như sau :

                        void main()
                        {
                        char i =-1;
                        DDRA &=0xFE ; //chan 0 la input
                        PORTA =0x00;

                        DDRC =0xFF;
                        PORTC =0;

                        while(1)
                        {
                        if(!PINA.0) //phim nhan
                        {
                        while(!PINA.0) ; //doi tha phim
                        if(++i>3) i=0;
                        setValue(i);

                        }

                        }

                        }

                        Comment


                        • #13
                          To salinh,

                          Chương trình của bạn đúng nhưng tôi xin có một số góp ý để nó tốt hơn nữa:
                          - Bạn nên thêm các dòng #define vào để chương trình dễ hiểu hơn: ví dụ:
                          #define BAM_PHIM_PA0 !PINA.0
                          Trong chuong trinh ban viet; if(BAM_PHIM_PA0){...} thi nguoi doc rat de hieu
                          - Phần kiểm tra phím bấm bạn phải thêm chống rung vào nếu không rất có thể chỉ một lần bấm nó sẽ làm hết mấy việc luôn. Theo tôi cách an toàn hơn là bạn sử dụng cấu trúc switch...case bên trong vòng lặp kiểm tra phím bấm (vẫn phải chống rung). Mỗi task điều khiển đầu ra được gán một mã riêng, chỉ làm xong việc này mới chuyển sang việc kia.

                          Thân,
                          For a better world

                          Comment


                          • #14
                            Nguyên văn bởi plugionhikop Xem bài viết
                            while (1)

                            {
                            if(PINA.0==1)
                            {
                            while(PINA.0==0); //Doi nha phim
                            {
                            i++;
                            if (i==5)i=1;

                            if (i==1)
                            {
                            PORTC.0=1;
                            delay_ms(30);
                            PORTC.0=0 ;
                            }
                            if (i==2)
                            {
                            PORTC.1=1;
                            delay_ms(30);
                            PORTC.1=0;
                            }
                            if (i==3)
                            {
                            PORTC.2=1;
                            delay_ms(30);
                            PORTC.2=0;
                            }
                            if (i==4)
                            {
                            PORTC.3=1;
                            delay_ms(30);
                            PORTC.3=0;
                            }
                            }
                            };
                            }
                            }
                            Em thấy chương trình này ko có vấn đề gì nhưng sao giả lập ko chạy đc. hjx . vẫn chưa đc các anh ạ. các đèn từ PC0 đến PC3 sáng lần lượt mà ko cần tác động vào PA0. yêu cầu là
                            ấn PA0 lần 1 -> PC0 sáng
                            ấn PA0 lần 2 -> PC1 sáng
                            ấn PA0 lần 3 -> PC2 sáng
                            ấn PA0 lần 4 -> PC3 sáng
                            Em thấy vấn đề là sau lần ấn phím thứ nhất. PA0==0 luôn ( do nhả phím ) vì vậy vòng lặp thực hiện liên tục

                            Cái file mình gửi cho bạn có cả phần mô phỏng chạy ok mà (Tên là "DK led đơn"). Cái lệnh PA0==0 vòng lặp thực hiện liên tục nhưng thực chất VDK có làm gì đâu.Khi nhả phím (PA0=1) thì mới thực hiện lệnh đầu tiên (PORTC.0=1) Bạn xem kỹ lại nhé.
                            Mình nghĩ chương trình trên ko cần thiết phải có thêm phần chống nảy phím, vì có ngay dòng delay phía dưới rồi. Các bạn cho ý kiến với.
                            Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
                            http://diencongnghiep360.com/
                            http://tudienhathe.vn/

                            Comment


                            • #15
                              Nguyên văn bởi vietthanh123 Xem bài viết
                              Cái file mình gửi cho bạn có cả phần mô phỏng chạy ok mà (Tên là "DK led đơn"). Cái lệnh PA0==0 vòng lặp thực hiện liên tục nhưng thực chất VDK có làm gì đâu.Khi nhả phím (PA0=1) thì mới thực hiện lệnh đầu tiên (PORTC.0=1) Bạn xem kỹ lại nhé.
                              Mình nghĩ chương trình trên ko cần thiết phải có thêm phần chống nảy phím, vì có ngay dòng delay phía dưới rồi. Các bạn cho ý kiến với.
                              Mình mô phỏng thì kết quả như sau: ấn PA0 thì PC0 ,1,2,3 sáng lần lượt nhau ( đuổi ) luôn. Mình đang cần ấn PA0 thì PC0 sáng thôi. nhả ra ấn lại PA0 thì PC1 sáng. cứ như thế. việc sáng của PC phụ thuộc vào PA0 chứ ko phải chỉ cần ấn PA0 1 lần mà PC cứ nối duôi nhau chạy.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X