mấy a chỉ cho e cách dùng nhiều ngắt trong lập trình vdk 8051 với. e đang lam bài tập có đề là như thế này:viết chương trình ngắt timer để tạo đồng thời 2 sóng vuông 1khz và 50khz tại p1.0 và p1.1 (tần số dao động của thạch anh 12Mhz)
Thông báo
Collapse
No announcement yet.
cách dùng nhiều ngắt cho 8051
Collapse
X
-
Nguyên văn bởi imyour_nnc Xem bài viếtmấy a chỉ cho e cách dùng nhiều ngắt trong lập trình vdk 8051 với. e đang lam bài tập có đề là như thế này:viết chương trình ngắt timer để tạo đồng thời 2 sóng vuông 1khz và 50khz tại p1.0 và p1.1 (tần số dao động của thạch anh 12Mhz)
Last edited by chung1608; 23-12-2011, 17:28.
-
Nguyên văn bởi OoMrBayoO Xem bài viếtÈo cái này làm gì mà bạn phải dùng tới 2 ngắt vậy. Cái này dùng 1 ngắt Timer chế độ 16bits là được.
Comment
-
Bạn dùng 1 Timer bất kì rồi nhân lên thành 10 con hay 100 con hay 255 con timer rồi dùng dần
Ví dụ như sử dụng ngắt timer để tạo ra 32 con timer khác rồi sử dụng tạo 32 xung với 32 tần số khác nhau đưa ra 32 chân chíp ...
Bạn thử làm với ý tưởng này nhé ... Chúc thành công.
Comment
-
ý bạn đấy là thế này chứ đâu phải 1 timer thực hiện 2 ngắt 1 lúc
Code:time0: inc dem mov a,dem cjne a,do_sang_red,clr_pwm_green clr pwm_red clr_pwm_green: cjne a,do_sang_green,clr_pwm_blu clr pwm_green clr_pwm_blu: cjne a,do_sang_blu,setb_pwm clr pwm_blu setb_pwm: cjne a,#255,exit mov p0,#0ffh exit: reti
Comment
-
Nguyên văn bởi anh_hung_21 Xem bài viếtbạn ơi 1 timer làm sao có thể thực hiện 2 ngắt cùng 1 lần dc hả bạn,bạn thử đưa ra 1 vị dụ để thuyết phục mọi ng đi
Comment
-
Mình lấy ví dụ thế này nhé, để dễ hiểu mình trình bầy thuật toán là chính có dùng thêm code C các bạn tùy vào môi trường lập trình và ngôn ngữ sử dụng mà thay đổi cho thích hợp nhé ...
1. Ý tưởng: Ngày xưa mình học Vi điều khiển và PLC song song (PLC S7200 - siements) mình có nhận xét thế này:
Con PLCs7200 trong nó cũng chỉ là một con vi diều khiển họ 8051 vậy mà trong khi sử dụng môi trường lập trình của nó ta có thể chon độ phân giải timer và có rất nhiều timer để sử dụng ... vậy thì phần cứng nào đáp ứng được điều này. Mình đã tìm ra câu trả lời tất cả nằm ở phần mềm.
2. Không cam chịu: Vi điều khiển cũng có thể làm được chỉ có điều phải khá thận trọng trong việc xử lý ngắt timer tránh việc thời gian xử lý các câu lệnh trong ngắt lớn hơn thời gian ngắt của timer
3. Thử lập trình tạo ra 8 con timer để nháy 8 con led với 8 tân số khác nhau trong một dải tần số hạn chế nào đó
Bước 1: Cài đặt và tạo một ngắt timer khoảng 1ms tùy bạn
Bước 2: Khai báo biến để sử dụng
int timer_tutao(8)={}; //khai báo biến mảng cho dễ dùng ... tùi ý đặt tên
Bước 3: Viết thêm lệnh trong hàm ngắt của timer nhằm mục đích đếm tăng các biến vừa khai báo
Ngat_timer()
{
for (i=0,i<=7,i++)
{
timer_tutao[i] = timer_tutao[i] +1;
}
}
Như vậy vô hình chung ta đã tạo được 8 time line độ phân giải 1ms, chạy từ 0 đến 65535 ( int mà - tùi vào ứng dụng ta dùng kiểu biến cho hợp lí )
Bước 4: Sử dụng timer chúng ta vừa tạo ra trong chương trình chính như thế nào ?
void main()
{
// -------------- các lệnh khởi tạo ban đầu --------
// trước khi sử dụng timer_tutao nào đó ta reset giá trị cho timer đó
timer_tutao[0] = 0;
timer_tutao[4] = 0;
timer_tutao[7] = 0;
// ----------- hết các lệnh khởi tạo ban đầu -------
while(1) // vòng lặp chính của chương trình
{
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 10% ------------------
if ((timer_tutao[0] >0) & (timer_tutao[0]<100)) {led1 = 0;}
if ((timer_tutao[0] >=100) & (timer_tutao[0]<1000)) {led1 = 1;}
if (timer_tutao[0] >= 1000) { timer_tutao[0]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1/T = 1 / 0.2 = 5hz độ đầy 50%
if ((timer_tutao[4] >0) & (timer_tutao[4]<100)) {led2 = 0;}
if ((timer_tutao[4] >=100) & (timer_tutao[4]<200)) {led2 = 1;}
if (timer_tutao[4] >= 200) { timer_tutao[4]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 50% ------------------
if ((timer_tutao[7] >0) & (timer_tutao[7]<500)) {led3 = 0;}
if ((timer_tutao[7] >=500) & (timer_tutao[7]<1000)) {led3 = 1;}
if (timer_tutao[7] >= 1000) { timer_tutao[7]=0;}
}
}
Bước 5: Triển khai và những ứng dụng mở rộng
Với cách viết như vậy ta có thể linh hoạt hơn trong việc quy hoạch chương trình chính, chương trính viết khéo sẽ không bị dừng tại đâu cả liên tục thực hiện qua các hàm và chương trình con.
Ta có thể phân bổ cho chương trình quét nút sau khoảng 100ms quét 1 lần , hiẻn thị LCD không nhất thiết phải bắng tằng tằng dữ liệu lên cho khoảng 40 ms cập nhật một lần (LCD không cần phải có tần số làm tươi lớn hơn 30 hình 1s làm gì cho phí hiệu năng của chíp), quét sensor dò đường 10ms một lần, quét cảm biến vật cản trước của robot 50ms, chống nhiễu rung tiếp điểm, trễ thời gian không chết chương tình ...vv ...
Đây cũng chính là bước đầu tiên để tập tành thực hiện viết một nhân hệ điều hành on chip vô cùng vô cùng cơ bản và ít tính năng.
Hi vọng với ý tưởng trên đây những bạn đang học lập trình Vi điều khiển sẽ có thêm một công cụ mới ý tưởng mới cho các đề tài lớn. Chúc vui.
Các bạn hãy thử cùng phân tích ưu điểm và nhược điểm của công cụ nhân bản timer này nhé ... !
Comment
-
Nguyên văn bởi namctmc Xem bài viếtCác anh ơi giúp em cái này với ạ
So sánh 2 phương pháp lập trình tạo trễ trong 8051 là
1. Dùng Timer.
2. Dùng vòng lặp.
Em cảm ơn các anh trước ạ.Website chính thức đổi địa chỉ website thành
Mời các bạn ghé thăm !!!
Comment
-
Nguyên văn bởi robot_arm Xem bài viếtMình lấy ví dụ thế này nhé, để dễ hiểu mình trình bầy thuật toán là chính có dùng thêm code C các bạn tùy vào môi trường lập trình và ngôn ngữ sử dụng mà thay đổi cho thích hợp nhé ...
1. Ý tưởng: Ngày xưa mình học Vi điều khiển và PLC song song (PLC S7200 - siements) mình có nhận xét thế này:
Con PLCs7200 trong nó cũng chỉ là một con vi diều khiển họ 8051 vậy mà trong khi sử dụng môi trường lập trình của nó ta có thể chon độ phân giải timer và có rất nhiều timer để sử dụng ... vậy thì phần cứng nào đáp ứng được điều này. Mình đã tìm ra câu trả lời tất cả nằm ở phần mềm.
2. Không cam chịu: Vi điều khiển cũng có thể làm được chỉ có điều phải khá thận trọng trong việc xử lý ngắt timer tránh việc thời gian xử lý các câu lệnh trong ngắt lớn hơn thời gian ngắt của timer
3. Thử lập trình tạo ra 8 con timer để nháy 8 con led với 8 tân số khác nhau trong một dải tần số hạn chế nào đó
Bước 1: Cài đặt và tạo một ngắt timer khoảng 1ms tùy bạn
Bước 2: Khai báo biến để sử dụng
int timer_tutao(8)={}; //khai báo biến mảng cho dễ dùng ... tùi ý đặt tên
Bước 3: Viết thêm lệnh trong hàm ngắt của timer nhằm mục đích đếm tăng các biến vừa khai báo
Ngat_timer()
{
for (i=0,i<=7,i++)
{
timer_tutao[i] = timer_tutao[i] +1;
}
}
Như vậy vô hình chung ta đã tạo được 8 time line độ phân giải 1ms, chạy từ 0 đến 65535 ( int mà - tùi vào ứng dụng ta dùng kiểu biến cho hợp lí )
Bước 4: Sử dụng timer chúng ta vừa tạo ra trong chương trình chính như thế nào ?
void main()
{
// -------------- các lệnh khởi tạo ban đầu --------
// trước khi sử dụng timer_tutao nào đó ta reset giá trị cho timer đó
timer_tutao[0] = 0;
timer_tutao[4] = 0;
timer_tutao[7] = 0;
// ----------- hết các lệnh khởi tạo ban đầu -------
while(1) // vòng lặp chính của chương trình
{
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 10% ------------------
if ((timer_tutao[0] >0) & (timer_tutao[0]<100)) {led1 = 0;}
if ((timer_tutao[0] >=100) & (timer_tutao[0]<1000)) {led1 = 1;}
if (timer_tutao[0] >= 1000) { timer_tutao[0]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1/T = 1 / 0.2 = 5hz độ đầy 50%
if ((timer_tutao[4] >0) & (timer_tutao[4]<100)) {led2 = 0;}
if ((timer_tutao[4] >=100) & (timer_tutao[4]<200)) {led2 = 1;}
if (timer_tutao[4] >= 200) { timer_tutao[4]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 50% ------------------
if ((timer_tutao[7] >0) & (timer_tutao[7]<500)) {led3 = 0;}
if ((timer_tutao[7] >=500) & (timer_tutao[7]<1000)) {led3 = 1;}
if (timer_tutao[7] >= 1000) { timer_tutao[7]=0;}
}
}
Bước 5: Triển khai và những ứng dụng mở rộng
Với cách viết như vậy ta có thể linh hoạt hơn trong việc quy hoạch chương trình chính, chương trính viết khéo sẽ không bị dừng tại đâu cả liên tục thực hiện qua các hàm và chương trình con.
Ta có thể phân bổ cho chương trình quét nút sau khoảng 100ms quét 1 lần , hiẻn thị LCD không nhất thiết phải bắng tằng tằng dữ liệu lên cho khoảng 40 ms cập nhật một lần (LCD không cần phải có tần số làm tươi lớn hơn 30 hình 1s làm gì cho phí hiệu năng của chíp), quét sensor dò đường 10ms một lần, quét cảm biến vật cản trước của robot 50ms, chống nhiễu rung tiếp điểm, trễ thời gian không chết chương tình ...vv ...
Đây cũng chính là bước đầu tiên để tập tành thực hiện viết một nhân hệ điều hành on chip vô cùng vô cùng cơ bản và ít tính năng.
Hi vọng với ý tưởng trên đây những bạn đang học lập trình Vi điều khiển sẽ có thêm một công cụ mới ý tưởng mới cho các đề tài lớn. Chúc vui.
Các bạn hãy thử cùng phân tích ưu điểm và nhược điểm của công cụ nhân bản timer này nhé ... !
không hiểu sao bây giờ em mới đọc được bài viết này của a, đúng là chưa có duyên.
a còn thủ thuật gì hay chia sẻ nốt cho ae đi a ơi, quá hay, quá hữu ích!
Comment
-
Đề bài yêu cầu: HIển thị lần lượt 4 số trên 4 led 7 đoạn, dùng cổng P1.[3:0]. Sử dụng ngắt P3.3 cho phép ngắt ngoài.
Mong các bạn giúp đỡ thêm.
Code này chỉ là 2 led nhưng lại không đếm lần lượt.
#include <sfr51.inc>
ORG 00H
LJMP MAIN
ORG 0013H ; dia chi vector ngat ngoai1
LJMP INT1_EX
MAIN:
SETB EA ;cho phep ngat
SETB EX1 ;ngat ngoai1
SETB IT1 ;ngat canh ngoai1
MOV DPTR,#CODELED
MOV R0,#01H
MOV R1,#00H
DISP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
CJNE R0,#9,NEXT
CJNE R1,#10,DISP
SJMP MAIN
NEXT:
CJNE R0,#10,DISP
MOV R0,#00H
SJMP DISP
CODELED:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
RET
INT1_EX:
INC R0
CJNE R0,#10,JUMPER
MOV R0,#0
INC R1
CJNE R1,#10,JUMPER
MOV R1,#0
JUMPER:
RETI
END
Comment
-
Nguyên văn bởi 1zx2zx Xem bài viếtĐề bài yêu cầu: HIển thị lần lượt 4 số trên 4 led 7 đoạn, dùng cổng P1.[3:0]. Sử dụng ngắt P3.3 cho phép ngắt ngoài.
Mong các bạn giúp đỡ thêm.
Code này chỉ là 2 led nhưng lại không đếm lần lượt.
#include <sfr51.inc>
ORG 00H
LJMP MAIN
ORG 0013H ; dia chi vector ngat ngoai1
LJMP INT1_EX
MAIN:
SETB EA ;cho phep ngat
SETB EX1 ;ngat ngoai1
SETB IT1 ;ngat canh ngoai1
MOV DPTR,#CODELED
MOV R0,#01H
MOV R1,#00H
DISP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
CJNE R0,#9,NEXT
CJNE R1,#10,DISP
SJMP MAIN
NEXT:
CJNE R0,#10,DISP
MOV R0,#00H
SJMP DISP
CODELED:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
RET
INT1_EX:
INC R0
CJNE R0,#10,JUMPER
MOV R0,#0
INC R1
CJNE R1,#10,JUMPER
MOV R1,#0
JUMPER:
RETI
END
Comment
Bài viết mới nhất
Collapse
-
bởi bqvietĐấy gọi là cái "điểm gãy" trong đồ thị điện áp - dung lượng còn lại. Dùng điện áp hở cực để xác định sắp hết hoặc gần đầy thì vẫn tạm ổn. Dùng để đo SOC/DOD thì đừng. Ngay cả số km đã đi cũng chả xác định được...
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 21:36 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Vâng, em cũng nghĩ thế khi search được hãng ấy là SRNE, nên em test luôn những cái còn lại, và kết quả đều như nhau.
Nhận thấy kết quả khó chấp nhận, em cũng phân vân có nên mail cho họ để họ thử kiểm tra mã đó không; giữa...-
Channel: Điện tử công suất
Hôm qua, 11:33 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Xin cảm ơn bác bqviet luônnhiệt tình cho biết nhiều thông tin quí báu, cảm ơn bạn mèomướp có ví dụ đơn giản và dễ hiểu, cảm ơn tất cả đã bớt chút thời gian quí báu vào đây đọc bài.
Cảm ơn bác nhathung1101 cho thông tin và chúc mừng bác mua được những tấm pin NLMT cực tốt theo...-
Channel: Điện tử công suất
Hôm qua, 11:22 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi mèomướpDạ chú nhat... cứ coi pin mặt trời như 1 cái ắc qui nhìu ngăn mắc nối tiếp ấy ạ. Khi 1 ngăn yếu thì cả cái ắc qui yếu luôn ạ. Nó có nhìu bộ nối tiếp mắc song song nên bị che 1 khoảng nhỏ ảnh hưởng nhìu nhưng chắc ko đến nỗi mất 50% đâu ạ...
-
Channel: Điện tử công suất
Hôm qua, 06:36 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Nếu nói bị cái lá che sáng mà giảm 50% thì tôi càng không tin, bởi trên vườn tôi mặc kệ ông trời làm vệ sinh.
Tức là lá tự rụng, gió tự dọn. Ai hơi đâu mà leo lên dọn. Nếu phải như thế thì tôi dek thèm lắp làm gì.-
Channel: Điện tử công suất
16-01-2025, 21:44 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Chả hiểu ý cậu nói gì. Cái diode bypass quan trọng thế ư???
Cái giàn của tôi chả thấy cái diode nào mà vẫn hoạt động hơn 3 năm rồi.
Nhưng nó không có kiểu nối dây với bấm cốt như của cậu.
Tóm lại là tiền nào của nấy, đừng hoang tưởng kỹ thuật hóa. Kẻo ô tô điện đua nhau lắp diode.-
Channel: Điện tử công suất
16-01-2025, 21:31 -
-
Trả lời cho Dùng biến áp tự ngẫu 110V có tốn điện không?bởi nhathung1101Tôi dùng 4 cái điều hòa Fujitsu hàng bãi Nhật, nên phải dùng 4 cục đổi nguồn 220 xuống 100V. Để bật quanh năm, chả thấy bằng bữa bia. Chứ tắt đi là mất mấy bữa luôn.
-
Channel: Điện tử gia dụng
16-01-2025, 21:24 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi bqvietViệc che khuất một phần dẫn tới giảm hiệu suất, thế giới bàn rất nhiều. Đôi khi chỉ cần một chiếc lá nhỏ thôi cũng dẫn tới giảm hiệu suất tệ hại
https://www.motorhomefun.co.uk/forum...-shade.295187/
https://www.solarchoice.net.au/learn/design-g...-
Channel: Điện tử công suất
16-01-2025, 19:52 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi bqvietNhà thơ & nhạc sỹ lâu không bàn chuyện kỹ thuật mà hổm rày chia xẻ dài phết. J/K
Về vụ đo nhiệt độ sai, chắc lô hàng bị sao đó chứ khó có khả năng nhà sản xuất chế tạo chất lượng thấp đến vậy. Bất kể là hàng...-
Channel: Điện tử công suất
16-01-2025, 19:48 -
-
bởi since0501Cảm ơn bác đã chia sẻ, nhưng mình thấy điện áp lúc có tải từ 3.1v nó xuống dưới 3.0 rất nhanh, giai đoạn ~3.2 nó cầm khá lâu, vậy có cách nào để mình phỏng đoán là pin sắp cạn không hay chỉ có thể dựa vào số km đa đi đc sau 1 lần xạc?...
-
Channel: Điện tử dành cho người mới bắt đầu
16-01-2025, 09:03 -
Comment