Nguyên văn bởi minh_cly
Xem bài viết
Thông báo
Collapse
No announcement yet.
cảm biến siêu âm SRF05 với PIC 16F877a!!!!!!!!!!!!!!!!!!!!!!!!!!
Collapse
X
-
Nguyên văn bởi chungpmth Xem bài viếtbạn ơi sao vẫn không được nhỉ bạn test thử code này chưa mình mãi mà không được????Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
nó cứ hiện có mỗi dist = -1 tớ đo thì vẫn có xung về tức là có tín hiệu
nhưng không hiểu là sao
không biết hàm ngắt thế nào nữa
#int_TIMER1
void TIMER1_isr(void) {
if (has_echo == 0) {
has_echo = 1; // Tràn timer mà ko có echo thì cho wa (tối đa của SRF05 là 30ms, tràn timer là 52ms)
dist = -1; // Số này bạn muốn cho sao cũng đc, tức là ko đo được
}
}
vấn đề có thể vẫn là chổ này
Comment
-
Nguyên văn bởi chungpmth Xem bài viếtnó cứ hiện có mỗi dist = -1 tớ đo thì vẫn có xung về tức là có tín hiệu
nhưng không hiểu là sao
không biết hàm ngắt thế nào nữa
#int_TIMER1
void TIMER1_isr(void) {
if (has_echo == 0) {
has_echo = 1; // Tràn timer mà ko có echo thì cho wa (tối đa của SRF05 là 30ms, tràn timer là 52ms)
dist = -1; // Số này bạn muốn cho sao cũng đc, tức là ko đo được
}
}
vấn đề có thể vẫn là chổ này
Bạn sửa lại như thế này xem sao:
Code:#int_CCP1 void ccp1_isr() { if(pin_c2) { // Nếu là xung cạnh lên set_timer1(0); // Reset timer1 về 0 setup_ccp1(CCP_CAPTURE_FE); // Chuyển Capture 1 đo cạnh xuống } if(!pin_c2) { // Nếu là xung cạnh xuống getvar=get_timer1(); // Đọc giá trị timer 1 dist=(getvar*0.8)/58; // Mỗi 1 nhịp của timer 1 tương ứng vs 0.8 us, lấy us chia cho 58 ra cm setup_ccp1(CCP_CAPTURE_RE); // Chuyển Capture 1 đo xung lên trở lại has_echo = 1; // Đã nhận xong echo disable_interrupts(int_TIMER1); // Tắt ngắt timer 1 } } #int_TIMER1 void TIMER1_isr(void) { if (has_echo == 0) { has_echo = 1; // Tràn timer mà ko có echo thì cho wa (tối đa của SRF05 là 30ms, tràn timer là 52ms) dist = -1; // Số này bạn muốn cho sao cũng đc, tức là ko đo được } disable_interrupts(int_TIMER1); // Tắt ngắt timer 1 } void trig() { output_high(TRIGGER); delay_us(10); output_low(TRIGGER); } void main() { SET_TRIS_B(0X00); SET_TRIS_C(0xff); lcd_init(); setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //20 MHz thì tràn trong 52ms (tối đa xung của SRF05 là 30ms) setup_ccp1(CCP_CAPTURE_RE); // Thiết lập Capture 1 đo cạnh lên enable_interrupts(int_TIMER1); // Ngắt timer 1, đề phòng trường hợp ko có echo enable_interrupts(INT_CCP1); // Ngắt Capture 1 enable_interrupts(GLOBAL); while(1) { set_timer1(0); // Reset timer1 về 0 enable_interrupts(int_TIMER1); // Bật ngắt timer 1 has_echo = 0; // Xác lập lại echo trig(); // Trigger while (has_echo == 0) { } // chờ đến khi nhận hết echo lcd_putcmd(0x01); printf(lcd_putchar,"dist=%6.1f",dist); lcd_putchar("cm"); delay_ms(100); // 0.1 s đo một lần } }
Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
Bạn cần sửa chỗ in đậm
#int_CCP1
void ccp1_isr()
{
if(input(pin_c2)) { // Nếu là xung cạnh lên
set_timer1(0); // Reset timer1 về 0
setup_ccp1(CCP_CAPTURE_FE); // Chuyển Capture 1 đo cạnh xuống
}
else { // Nếu là xung cạnh xuống
getvar=CCP_1; // Đọc giá trị timer 1
dist=(getvar*0.8)/58; // Mỗi 1 nhịp của timer 1 tương ứng vs 0.8 us, lấy us chia cho 58 ra cm
setup_ccp1(CCP_CAPTURE_RE); // Chuyển Capture 1 đo xung lên trở lại
has_echo = 1; // Đã nhận xong echo
disable_interrupts(int_TIMER1); // Tắt ngắt timer 1
}
}
đồng thời bạn nên cộng thêm một hàm offset để bảo đảm sai số quá trình.
Chúc vui!
Comment
-
Nguyên văn bởi elvies Xem bài viếtBạn cần sửa chỗ in đậm
#int_CCP1
void ccp1_isr()
{
if(input(pin_c2)) { // Nếu là xung cạnh lên
set_timer1(0); // Reset timer1 về 0
setup_ccp1(CCP_CAPTURE_FE); // Chuyển Capture 1 đo cạnh xuống
}
else { // Nếu là xung cạnh xuống
getvar=CCP_1; // Đọc giá trị timer 1
dist=(getvar*0.8)/58; // Mỗi 1 nhịp của timer 1 tương ứng vs 0.8 us, lấy us chia cho 58 ra cm
setup_ccp1(CCP_CAPTURE_RE); // Chuyển Capture 1 đo xung lên trở lại
has_echo = 1; // Đã nhận xong echo
disable_interrupts(int_TIMER1); // Tắt ngắt timer 1
}
}
đồng thời bạn nên cộng thêm một hàm offset để bảo đảm sai số quá trình.
Chúc vui!Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
Nguyên văn bởi lambk89 Xem bài viếtBạn ơi? Sao mình chạy thử code trên không đươc nhỉ. Mình thấy cái ngắt và timer thì không được gọi tới trong hàm main. Mong bạn giải thích giùm.Computer Science major - Vietnamese-German University
Sponsored by
Comment
-
Nguyên văn bởi lambk89 Xem bài viếthajxx! Mình đang chạy mạch thử đây mà không thấy được j. nản ghê. Không biết ai đã chạy thành công mạch trên giúp đỡ mình với.
code day:
//nguyen van duc
//KS tu dong hoa
//cong thuc tinh thoi gian T= (65536-VALUE)*(4/Fosc)*P
#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(d)//Dùng cái này thì trong chu+o+ng trình khi dùng các le^.nh io nhu+ output_low() , . . . nó se~ set chi? vo+'i 1 le^.nh ,
#use fast_io(b)
#use fast_io(a)
int16 thoigiantruyen,CCP1value;
int16 CCP1Oldvalue;
BOOLEAN CCP1Captured;
int8 hangdonvi,hangchuc,hangtram;
int16 ketqua;
int8 i,k;
#INT_CCP1
void ngat_ccp1()
{
set_timer1(0);
}
#INT_CCP2
void ngat_ccp2()
{
CCP1Value =CCP_2;
CCP_2=0;
CCP1Captured = TRUE;
//j=0;
}
#INT_TIMER0
void interrup_timer0()
{i++;
set_timer0(8);
if(i==5){
output_d(hangtram);
output_high(pin_d5);
}
if(i==10){
output_d(hangchuc);
output_high(pin_d6);}
if(i==15){
output_d(hangdonvi);
output_high(pin_d7);}
if(i>=16){i=0;}
}
void triger()
{
output_high(PIN_A0);
delay_us(12);
output_low(PIN_A0);
}
void init_ccp()
{
setup_ccp1(CCP_capture_RE);//do xung canh len R
setup_ccp2(CCP_capture_FE);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //tang mot gia tri timer1 mat 4/5uS
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
CCP1value=0;
CCP1Oldvalue=0;
CCP1Captured=TRUE;
enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
void Main()
{
init_ccp();
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0xff); //ff xac lap cac chan port C la chan input
set_tris_a(0x00);
set_timer0(8);
while(true){
delay_ms(100);
triger();
if(CCP1Captured){
thoigiantruyen=CCP1value*0.8;
ketqua=thoigiantruyen/58;
CCP1Captured=FALSE;
if(ketqua>999){hangdonvi=0;hangchuc=0;hangtram=0;}
else{
hangdonvi=ketqua%10;
hangchuc=(ketqua/10)%10;
hangtram=(ketqua/100);
}
}
if(ketqua<175){output_high(PIN_A1);
delay_ms(500);
k=0;}
k++;
if(k>=5){
output_low(PIN_A1);
delay_ms(500);
k=0;
}
}
}
Comment
-
bạn chủ bài ôi! mình cũng đang làm đề tài giống bạn. Cho mình xin file capture đk k?
Nguyên văn bởi dktdk13 Xem bài viếtcái này mình làm rồi, mạch chạy rồi nhưng nản quá đó cái gì mà nó có bề mặt phẳng như mặt nước, mặt kính thì được chứ với vật liệu rời thành đống hình chóp như đá, quặng thì sai toe toét...
code day:
//nguyen van duc
//KS tu dong hoa
//cong thuc tinh thoi gian T= (65536-VALUE)*(4/Fosc)*P
#include <16F877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(d)//Dùng cái này thì trong chu+o+ng trình khi dùng các le^.nh io nhu+ output_low() , . . . nó se~ set chi? vo+'i 1 le^.nh ,
#use fast_io(b)
#use fast_io(a)
int16 thoigiantruyen,CCP1value;
int16 CCP1Oldvalue;
BOOLEAN CCP1Captured;
int8 hangdonvi,hangchuc,hangtram;
int16 ketqua;
int8 i,k;
#INT_CCP1
void ngat_ccp1()
{
set_timer1(0);
}
#INT_CCP2
void ngat_ccp2()
{
CCP1Value =CCP_2;
CCP_2=0;
CCP1Captured = TRUE;
//j=0;
}
#INT_TIMER0
void interrup_timer0()
{i++;
set_timer0(8);
if(i==5){
output_d(hangtram);
output_high(pin_d5);
}
if(i==10){
output_d(hangchuc);
output_high(pin_d6);}
if(i==15){
output_d(hangdonvi);
output_high(pin_d7);}
if(i>=16){i=0;}
}
void triger()
{
output_high(PIN_A0);
delay_us(12);
output_low(PIN_A0);
}
void init_ccp()
{
setup_ccp1(CCP_capture_RE);//do xung canh len R
setup_ccp2(CCP_capture_FE);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); //tang mot gia tri timer1 mat 4/5uS
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
CCP1value=0;
CCP1Oldvalue=0;
CCP1Captured=TRUE;
enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
void Main()
{
init_ccp();
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0xff); //ff xac lap cac chan port C la chan input
set_tris_a(0x00);
set_timer0(8);
while(true){
delay_ms(100);
triger();
if(CCP1Captured){
thoigiantruyen=CCP1value*0.8;
ketqua=thoigiantruyen/58;
CCP1Captured=FALSE;
if(ketqua>999){hangdonvi=0;hangchuc=0;hangtram=0;}
else{
hangdonvi=ketqua%10;
hangchuc=(ketqua/10)%10;
hangtram=(ketqua/100);
}
}
if(ketqua<175){output_high(PIN_A1);
delay_ms(500);
k=0;}
k++;
if(k>=5){
output_low(PIN_A1);
delay_ms(500);
k=0;
}
}
}
Rất mong nhận đk hồi âm của bạn sớm
Comment
-
đo được khoảng cách rồi thì điều khiển động cơ bước đơn giản thôi mà, nối chung 1 đầu cuộn dây các pha của động cơ bước lại nối với GND rồi dùng transistor đóng VCC vào các đầu còn lại theo vòng tròn thôi mà, nhớ có con diode mắc từ E->C trasistor bảo vệ tiếp giáp BE. Không nếu có điều kiện thì dùng L298-L297 là ok nhưng cái này rất là mắc đó.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Tiếng Anh cho người Việtbởi nhathung1101Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.
Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.
Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...-
Channel: Tâm tình dân kỹ thuật
hôm nay, 22:18 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.
Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...-
Channel: Tâm tình dân kỹ thuật
hôm nay, 14:51 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.
Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...-
Channel: Tâm tình dân kỹ thuật
hôm nay, 14:39 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.
Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...-
Channel: Tâm tình dân kỹ thuật
hôm nay, 14:28 -
-
Trả lời cho Tiếng Anh cho người Việtbởi bqvietĐúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 20:26 -
-
Trả lời cho Tiếng Anh cho người Việtbởi mèomướpDạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 12:32 -
-
Trả lời cho Tiếng Anh cho người Việtbởi vi van phamNhững lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).
Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...-
Channel: Tâm tình dân kỹ thuật
20-02-2025, 21:31 -
-
Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )bởi bqvietThiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.20-02-2025, 17:22
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Tiếng Anh, Đình Thường phải nói là rất tệ, khiến việc giao tiếp đời thường thôi cũng khó chứ nói gì về kĩ thuật.
Nhân tiện, nhờ các bạn, các bác xem giúp thư ĐT viết thế này liệu có thể gửi tới địa chỉ nhận hay chăng,...-
Channel: Tâm tình dân kỹ thuật
20-02-2025, 11:52 -
-
Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )bởi vi van phamUống rượu 1 mình, thấy trang này nhớ lại cách đây vài chục năm hàn thiếc với inox cực kỳ khó, phải dùng acid Hcl tác dụng lên kẻm Zn để có Zncl2 làm thuốc trợ hàn, lúc đó làm gì có acid Hcl và thuốc trợ hàn?
Cái khó bó cái...19-02-2025, 23:05
Comment