.................................................. ....................
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
-
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
-
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);
}
}
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
-
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; }
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; }
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: -|------------|-----------------
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();
}
}
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ếtthay 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.
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
Bài viết mới nhất
Collapse
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi nguyendinhvanNó là di chứng của cái bệnh thành tích, hình thức. Nếu không chữa trị đúng thày đúng thuốc thì sau này dễ biến chứng thành căn bệnh ảo.
Dẫu sao thì khoa học kỹ thuật công nghệ cũnc· cần kết hợp với cúng lễ ạ.
Cầu Thiên...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 22:15 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi mèomướpDạ hồi năm ngoái cháu trốn học buổi sáng về rình rồi ạ. Cụ trưởng bản vào nhà chị ấy thì chính cụ ấy mới là người rên la ấy ạ, khi đi ra thì cụ ấy tóc tai quần áo xộc xệch chân đi loạng quạng lắm ạ. Chỉ có anh thợ sửa...
-
Channel: Tâm tình dân kỹ thuật
02-03-2025, 10:57 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi vi van phamHôm nào mèo rình cụ trưởng bản sang nhà chị hàng xóm, chờ khi chị hàng xóm rên la, méo phá cửa vào nhà giúp đỡ chị ấy rồi báo cáo kết quả lên diễn đàn nhé.
Chúc mèo lành lặn, ko mất sợi lông mèo nào. đó là kết quả chữ Tâm của người không cần sự giúp đỡ....
-
Channel: Tâm tình dân kỹ thuật
02-03-2025, 08:00 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi vi van phamOK với bác.
Máy nó bán còn không cho tài liệu s/c. Phải bỏ tiền ra mua mới có tài liệu sc, nó chỉ cho tài liệu sử dụng mà thôi....-
Channel: Tâm tình dân kỹ thuật
02-03-2025, 07:56 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi tuyennhanMình phải đắc đạo rồi thì mới độ được cho người vậy nên TÂM NHƯ NĂNG TỈNH mới tốt .
Khi xưa tôi nhờ phòng văn thư dùng mail công ty gửi cho hãng hỏi về một chi tiết kỹ thuật và mua linh kiện , hãng nó trả lời xin liên lạc...-
Channel: Tâm tình dân kỹ thuật
02-03-2025, 07:04 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi dinhthuong80ĐT em dốt tiếng Anh, nên chỉ cứ tưởng họ hay nói câu cầu khiến dạng:
VERB/VERB.ING + PLEASE
Giờ được bác hiểu rộng và có tâm chỉ bảo em mới biết thêm cấu trúc:
ADJ + PLEASE
Quả là như bác bác...-
Channel: Tâm tình dân kỹ thuật
02-03-2025, 06:20 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi mèomướpDạ cháu hông đồng ý với ý kiến của bác vi... ạ, mặc dù cháu biết bác rất thật lòng, rất muốn điều tốt đẹp đến cho chú dinh...nhưng xã hội nó vốn đã vậy rồi, mình giúp đỡ hay rộng hơn là bất cứ 1 tác động gì đến người...
-
Channel: Tâm tình dân kỹ thuật
01-03-2025, 20:39 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi vi van phamGiúp đỡ người ko cần trợ giúp, đôi khi chữ Tâm còn thiếu chưa đủ nghĩa, phải thêm vào chữ Nhẫn phía trước thành chữ Nhẫn Tâm.
Thí dụ bạn làm trong cty chuyên về điện tử, buổi họp hàng tuần diễn ra, bạn góp ý với bạn...-
Channel: Tâm tình dân kỹ thuật
01-03-2025, 18:02 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi dinhthuong80Chẳng giấu gì bác, ngành em học lúc trước thật chả ai dám nhận vào làm bất cứ công việc chuyên môn nào đâu, nói ra sợ cả nhà cùng cười: cử nhân Vật Lí Ứng Dụng!
Chữ TÂM em nói ở bài trước, trước là với ý hẹp hòi lắm:...-
Channel: Tâm tình dân kỹ thuật
01-03-2025, 12:32 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi mèomướpDạ chú nhat... sang tàu rồi buồn ghê ạ, chú tuyen... chắc ngày trước đã gặp được nhìu đàn anh tốt bụng chỉ bảo. Bàn về chữ TÂM thì cháu chưa rõ các chú hiểu như thế nào. Cháu thì thấy với những người tốt đã biết nhau đủ lâu,...
-
Channel: Tâm tình dân kỹ thuật
01-03-2025, 11:47 -
Comment