Thông báo

Collapse
No announcement yet.

Thanh ghi TCNT1

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

  • Thanh ghi TCNT1

    Các bác cho em lời khuyên làm sao để đọc hết giá trị 16 bit của thanh ghi TCNT1 của timer/counter 1 vậy ?

    Trong code vision em đã thử mọi cách nhưng chỉ đọc được giá trị của 8 bit ( tức chỉ có TCNT1L), hic. Cứ mỗi lần timer0 tràn sẽ cập nhật giá trị của thanh ghi TCNT1.

    Code:
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Reinitialize Timer 0 value
    	TCNT0=0x01; 
           count=TCNT1;      // kể cả khi làm như vầy cũng không xong : 
                                    //count=TCNT1H<<8+TCNT1L,
    }
    các bác cho ý kiến với.

  • #2
    Nguyên văn bởi core T Xem bài viết
    Các bác cho em lời khuyên làm sao để đọc hết giá trị 16 bit của thanh ghi TCNT1 của timer/counter 1 vậy ?

    Trong code vision em đã thử mọi cách nhưng chỉ đọc được giá trị của 8 bit ( tức chỉ có TCNT1L), hic. Cứ mỗi lần timer0 tràn sẽ cập nhật giá trị của thanh ghi TCNT1.

    Code:
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Reinitialize Timer 0 value
    	TCNT0=0x01; 
           count=TCNT1;      // kể cả khi làm như vầy cũng không xong : 
                                    //count=TCNT1H<<8+TCNT1L,
    }
    các bác cho ý kiến với.
    Code:
    unsigned int TIM16_ReadTCNT1( void )
    {
    unsigned char sreg;
    unsigned int i;
    /* Save Global Interrupt Flag */
    sreg = SREG;
    /* Disable interrupts */
    _CLI();
    /* Read TCNT1 into i */
    i = TCNT1;
    /* Restore Global Interrupt Flag */
    SREG = sreg;
    return i;
    }
    việc đọc các thanh ghi 16 bit trong AVR yêu cầu 1 số thủ tục vì cấu trúc nó chỉ có 8bit.

    Sông dài, Thuyền lớn, Biển rộng bao la.
    Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

    Comment


    • #3
      @quoc_thaibk: T đã làm theo của bác trước đó rồi, đây là mẫu code trong datasheet của AVR, nhưng khi dịch T thấy nó báo lỗi + giá trị thanh ghi không phải là giá trị thực, T vẫn chưa hiểu nguyên do tại sao nữa.

      Code:
      unsigned int TIM16_ReadTCNT1( void )
      {
      unsigned char sreg;
      unsigned int i;
      /* Save Global Interrupt Flag */
      sreg = SREG;
      /* Disable interrupts */
      _CLI();// báo lỗi ngay tại đây ????
      /* Read TCNT1 into i */
      i = TCNT1;
      /* Restore Global Interrupt Flag */
      SREG = sreg;
      return i;
      }
      Last edited by core T; 10-12-2008, 07:53.

      Comment


      • #4
        8 bit là phải rồi . Muốn đọc 16 bit thì phải đọc TCNT1L trước .

        count=TCNT1L+ 256*TCNT1H .( thế là xong) . Đọc datasheet kỹ trước khi post bài nha bạn . Tránh làm loãng diễn đàn .

        Comment


        • #5
          Để đọc TCNT1 thì cứ ...đọc bình thường, ko phải làm thao tác gì thêm.

          usnigned int i;
          i = TCNT1;

          nếu bị lỗi thì nên: xem đã iclude file header đúng chưa, cài lại covisionAVR.

          Comment


          • #6
            Nguyên văn bởi hoacucvang Xem bài viết
            8 bit là phải rồi . Muốn đọc 16 bit thì phải đọc TCNT1L trước .

            count=TCNT1L+ 256*TCNT1H .( thế là xong) . Đọc datasheet kỹ trước khi post bài nha bạn . Tránh làm loãng diễn đàn .
            Cám ơn bạn đã cho lời khuyên.

            Sorry, T khai báo bị sai nên giá trị update không đúng ngay từ đầu.

            Thanks for all.
            Last edited by core T; 10-12-2008, 13:00.

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X