Thông báo

Collapse
No announcement yet.

Công cụ học tập và phát triển cho PIC - Hoàn toàn miện phí

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

  • .................................................. ....................
    Last edited by quangnhat; 04-10-2008, 20:23.
    Quang Nhat
    ---------------------------------------
    Yahoo :quangnhat85ls
    Mail :
    Nhận thiết kế và ép nhựa cho đồ điện tử

    Comment


    • Em đưa một xung vào ngắt ngoài của Pic 18f4431, nếu nhận được xung như vậy thì xuất ra mức cao ra một port(còn không thì thôi).Các bác nhà mình am hiểu về Pic có thể bớt chút thời gian giúp em được không?


      Thời gian mức L = 0.4ms
      Attached Files
      Quang Nhat
      ---------------------------------------
      Yahoo :quangnhat85ls
      Mail :
      Nhận thiết kế và ép nhựa cho đồ điện tử

      Comment


      • Nhà mình đi đâu cả ta???
        Quang Nhat
        ---------------------------------------
        Yahoo :quangnhat85ls
        Mail :
        Nhận thiết kế và ép nhựa cho đồ điện tử

        Comment


        • Bạn nêu bài toán không rõ ràng. Người đọc khó mà hiểu được. Đưa xung vào ngắt ngoài thì bắt mức cao hay mức thấp?
          Nếu bạn muốn xuất xung có mức thấp 0.4ms thì bạn có thể dùng ngắt Timer để tạo hoặc cách đơn giản là dùng hàm delay. Khi dùng timer thì tín hiệu để start cho timer lấy chính từ ngắt ngoài của PIC.
          Ethernet-RS232, PIC Webserver, RFID Reader
          CallerID, Cảnh báo BTS, ...
          0988006696
          linhnc308@gmail.com
          http://linhnc308.blogspot.com

          Comment


          • Emergency...

            các bác giúp em với, em đọc cái data sheet mấy lần vẩn không thấy cách giải quyết vấn đề nêu trên em nghỉ là second chạy từ 0->59 và 1 minute= 60 second là default. Nhưng sự việc giường như không như vậy.

            Comment


            • có thể up mạch và pro lên cho mọi người học hỏi với. Thanks

              Comment


              • mới bảo vệ đồ án xong hôm qua. điểm cũng khá cao nên hôm nay quay lại diễn đàn này các ơn tất cả các bán đã giúp đỡ. đặc biệt là bac LINH. và cũng mong từ đây có thể giống các bác đem chút kiến thức còn hạn chế này ra giúp các bạn mới.

                Comment


                • hoi trong capture

                  #include <16F877A.h>
                  #include <def_877a.h>
                  #use delay(clock=20000000)
                  #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
                  #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)

                  #bit TMR1IF = 0x0C.0em chưa hiểu lệnh này ạ?

                  #include <LCD_lib_4bit.c>

                  int16 CCP1Value; // Gia tri CCP hien tai
                  int16 CCP1OldValue; // Gia tri CCP truoc do
                  BOOLEAN CCP1Captured; --> khai báo hàm capture ạ?
                  float Freq;
                  int8 char1,char2,char3,char4,char5,char6,mode;
                  int8 count,count1,count2,count3;
                  #int_CCP1
                  CCP1_isr()
                  {

                  if(TMR1IF)
                  {
                  CCP1Value = CCP_1 +(65535-CCP1OldValue); sao anh lại có công thức này nhỉ?
                  CCP1OldValue = CCP_1; ???
                  TMR1IF=0; ??????????

                  }
                  else
                  {
                  CCP1Value = CCP_1 - CCP1OldValue;
                  CCP1OldValue = CCP_1;
                  }
                  CCP1Captured = TRUE;

                  }
                  //--------------------------------------------------------------------------
                  #INT_TIMER0
                  Timer0_isr()
                  {
                  }
                  //----------------------------------------
                  void Init_ccp(void)
                  {
                  setup_ccp1(CCP_CAPTURE_RE);
                  setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_64);
                  setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
                  set_timer0(0);
                  CCP1Value = 0;
                  CCP1OldValue = 0;
                  CCP1Captured = TRUE;
                  enable_interrupts(INT_CCP1);
                  //enable_interrupts(INT_TIMER1);
                  enable_interrupts(GLOBAL);
                  }
                  //--------------------------------------------------------------------------
                  void Convert_CCP1()
                  {
                  int32 temp;
                  //Freq = (1.0/((float)CCP1Value*2e-7)); // For Time_Div_1
                  Freq = (1.0/((float)CCP1Value*16e-7)); //For_Time_Div_8
                  if (Freq >= 1000 )
                  {
                  mode = 1;
                  temp = freq;
                  char1 = (temp / 100000) + 0x30;
                  temp = temp % 100000;
                  char2 = (temp / 10000) + 0x30;
                  temp = (temp % 10000);
                  char3 = (temp / 1000) + 0x30;
                  temp = (temp % 1000);
                  char4 = (temp / 100) + 0x30;
                  temp = temp % 100;
                  char5= (temp/10 ) + 0x30;
                  char6 = (temp % 10) + 0x30;
                  goto exit;
                  }
                  else
                  if (Freq >= 1000000 )
                  {
                  mode = 2;
                  temp = freq;
                  char1 = (temp / 100000) + 0x30;
                  temp = temp % 100000;
                  char2 = (temp / 10000) + 0x30;
                  temp = (temp % 10000);
                  char3 = (temp / 1000) + 0x30;
                  temp = (temp % 1000);
                  char4 = (temp / 100) + 0x30;
                  temp = temp % 100;
                  char5= (temp/10 ) + 0x30;
                  char6 = (temp % 10) + 0x30;
                  goto exit;
                  }
                  else
                  {
                  mode = 0;
                  temp = (int32)(freq * 1000);
                  char1 = (temp / 100000) + 0x30;
                  temp = temp % 100000;
                  char2 = (temp / 10000) + 0x30;
                  temp = (temp % 10000);
                  char3 = (temp / 1000) + 0x30;
                  temp = (temp % 1000);
                  char4 = (temp / 100) + 0x30;
                  temp = temp % 100;
                  char5= (temp/10 ) + 0x30;
                  char6 = (temp % 10) + 0x30;
                  goto exit;
                  }
                  exit:
                  temp = 0;
                  }
                  //--------------------------------------------
                  void convert_timer0_value()
                  {
                  count = get_timer0();
                  count1 = count/100 + 0x30;
                  count = count%100;
                  count2 = count/10 + 0x30;
                  count3 = count%10 + 0x30;
                  }
                  //---------------------------------------------------------------
                  void main()
                  {
                  TRISB = 0; // F = 1/T
                  Init_ccp(); // Timer1 prescaler DIV_BY_1
                  LCD_init(); // PIC16f877a 20MHz -> 0.0000002 = 200nS
                  //printf("Frequence test:\r\n"); // Pic16F877A 4MHz -> 0.000001 = 1uS
                  LCD_putcmd(0xC0);
                  Printf(LCD_putchar,"Counter = ");
                  LCD_putcmd(0x80);
                  Printf(LCD_putchar,"Freq = ");

                  while (TRUE)
                  {
                  if (CCP1Captured)
                  {
                  Convert_CCP1();
                  LCD_putcmd(0x87);
                  if (char1 != 0x30) LCD_putchar(char1);
                  if (((char1 != 0x30) && (char2 == 0x30)) || (char2 != 0))
                  LCD_putchar(char2);
                  LCD_putchar(char3);
                  LCD_putchar(".");
                  LCD_putchar(char4);
                  LCD_putchar(char5);
                  switch (mode)
                  {
                  case 0: {LCD_putchar(char6);lcd_putcmd(0x8F);Printf(LCD_pu tchar," Hz");} break;
                  case 1: {LCD_putchar(char6);lcd_putcmd(0x8F);Printf(LCD_pu tchar,"KHz");} break;
                  case 2: {LCD_putchar(char6);lcd_putcmd(0x8F);Printf(LCD_pu tchar,"MHz");} break;
                  }
                  printf("Freq:%f\r\n",Freq);
                  CCP1Captured = FALSE;
                  }
                  convert_timer0_value();
                  LCD_putcmd(0xCa);
                  LCD_putchar(count1);
                  LCD_putchar(count2);
                  LCD_putchar(count3);
                  }
                  }
                  cám ơn anh nhìu nhìu....
                  và tiện đây cho em hỏi luôn ạ. em đã nạp chương trình của anh chạy vào PÍC6F, dầu vào là RC2(ccp1) là SRF05 +lcd1602 nhưng gia trị hiển thị lên LCD toàn số 0, ko bít sao nhỉ?

                  Comment


                  • it is my bad, nothing is wrong with the code

                    Comment


                    • Nguyên văn bởi Xtronic Xem bài viết
                      it is my bad, nothing is wrong with the code
                      vậy sao?????

                      Comment


                      • #bit TMR1IF = 0x0C.0 -> Đây không phải là lệnh, đây là khai báo địa chỉ bit cờ ngắt Timer 1, xem datasheet sẽ thấy có bít này.

                        Code:
                        if(TMR1IF)
                        {
                        CCP1Value = CCP_1 +(65535-CCP1OldValue);  sao anh lại có công thức này nhỉ?
                        CCP1OldValue = CCP_1; ???
                        TMR1IF=0;                 ??????????
                        
                        }
                        else
                        {
                        CCP1Value = CCP_1 - CCP1OldValue;
                        CCP1OldValue = CCP_1;
                        }
                        Đây là 2 cách tính giá trị độ rộng xung khi dùng CCP Module. Nguyên tắc hoạt động của CCP là khi có sườn xung thì nó sẽ copy giá trị của Timer 1 vào thanh ghi CCP_1.
                        Như vậy nếu tại sườn 1, ta copy giá trị này vào CCP1OldValue, đến sườn tiếp theo ta lấy hiệu CCP_1 - CCP1OldValue thì sẽ có được giá trị độ rộng xung tính theo số xung clock hệ thống mà Timer 1 đếm được, từ đó tính ra được tần số. Lưu ý là Timer 1 lúc này chạy liên tục ở chế độ 16bits, nhận clock từ hệ thống, theo hệ số chia do user đặt.
                        @Anh_Gioi: Em vẽ ra giản đồ thời gian xung vuông và so sánh với chu kỳ ngắt Timer 1 cho 2 trường hợp:
                        1. Hai sườn xung nằm trong khoảng thời gian ngắt Timer 1 -> tương ứng với lệnh trong else
                        2. có sườn xung thứ nhất, tiếp theo có ngắt Timer1, rồi sau mới có sườn thứ 2 -> Tương ứng với điều kiện If bằng true.

                        -----------______------ ______
                        Xung : ___|----- |_____|-------|______

                        Timer1: -|-----------------------|------

                        TMR1IF = 1
                        -----------______------ ______
                        Xung : ___|------|_____|------|______

                        Timer1: -|------------|-----------------
                        Last edited by linhnc308; 13-10-2008, 10:59.
                        Ethernet-RS232, PIC Webserver, RFID Reader
                        CallerID, Cảnh báo BTS, ...
                        0988006696
                        linhnc308@gmail.com
                        http://linhnc308.blogspot.com

                        Comment


                        • Nguyên văn bởi linhnc308 Xem bài viết
                          #bit TMR1IF = 0x0C.0 -> Đây không phải là lệnh, đây là khai báo địa chỉ bit cờ ngắt Timer 1, xem datasheet sẽ thấy có bít này.

                          Code:
                          if(TMR1IF)
                          {
                          CCP1Value = CCP_1 +(65535-CCP1OldValue);  sao anh lại có công thức này nhỉ?
                          CCP1OldValue = CCP_1; ???
                          TMR1IF=0;                 ??????????
                          
                          }
                          else
                          {
                          CCP1Value = CCP_1 - CCP1OldValue;
                          CCP1OldValue = CCP_1;
                          }
                          Đây là 2 cách tính giá trị độ rộng xung khi dùng CCP Module. Nguyên tắc hoạt động của CCP là khi có sườn xung thì nó sẽ copy giá trị của Timer 1 vào thanh ghi CCP_1.
                          Như vậy nếu tại sườn 1, ta copy giá trị này vào CCP1OldValue, đến sườn tiếp theo ta lấy hiệu CCP_1 - CCP1OldValue thì sẽ có được giá trị độ rộng xung tính theo số xung clock hệ thống mà Timer 1 đếm được, từ đó tính ra được tần số. Lưu ý là Timer 1 lúc này chạy liên tục ở chế độ 16bits, nhận clock từ hệ thống, theo hệ số chia do user đặt.
                          @Anh_Gioi: Em vẽ ra giản đồ thời gian xung vuông và so sánh với chu kỳ ngắt Timer 1 cho 2 trường hợp:
                          1. Hai sườn xung nằm trong khoảng thời gian ngắt Timer 1 -> tương ứng với lệnh trong else
                          2. có sườn xung thứ nhất, tiếp theo có ngắt Timer1, rồi sau mới có sườn thứ 2 -> Tương ứng với điều kiện If bằng true.

                          -----------______------ ______
                          Xung : ___|----- |_____|-------|______

                          Timer1: -|-----------------------|------

                          TMR1IF = 1
                          -----------______------ ______
                          Xung : ___|------|_____|------|______

                          Timer1: -|------------|-----------------
                          sau 1 vài đêm suy nghĩ em đã xuất ra 1 bản code để đo khoảngc ách dùng siêu âm SRF05.
                          RC2--input ECHO
                          D1 - output trigger
                          #include <16F877A.h>
                          #include <F:\NCKH 2009\PIC 16\count_timer2\def_877a.h>
                          #use delay(clock=2000000)
                          #fuses HS,NOWDT, NOPROTECT
                          #include <F:\NCKH 2009\PIC 16\count_timer2\LCD_lib_4bit.c>
                          int16 CCP1Value;
                          int16 CCP1OldValue;
                          BOOLEAN CCP1Captured;
                          float S,count;
                          int8 char1,char2,char3;
                          #int_CCP1 // Ngat do CCCP1 xay ra, thuc hien lenh...
                          CCP1_isr()
                          {
                          CCP1Value = CCP_1 - CCP1OldValue;
                          CCP1OldValue = CCP_1;
                          CCP1Captured = TRUE;
                          }
                          //--------------------------------------------------------------------------
                          void Init_ccp(void) //Khoi tao chuc nang CCCP
                          {
                          setup_ccp1(CCP_CAPTURE_RE);
                          setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
                          CCP1Value = 0;
                          CCP1OldValue = 0;
                          CCP1Captured = TRUE;
                          enable_interrupts(INT_CCP1);
                          enable_interrupts(GLOBAL);
                          }
                          //--------------------------------------------------------------------------
                          void Convert_CCP1()
                          {

                          long temp;
                          int8 temp2;
                          //----- thoi gian SRF doc duoc
                          count = CCP1Value*1.6e-6;
                          // Timer1 prescaler DIV_BY_8
                          //Freq = 1.0/((float)CCP1Value*8e-6);
                          //-------- khoang cach can do--
                          S = count/58;
                          //--------chuyen sang BCD----
                          temp = (long)S;
                          char1 = ((temp / 100) + 0x30);
                          temp2 = (temp % 100);
                          char2 = ((temp2 / 10) + 0x30);
                          char3 = ((temp2 % 10) + 0x30);
                          //-----hien thi LCD----
                          LCD_putcmd(0x80);
                          LCD_putchar("S = ");
                          LCD_putcmd(0x8B);
                          LCD_putchar(" Cm");
                          LCD_putcmd(0x84);
                          LCD_putchar(char1);
                          LCD_putcmd(0x85);
                          LCD_putchar(char2);
                          LCD_putcmd(0x86);
                          LCD_putchar(char3);
                          LCD_putcmd(0xC5);
                          LCD_putchar("Anh_Gioi");

                          }
                          void main()
                          {
                          Init_ccp();
                          LCD_init();


                          while (TRUE) {
                          //---- 10uS cho trgger ----
                          output_high(pin_d1);
                          delay_us(10);
                          output_low(pin_d1);
                          if (CCP1Captured)

                          Convert_CCP1();
                          }
                          }
                          kết quả là hiển thị toàn số 0 ,hức..không bít em còn sai chỗ nào nữa,mong mọi người giúp đỡ típ,
                          cuối tuần này em phải nộp cho thầy rùi mà vẫn chưa xong...Hi vọng có sự hỗ trợ tiếp từ bên các anh !

                          Comment


                          • thay thế count = CCP1Value*1.6e-6; bởi count = CCP1Value; thôi để check xem giá trị của CCP1 là bao nhiêu, vì khi em thưc hiện phép nhân với 1.6e-6 sẽ có giá trị rất nhỏ. Nên tính toàn lại cho hàm convert để có giá trị hiển thị đúng. Chú ý giá trị timer của em là DIV_8. Do đó khi tính lại giá trị cho Count, em phải tính lại và phải dùng đến giá trị thạch anh 20MHz.
                            1 gia tri dem cua timer bang tan so he thong chia cho 8, nhu vay tan so cua timer la 20M/8 -> tu do, ung voi gia tri cua Timer thi se tinh ra duoc tan so dau vao hay thoi gian giua 2 xung.
                            Ethernet-RS232, PIC Webserver, RFID Reader
                            CallerID, Cảnh báo BTS, ...
                            0988006696
                            linhnc308@gmail.com
                            http://linhnc308.blogspot.com

                            Comment


                            • Nguyên văn bởi linhnc308 Xem bài viết
                              thay thế count = CCP1Value*1.6e-6; bởi count = CCP1Value; thôi để check xem giá trị của CCP1 là bao nhiêu, vì khi em thưc hiện phép nhân với 1.6e-6 sẽ có giá trị rất nhỏ. Nên tính toàn lại cho hàm convert để có giá trị hiển thị đúng. Chú ý giá trị timer của em là DIV_8. Do đó khi tính lại giá trị cho Count, em phải tính lại và phải dùng đến giá trị thạch anh 20MHz.
                              1 gia tri dem cua timer bang tan so he thong chia cho 8, nhu vay tan so cua timer la 20M/8 -> tu do, ung voi gia tri cua Timer thi se tinh ra duoc tan so dau vao hay thoi gian giua 2 xung.
                              như vậy là đoạn code của em cũng đúng phải không ạ.
                              bây giờ em phải tính lại thời gian,em dùng thạch anh 20M thì công thức thời gian đọc được
                              Freq = 1.0/((float)CCP1Value*8e-6);
                              là đúng mà anh????
                              như anh nói thì như vậy thời gian =20M/8*giá trị timer;
                              quãng đường em do được S = thòi gian/58(cm) cóphải không ạ?
                              Last edited by anh_gioi; 15-10-2008, 22:07.

                              Comment


                              • Em đang làm đề tài tốt nghiệp về PIC_Internet anh có thể cho em xin cái code và mạch Layout được ko?Tối qua vô trang web kia www.Olimex.com mà ko tìm thấy code.Giúp em cái.Em cảm ơn!

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X