Thông báo

Collapse
No announcement yet.

Hàm ngắt trong Input Capture

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

  • Hàm ngắt trong Input Capture

    Em đang tìm hiểu về Input Capture của con AVR. Em thử cái hàm để đếm cạnh xung lên, xuống của ngõ vào, nhưng không hiểu sao em nhận được cái biến dem chỉ tăng đến 1A là ngưng. Nhưngi nếu ở chương trình chính em xét cái biến dem đó thì nó lại luôn = 0. Mấy bác xem lỗi dùm em, em cám ơn.

    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    {
    TCNT1 = 0; //

    dorong = ICR1/4 ; // Xung clock atmega 4MHz

    dem ++

    truyenfile (dem); // truyen ve may tinh

    if (PINB.0==1) TCCR1B = 0x41;// Chon xung ke tiep input ngat canh len

    else TCCR1B = 0x01; // Chon xung ke tiep input ngat canh xuong

    }

    Cái hình này là em nhận trên máy tính

    Click image for larger version

Name:	Untitled.jpg
Views:	1
Size:	36.8 KB
ID:	1410068

  • #2
    - Khi ngắt sườn lên thì PINB.0 = 1 muốn chuyển sang ngắt cạnh xuống bác chuyển bit ICES1 = 0 hay TCCR1B = 0x01;
    - Khi ngắt sườn xuống thì PINB.0 = 0 muốn chuyển sang ngắt cạnh lên bác chuyển bit ICES1 = 1 hay TCCR1B = 0x41;

    =>Theo code trên thì bác bị ngược, bác thay thử thế này xem nhé:

    if (PINB.0) TCCR1B = 0x01;// Chon xung ke tiep input ngat canh xuong

    else TCCR1B = 0x41; // Chon xung ke tiep input ngat canh len

    Comment


    • #3
      Ah. Thanks bác nhiều. Hehe. Tệ quá. Nhưng em nhận cũng thấy còn lỗi. Em không rõ lỗi chương trình hay con IR Receive nữa, em dùng con SM0038 mua ở Nhật Tảo. Nếu nhận về máy tính bằng sound card thì thấy tốt, nên em thử dùng AVR để đếm xung luôn.

      Click image for larger version

