Thông báo

Collapse
No announcement yet.

Thắc mắc về PORT F của ATmega64

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

  • Thắc mắc về PORT F của ATmega64

    Mình là thành viên mới của diễn đàn, đang viết vi điều khiển họ AVR, sử dụng CodeVision. Mình có một thắc mắc về PORT F của con ATmega64.
    Mình viết code như sau:
    DDRF |= 0x08;
    PORTF.3 = 1;
    delay_ms(1000);
    PORTF.3 = 0;
    delay_ms(1000);
    thì khi dịch chương trình báo lỗi
    Warning: code has no effect
    Error: missing ';'
    Mong các cao thủ ra tay giúp.

  • #2
    PORTF của dòng ATMEGA64 cũng như ATMEGA128 không được phép định địa chỉ bit. Do đó bạn phải sử dụng mặt nạ khi muốn truy cập BIT của PORT này.

    PORTF |= 0b00001000; //PORTF.3 = 1;
    PORTF &= 0b11110111; //PORTF.3 = 0;
    PNLab
    Mạch nạp/debug ULink2, Jlink ARM USB
    Mạch nạp AVR, PIC, 8051, MSP430 USB
    Mạch phát triển STM32, ARM9, ARM11
    more...www.pnlabvn.com

    Comment


    • #3
      In ATmega103 compatibility mode Port F is input only. If the JTAG interface is enabled, the pull-up resistors on pins PF7(TDI), PF5(TMS) and PF4(TCK) will be activated even if a reset occurs.
      Trường hợp 1: Bạn chưa clear M103 compatibility mode, do vậy các cổng của PORTF sẽ chỉ có thể là input. Ngoài ra việc clear fuse JTAGEN cũng ảnh hưởng đến chức năng PORTF.

      Trường hợp 2: Địa chỉ thanh ghi PORTF nằm từ 0x61 đến 0x63. Với ngôn ngữ assembly, các lệnh sbi (set bit) hay cbi sẽ không thực hiện được đối với những thanh ghi có địa chỉ lớn hơn 0x60. Mà thay vì đó phải sử dụng lệnh sbr và cbr. Trong C thì điều này giống như sphinx đã nói ở trên.
      Mồm chó vó ngựa

      Comment


      • #4
        Nguyên văn bởi tranduc Xem bài viết
        Mình là thành viên mới của diễn đàn, đang viết vi điều khiển họ AVR, sử dụng CodeVision. Mình có một thắc mắc về PORT F của con ATmega64.
        Mình viết code như sau:
        DDRF |= 0x08;
        PORTF.3 = 1;
        delay_ms(1000);
        PORTF.3 = 0;
        delay_ms(1000);
        thì khi dịch chương trình báo lỗi
        Warning: code has no effect
        Error: missing ';'
        Mong các cao thủ ra tay giúp.
        PORTF là thanh ghi địa chỉ gián tiếp, nó y như SRAM vậy, ko đánh địa chỉ bit được, tuy nhiên vẫn có thể truy cập vào từng bit thông qua cấu trúc struct:
        VD:
        struct PORT_GT {
        unsigned char B0:1;
        unsigned char B1:1;
        unsigned char B2:1;
        unsigned char B3:1;
        unsigned char B4:1;
        unsigned char B5:1;
        unsigned char B6:1;
        unsigned char B7:1;
        } PORT_F @ 0x62;


        sau đó muốn truy cập vào từng bit thì như các PORT khác, ví dụ:
        PORT_F.B0=1;
        PORT_F.B3=0;
        Chú ý: các lệnh này mất nhiều chu kì máy hơn các lện set clr thường.
        |

        Comment


        • #5
          Mình vừa viết chương trình theo ý kiến của các bác, rút ra được kết quả như sau:
          - Khi JTAGEN = 0, tức là không sử dụng giao tiếp JTAG:
          + Sử dụng PORT F là ngõ vào hay ra tùy theo DDRF, nhưng không định địa chỉ bit được mà phải dùng mặt nạ.
          + Còn theo cách thông qua cấu trúc struct của bác hightech_uc thì rất hay, vì có thể điều khiển một nhóm bao nhiêu bit cũng được. Theo như bác thì PORT_F.B0...7 đều có thể nhận giá trị 0 hoặc 1. Còn nếu mình khai báo như sau:
          Struct PORT_GT
          {
          Unsigned char B0:1;
          Unsigned char B1:3;
          Unsigned char B2:4;
          }PORT_F @0x62;
          Thì khi đó PORT_F.B0 (PORT_F.0) có thể nhận 0 đến 1, PORT_F.B1 (PORTF.1..3) nhận giá trị từ 0 đến 7, PORT_F.B2 (PORTF.4..7) nhận từ 0 đến 15.
          - Khi JTAGEN = 1 thì chỉ sử dụng được nibble thấp của PORTF là ngõ vào ra thôi, nibble cao phục vụ giao tiếp JTAG.
          Tks các bác nhiều!

          Comment


          • #6
            Các bác cho e hỏi chút: Nếu e sử dụng PORTF là đầu vào thì em sẽ truy nhập nó theo bit như nào!

            Comment


            • #7
              Có thể làm thế này.
              Code:
              typedef struct _BITS
              {
                 unsigned char bit0:1;
                 unsigned char bit1:1;
                 unsigned char bit2:1;
                 unsigned char bit3:1;
                 unsigned char bit4:1;
                 unsigned char bit5:1;
                 unsigned char bit6:1;
                 unsigned char bit7:1;
              }BITS;                       
              typedef union  _BYTE
              {
                 unsigned char byte;
                 BITS  bits;  
              }BYTE; 
              BYTE  DATA_IN_PORTF;
              void main(void)
              {               
                 DDRF=0x00;  //all input
                 PORTF=0xFF; //pullup
                 DATA_IN_PORTF.byte=PINF;           
                 /*
                 khi do
                 DATA_IN_PORTF.bits.bit0=PINF.0
                 DATA_IN_PORTF.bits.bit1=PINF.1
                 .
                 .
                 .   
                 DATA_IN_PORTF.bits.bit7=PINF.7      
                 */
              }
              Last edited by hungnp; 14-08-2008, 18:34.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X