Thông báo

Collapse
No announcement yet.

Các vấn đề cơ bản về I/O Port (Revised 12/02/09)

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Ứng dụng cho 5 chân
    (Một điều cần lưu ý là mạch gốc led bị vẽ sai, hình này là đã chỉnh sửa lại, không hiểu sao Atmel lại có thể xuất bản mà sơ xuất đến thế)


    Phân tích theo hình,
    - Để quét digit 1 cần phải mức cao chân PB1, PB2,
    - Digit 2 thì mức cao PB3, PB4, ứng dụng này không dùng mức cao PB5
    - Đối chiếu các chân còn lại thấy có sự tương tự nhau ở hai digit, vậy chỉ cần xác lập một mảng đối chiếu là đủ cho cả hai.
    - Nếu lưu tổ hợp từng đoạn cho cả hai digit, tổng thể lên tới 10 x 10 = 100 byte (thậm chí 16 x 16 =256, không khoa học
    Bảng tổng hợp quan hệ chức năng sáng từng LED và từng chữ số

    Với giải thuật sơ lược như vừa nêu, tôi có viết một đoạn chương trình nhận các số hàng chục và đơn vị (codex10, codex1) và các bit dấu chấm (dotx10, dotx1), xuất ra thành 2 LED-7seg với 2 dấu chấm. Mô phỏng thử trên AVRStudio thấy chạy được, chú ý đây chỉ là đoạn chương trình chính hiển thị số. Quá trình lấy dữ liệu không được đề cập, tuy nhiên có thể lấy dữ liệu dễ dàng bằng ngắt hoặc chuyển đoạn chương trình này thành chương trình phục vụ ngắt timer thay vì dùng hàm delay.
    Đẹp từng kilomét

    Comment


    • #17
      Code:
      //PB0: lay tin hieu
      //PB1..5: hien thi LED
      
      bit dotx10, dotx1; //hien thi dau cham
      char codex10=0, codex1=0; //hien thi so chuc-don vi
      char code[17]={63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113,128};//bang ma  
      char active_HIGH,active_LOW,active_nible;  
      ........
      
      while(1){
      for(active_HIGH=1; active_HIGH<6; active_HIGH++) //set tung chan
      {
      	PORTB = (1<<active_HIGH); //hàng quét
      
      	switch (active_HIGH){
      		case 1: active_nible = code[codex10]<<1;
      			break;
      		case 2: active_nible = code[codex10]>>3 + dotx10*(1<<5);
      			break;
      		case 3: active_nible = code[codex1]<<1;
      			break;
      		case 4: active_nible = code[codex1]>>3 + dotx1*(1<<5);
      			break;
      		default: active_nible = 0; break;
      	}
      	for(active_LOW=1; active_LOW < 6; active_LOW++){
      		DDRB = (1<<active_HIGH);  //thiet lap ngo ra muc cao
      		if (active_LOW < active_HIGH) DDRB|= (1<<active_LOW)&active_nible;
      		else if (active_LOW > active_HIGH) DDRB|= (1<<active_LOW)&(active_nible<<1);
      		else goto skip_delay;
      		delay_ms(1);
      	skip_delay:
      	}
      }
      }
      }
      Không tự tin đây là chương trình hiển thị hoàn chỉnh, bạn nào dùng proteus kiểm tra giúp mình. Phù..
      Đẹp từng kilomét

      Comment


      • #18
        em dung CodevisionAVR thấy ở thẻ PORTS khi khởi tạo có các chể độ 0;1 khi chọn output và T;P khi chọn là input, em cũng phán đoán lờ mờ nhung chưa hiểu cặn kẽ lắm, thấy các anh thảo luận cũng vỡ ra thêm nhiều điều nhưng và là học mót nên vẫn lờ mờ các anh có thể nói chi tiết hơn về trạng thái 0,1,T,P cho em mở mắt mới được không ạ
        Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

        Comment


        • #19
          T: Tri-state
          P: Pulled Up
          Khi khởi tạo ở Codevision, mặc định PUD=0 nên chế độ T có cấu hình
          DDRx=0, PORTx=1, PUD=0
          Attached Files
          Đẹp từng kilomét

          Comment


          • #20
            Revised ngày 12/02/09: Một số chú ý

            Cảm ơn Blackmoon đã đóng góp.
            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


            • #21
              Mình đang đọc ATmega8 về I/O nhưng có chỗ chưa hiểu, ai biết chỉ dùm cái bảng nó nói cái gì vậy? Có thể nói cụ thể 1 pin không?
              |

              Comment


              • #22
                Có ai để ý đến trở treo trong AVR là bao nhiêu không? Hôm trước mình có quét phím, nhưng không dùng trở treo ngoài, các phím như là có vấn đề vì nó rất dễ bị nhiễu.

                Comment


                • #23
                  Nguyên văn bởi mrcuongcon
                  Có ai để ý đến trở treo trong AVR là bao nhiêu không? Hôm trước mình có quét phím, nhưng không dùng trở treo ngoài, các phím như là có vấn đề vì nó rất dễ bị nhiễu.
                  Điện trở pullup cho các IO của AVR khoảng từ 20K đến 50K Ohm.
                  Có thể do bạn chưa enable pullup này.
                  Thân mến,
                  blackmoon.

                  Comment


                  • #24
                    Nguyên văn bởi blackmoon Xem bài viết
                    Điện trở pullup cho các IO của AVR khoảng từ 20K đến 50K Ohm.
                    Có thể do bạn chưa enable pullup này.
                    Thân mến,
                    blackmoon.
                    Em đã pullpup nó rồi, nhưng vẫn bị nhiễu.
                    Cùng một bài lập trình, chíp thường bị nhiễu còn chíp dán thì không. đến khi thêm một con trở treo 4k7 thì nó mới ổn.

                    Comment


                    • #25
                      Nếu vậy thì có thể do phần cứng khác nhau (hai mạch khác nhau chỗ nào đó hoặc 1 mạch bị lỗi khi gia công).
                      Tôi dùng chip kiểu DIP, kết nối button dùng pullup trong chạy ok.
                      Thân mến,
                      blackmoon.

                      Comment


                      • #26
                        Rpu=20-100K. xem ở phía dưới của datasheet.
                        dòng max trên mỗi chân: 40mA. trung bình là 20mA
                        tuy nhiên dòng max qua chân Vcc và Gnd bị giới hạn. bởi vậy tổng dòng sink và source trên các chân sẽ bị giới hạn chứ không phải là lúc nào cũng chạy được 20mA đâu.
                        chi tiết xem phần này trong datasheet C Characteristics. ở phía dưới của datasheet ấy.
                        trên thực tế nếu bạn không làm đúng theo hướng dẫn phần cứng thì sẽ có những kết quả thú vị lắm đấy. bạn nào thích thì cứ thử.
                        vd,quét 2 phím/chân io.

                        Comment


                        • #27
                          trên thực tế nếu bạn không làm đúng theo hướng dẫn phần cứng thì sẽ có những kết quả thú vị lắm đấy. bạn nào thích thì cứ thử.
                          vd,quét 2 phím/chân io.[/QUOTE]
                          không hiểu ý của bạn?

                          Comment


                          • #28
                            Nguyên văn bởi mrcuongcon Xem bài viết
                            trên thực tế nếu bạn không làm đúng theo hướng dẫn phần cứng thì sẽ có những kết quả thú vị lắm đấy. bạn nào thích thì cứ thử.
                            vd,quét 2 phím/chân io
                            không hiểu ý của bạn?
                            nghĩa là trên một chân I/O mà gắn có 2 phím nhấn được sử dụng.. vẫn có thể đọc dược chính xác là nút nào đang nhấn... ( chỉ thử chơi thôi, chứ còn độ chắc chắn thì mình ko chắc, vì về lí thuyết thì..hi, tùy dk thực tế)

                            Comment


                            • #29
                              Nguyên văn bởi dt_love Xem bài viết
                              nghĩa là trên một chân I/O mà gắn có 2 phím nhấn được sử dụng.. vẫn có thể đọc dược chính xác là nút nào đang nhấn... ( chỉ thử chơi thôi, chứ còn độ chắc chắn thì mình ko chắc, vì về lí thuyết thì..hi, tùy dk thực tế)
                              Ừm, tùy điều kiện thực tế, chứ nối thẳng phím bấm chết chân vi điều khiển là phải đạo rồi.
                              Nếu bạn dùng các cổng đệm, đảo để đệm các tín hiệu đầu vào cũng nên coi chừng con chíp của bạn bốc khói.

                              Comment


                              • #30
                                Nguyên văn bởi mrcuongcon Xem bài viết
                                Ừm, tùy điều kiện thực tế, chứ nối thẳng phím bấm chết chân vi điều khiển là phải đạo rồi.
                                Nếu bạn dùng các cổng đệm, đảo để đệm các tín hiệu đầu vào cũng nên coi chừng con chíp của bạn bốc khói.
                                ??
                                mình chỉ xài nút nhấn thôi.. ko xài j nữa..
                                ủa, mà sao VDK lại bốc khói nhỉ? có chăng thì mạch bốc khói trước chứ.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X