Thông báo

Collapse
No announcement yet.

Cho hỏi về Led và Công tắc :D

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

  • Cho hỏi về Led và Công tắc :D

    Mình lập trình như thế này nhưng không hiểu sao nó không chạy

    DDRB |= ( 1 << PB5) | ( 1 << PB4); // PB4 và 5 nối ra 2 đèn Led
    DDRD &= ~( 1 << PD6) | ( 1 << PD7); // PD6 PD 7 nối ra hai công tắc
    PORTD |= ( 1 << PD6) | ( 1 << PD7);
    if (!(PORTD & (1<<PD6))) // Kiểm tra nếu công tắc được ấn
    {
    PORTB = ( 1<< PB5);
    }
    if (!(PIND & PD7))
    {
    PORTB |= (1<< PB4);
    }
    Có ai thấy lỗi ở đâu không chỉ cho mình cái, mình ngồi cả tuần mầy mò mà toàn lỗi hic hic

  • #2
    Bạn khai báo sử dụng thư viện nào vậy ? Nó có biết PD6 hay PD7 là cái gì không ?
    Đã cấu hình PORTD chứa button làm đầu vào mức cao chưa ?
    Bạn cho xem thông báo lỗi luôn đi.

    Comment


    • #3
      Nguyên văn bởi mataattane Xem bài viết
      Mình lập trình như thế này nhưng không hiểu sao nó không chạy

      DDRB |= ( 1 << PB5) | ( 1 << PB4); // PB4 và 5 nối ra 2 đèn Led
      DDRD &= ~( 1 << PD6) | ( 1 << PD7); // PD6 PD 7 nối ra hai công tắc
      PORTD |= ( 1 << PD6) | ( 1 << PD7);
      if (!(PORTD & (1<<PD6))) // Kiểm tra nếu công tắc được ấn
      {
      PORTB = ( 1<< PB5);
      }
      if (!(PIND & PD7))
      {
      PORTB |= (1<< PB4);
      }
      Có ai thấy lỗi ở đâu không chỉ cho mình cái, mình ngồi cả tuần mầy mò mà toàn lỗi hic hic
      Sao nhiều người mới học toàn làm những cái rắc rối linh tinh thêm vậy ??? Bạn dùng trình dịch nào ???

      Viết kiểu đơn giản thế này có dễ hiểu hơn không :
      DDRB = 0b00110000; // PB5, PB4 output ( output là 1 , input là 0 )

      DDRD =0b00111111; // PD7, PD6 input

      ............................
      if(!PIND.6) { PORTB.5 =1; }
      if(!PIND.7) {PORTB.4=1;}

      ---- Cứ thế mà diễn thôi ( bạn dùng trình dịch nào vì mỗi cái trình dịch sử dụng tên lệnh khác nhau ... còn cú pháp cơ bản chỉ có thế !

      Comment


      • #4
        Giống như đi thi đạt giải quốc tế nhưng không đậu ĐH
        Cài đặt Input nhớ phải treo trở, nếu không button mất tác dụng.

        Comment


        • #5
          Nguyên văn bởi mataattane Xem bài viết
          Mình lập trình như thế này nhưng không hiểu sao nó không chạy

          DDRB |= ( 1 << PB5) | ( 1 << PB4); // PB4 và 5 nối ra 2 đèn Led
          DDRD &= ~( 1 << PD6) | ( 1 << PD7); // PD6 PD 7 nối ra hai công tắc
          PORTD |= ( 1 << PD6) | ( 1 << PD7);
          if (!(PORTD & (1<<PD6))) // Kiểm tra nếu công tắc được ấn
          {
          PORTB = ( 1<< PB5);
          }
          if (!(PIND & PD7))
          {
          PORTB |= (1<< PB4);
          }
          Có ai thấy lỗi ở đâu không chỉ cho mình cái, mình ngồi cả tuần mầy mò mà toàn lỗi hic hic
          Bạn đọc vào mà dùng Port nó ko chạy đâu. Bạn chuyển sang PIN xem nó có chạy ko.
          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


          • #6
            Mình thử dùng cả PIN và PORD ở code trên còn gì Mình dùng Winavr với AVR STUDIO
            Thì tại mình dùng cái trình dịch này nên phải viết code theo nó mình làm thử nhiều lần cả với PIN và PORT đều không chạy hic hic

            Comment


            • #7
              Chắc là bạn phải chuyển qua CV mà dùng thôi, AVRStudio mình lập trình và biên dịch nó có thèm chạy đâu.

              Comment


              • #8
                Bác thử xem lại câu lệnh này hộ em :if (!(PIND & PD7)) và đổi thử về thành if(!(PIND&(1<<PD7))) xem có dc ko

                Comment


                • #9
                  Chắc là tại bạn dùng PORT để kiểm tra đầu vào thay cho PIN rồi, chứ mình làm với WinAVR trên AVR Studio ngon lành mà, mấy cái kiểm tra button này làm lâu rồi .
                  Mình thấy nếu mới học thì học bằng CodeVision cũng hay, nhg lâu ngày đâm ra phụ thuộc nó lắm, chả nhớ hết được thanh ghi đâu. Sau này làm sâu hơn với AVR lại phải đi ngó lại thanh ghi khổ. Tốt nhất là học luôn WinAVR + AVR Studio đi vì trên mạng nhiều ứng dụng người ta viết bằng WinAVR, mình ứng dụng code đó nhanh hơn.
                  Câu lệnh:
                  if (!(PORTD & (1<<PD6))) nên đổi thành
                  if (!(PIND & (1<<PD6))) thì đúng hơn

                  Comment


                  • #10
                    Thanks các bác reply để tí nữa em về nhà thử xem thế nào.. Em mới học nên nhiều khi phải thử đi thử lại. Có gì em sẽ hỏi thêm các bác

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X