Thông báo

Collapse
No announcement yet.

Sử dụng chức năng capture của PIC

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

  • #31
    Mình cũng toàn tự học chứ có ai dạy dỗ cái gì đâu.Trong chương trình học thì cái phần PIC học như cưỡi ngựa xem hoa,đã vậy lãi học bằng hợp ngữ.Không biết bậy giờ đã có trường nào đưa vào giảng dạy C chưa,đúng là cái ngành giáo dục của ta lỗi thời quá,luôn đi sau về chót-->chán.
    Nói về cái vụ CCP thì theo kinh nghiệm chinh chiến của mình 2 cái chân này rất dễ bị nhiễu nếu sử dụng cùng lúc,nếu cho nó đếm xung thì dễ bị xai số do ngưỡng áp vào của chân này thấp,cảm giác như nó bị nhạy quá mức.Thường thì khi cần đếm xung đơn giản thì mình dùng chân RB0 sẽ chính xác hơn.
    Tất nhiên là nếu bạn thiết kế ứng dụng để chạy trong môi trường tiêu chuẩn hoặc mấy cái máy đếm sp bình thường thì không cần quan tâm đến vấn đế này.


    email:
    Giá mà mạch điện tử không có nhiễu (noise) thì mình bây giờ đã là ... đại gia

    Comment


    • #32
      The House không dùng hàm puts() được đâu. Bạn nên dùng hàm printf() thì mới gửi tốt được. Chúc thành công

      Comment


      • #33
        Chức năng Capture của PIC16F877A
        Ở chế độ Capture, thanh ghi CCPR1H và CCPR1L lưu giữ giá trị 16 bit của của thanh ghi TMR1 khi có 1 sự kiện xảy ra ở chân RC2/CCP1. Sự kiện này được định nghĩa là một trong những sự kiện dưới đây:
        - Mỗi khi có sườn xuống
        - Mỗi khi có sườn lên
        - Mỗi khi có 4 sườn lên
        - Mỗi khi có 16 sườn lên
        Loại sự kiện được thiết lập bởi bit điều khiển CCP1M3:CCP1M0 của thanh ghi CCPxCON. Khi 1 capture xảy ra, cờ ngắt CCP1IF của thah ghi PIR1 được set. Cờ ngắt phải được xóa bằng chương trình. Nếu một capture khác diễn ra trước khi đọc giá trị trong thanh ghi CCPR1, giá trị capture cũ sẽ bị ghi đè bởi giá trị mới.
        1. Thiết lập chân CCP
        Ở chế độ Capture, chân RC2/CCP1 được thiết lập là đầu vào bằng cách set bit thứ 2 của thanh ghi TRISC.
        2. Chọn chế độ cho Timer1
        Timer1 phải chạy ở chế độ định thời hoặc chế độ bộ đếm đồng bộ để CCP sử dụng chức năng capture.
        3. Chương trình ngắt
        Người sử dụng nên xóa bit CCP1IE để tránh ngắt lỗi và xóa cờ ngắt CCP1IF, mỗi khi có bất kì thay đổi trong chế độ hoạt động.
        4. Tỉ lệ chia CCP
        Có thể thiết lập 4 tỉ lệ chia bằng các bit CCP1M3:CCP1M0. Khi modun CCP được sử dụng hoặc không ở chế chế độ capture thì bộ đếm tỉ lệ được xóa.

        Comment


        • #34
          Chương trình đếm xung encoder dùng chức năng Capture
          #include <18F4431.h>
          #fuses HS,NOWDT,NOPROTECT,NOLVP
          #device *=16 ADC=8
          #use delay(clock=20000000)
          #include <lcd_lib_4bit.c>
          int16 pulse=0;
          #INT_CCP1
          void interrupt_ccp1()
          {
          clear_interrupt(INT_CCP1);
          disable_interrupts(GLOBAL);
          pulse++;
          enable_interrupts(GLOBAL);
          }
          void main()
          {
          set_tris_c(0xff);
          lcd_init();
          setup_ccp1(CCP_CAPTURE_RE);
          setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
          enable_interrupts(INT_CCP1);
          enable_interrupts(GLOBAL);

          while(1)
          {
          lcd_putcmd(clear_scr);
          lcd_putcmd(line_1);
          printf(lcd_putchar,"%lu",pulse);
          delay_ms(200);
          }
          }
          Last edited by ngdnhanbk; 05-06-2012, 11:36.

          Comment


          • #35
            hào các sư huynh em đang làm việc với một con cảm biến đo góc từ -15 đến +15 độ đầu ra của nó là PWM tần số 1KHz tương ứng góc là giá trị độ rộng là 20% đến 80% của tần số đó! anh chị nào có cao kiến chỉ giáo giúp em cách đo độ rộng của xung đó với được không ah! em lập trình cho pic16f877a . có thể sử dụng chức năng capture được không ah! đo độ rộng xung là thời gian tồn tại giữa sườn lên và sườn xuống của xung cơ
            My Face :

            Comment


            • #36
              #include <16F877.h>
              #use delay(clock=20000000)
              #fuses HS,NOWDT
              #include "hienthiLCD.c"


              int overflow_count;
              unsigned int32 start_time, end_time;
              int32 pulse_ticks;

              #int_TIMER1
              void TIMER1_isr()
              {
              ++overflow_count;
              }

              #int_CCP2
              void CCP2_isr()
              {
              end_time = CCP_1;
              start_time = CCP_2;
              pulse_ticks = CCP_2-CCP_1;
              set_timer1(0);

              }

              void main() {
              setup_ccp1(CCP_CAPTURE_FE);
              setup_ccp2(CCP_CAPTURE_RE);
              setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );//set timer1 to run at system clock/4
              enable_interrupts(INT_TIMER1); //unmask Timer1 overflow interrupt
              enable_interrupts(INT_CCP2); //unmask capture event interrupt
              enable_interrupts(global); //enable all unmasked interrupts

              while(1){
              LCD_init();
              printf(lcd_putc,"\rdo rong: %u", pulse_ticks); }
              }

              nó chạy không đúng các bác giải thích giùm em
              |

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X