Name:	Untitled.png
Views:	1
Size:	7.7 KB
ID:	1350313

      Sau khi sửa theo lỗi của bác thì em em nhận được như thế nào, không hiểu sao nó nhận 2 con số 1, em cho nhận tín hiệu lần nữa thì nó lại bắt đầu lại từ 1, lẽ ra phải từ 1e tiếp chứ.
      Với lại ở chương trình chính em định nếu nhấn 1 nút bấm thì nó xuất biến dem ra port C. Nhưng nó vẫn luôn = 0 ?. Em mới nhập môn nên chưa rành lắm. Các bác giúp xem dùm em. Đây là code của em:

      #include <mega8.h>
      #include <stdio.h>
      #include <delay.h>

      unsigned int dorong; // bien 16 bit giatri chua do rong xung

      unsigned char logic,dem=0;


      // Khai bao chuong trinh phat du lieu

      void truyenfile(unsigned char phat)
      {
      PORTD.3=1; // 485 ngo phat
      putchar(phat);
      }

      // Khai báo ngat Capture

      interrupt [TIM1_CAPT] void timer1_capt_isr(void)
      {
      TCNT1 = 0; // Gan gia tri thanh ghi dem =0
      dorong = ICR1/4 ; // Do Xung clock atmega 4MHz
      // truyenfile(logic);
      dem++;
      truyenfile(dem);

      if (PINB.0==0)
      {
      TCCR1B = 0x41;// Chon xung ke tiep input ngat canh len
      logic =0; // hien tai logic =0
      }

      else
      {
      TCCR1B = 0x01; // Chon xung ke tiep input ngat canh xuong
      logic = 1; // hien tai logic =1
      }

      }

      void main(void)

      {

      DDRB = 0xFE; // Port B xuat 7 bit cao, bit 0 lam Input Capture
      PORTB = 0x00; //

      DDRC= 0xFF;
      PORTC = 0x00;

      DDRD= 0x08; // chan d3 ngo ra lam dieu khien 485
      PORTD = 0xf7;

      // Khoi tao UARST

      UCSRA = 0x00;

      UCSRB = 0xD8; // kich hoat tinh nang truyen nhan

      UCSRC = 0x86; // 8 bit data, ko Parity, 1 bit stop

      UBRRH = 0;
      // Toc do 4800 ngo truyen
      UBRRL = 51;


      // Khoi tao Input Capture
      TCNT1 = 0; // Gia tri dau bien dem =0
      TCCR1B = 0x01; // Prescaler = 1 , InputCapture canh xuong
      TIMSK = 0x24; // Cho phep ngat Inputcapre va ngat tran
      logic=1;
      dorong=0;

      #asm("sei") //cho phep ngat toan cuc

      while(1)
      {
      if (PIND.2==0)

      {
      PORTC = dem;
      truyenfile(dem);

      }

      }
      }
      Last edited by nonthan; 20-08-2011, 10:42.

      Comment


      • #4
        Tìm được lỗi rồi. Hehe. Do cái ngắt sau khi truyền của UART. Disible nó là xong.
        Last edited by nonthan; 22-08-2011, 17:58.

        Comment


        • #5
          Thử không cần disable ngắt truyền và thay hàm truyền sau xem có lỗi không nhé bạn:
          // Khai bao chuong trinh phat du lieu

          void truyenfile(unsigned char phat)
          {
          PORTD.3=1; // 485 ngo phat
          putchar(phat);
          PORTD.3=0; //dat o trang thai nhan
          }

          Nhớ báo lại kết quả nhé.

          Comment


          • #6
            Thử rồi bác ơi. Vẫn bị lỗi. Không rõ nguyên nhân vì sao vậy nữa.

            Click image for larger version

Name:	Untitled.jpg
Views:	1
Size:	11.5 KB
ID:	1350395

            Comment


            • #7
              Cậu khai báo ngắt truyền, ngắt nhận thì sử dụng 2 hàm ngắt của nó chứ :
              interrupt [USART_RXC] void usart_rx_isr(void);
              interrupt [USART_TXC] void usart_tx_isr(void);

              Như khai báo trên thì có dùng gì tới các hàm ngắt đâu.
              Không dùng ngắt thì chỉ khai báo thế này thôi:

              UCSRA=0x00;
              UCSRB=0x18;
              UCSRC=0x86;
              UBRRH=0x00;
              UBRRL=0x67; //4800 baud; 8Mhz

              Đầu vào ICP là gì đấy cậu? Test từng đoạn 1 là biết nó lỗi do cái gì ngay ấy mà.

              Comment


              • #8
                Ah, Cái đầu vào dùng em dùng con IR Receive SM0038. Cái ngắt nhận thì em có xài, chỉ chưa viết lệnh thôi. Lỗi là ở ngắt truyền khai báo mà không sử dụng, UCSRB = 0x98 để bỏ nó là chạy ok. Thanks bác nhé.

                Comment


                • #9
                  Trở lại đề tài cũ. Em có ý định phát lại tín hiệu hồng ngoại đó. Em cho lưu lại ICR1 khi có ngắt lên, xuống tức thu được duty của xung. Nếu muốn phát ra led hồng ngoại các tín hiệu đó thì dùng Timer phát ra sóng mang 38Khz dựa vào duty mà delay ON,OFF Timer. Như vậy thì có được không ?
                  Nếu muốn tạo PWM 38khz thì em khai báo như vậy đúng không (Xung nhip 4MHz, pre=1).

                  TCCR1A = 0x82;
                  TCCR1B = 0x99;
                  OCR1A = 52;
                  ICR1 = 104;
                  Last edited by nonthan; 30-08-2011, 17:17.

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X