Các huynh ai thấm nhuần cái này mong giải thích cách thức mà từng lệnh nó chạy ( tóm lại là trình tự hoạt động từ đầu đến lúc kết thúc của đoạn code). Ý nghĩa của mỗi lệnh và tính thời gian thì em đã hiểu, chỉ còn vấn đề trên mà thôi ??? Mong giúp! cảm ơn mấy huynh trước !
Thông báo
Collapse
No announcement yet.
Giải thích đoạn code CCS về timer0 ???
Collapse
X
-
#include <16f877a.h> // su dung cac dinh nghia lien quan ( ban cu mo len thí e rõ)
#include <def_877a.h>
#device *=16 ADC=8 // con tro 16 bit de su dung het RAM, ADC thiet lap su dung 8 bit ( mac du 16f887 la 10 bit nhung ban su dung che do 8 bit thoi)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT // cau hinh - khong watdog timer, chế độ nguồn cung clock cao - HS, không bảo về code trong bộ nhớ, không tự động reset khi nguồn không ổn định,...
#use delay(clock=20000000) // sử dụng lệnh delay thì phải khai báo cái này
int8 a;
int16 count;
#int_timer0
void ngat_timer0()
{
tmr0if=0; // xóa cờ , mỗi khi timer0 đếm lên 255 thì xảy ra tràn, cờ này set lên 1 và nếu cho phép ngắt thì ngắt xảy ra. tóm lại mỗi khi có ngắt thì xóa nó để lần tiếp sẽ lại ngắt
set_timer0(130);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //125*16*0.2us=400us
count++; // mỗi khi ngắt thì biến count tăng lên 1
if(count==2500) // nếu biến count = 2500 thì cho biến cout bằng 0 để đếm tiếp, đồng thời xoay biến a sang trái 1 bit. kiểm tra tiếp nếu biến a = 256 hay 0xff ( toàn số 1) thì gán lại a = 1
{count=0;
a=a<<1;
if (a==256) a=1;
}
}
// chương trình chính giải thích như sau:
- lệnh tris đầu tiên cho = 0 để cấu hình port d là ngõ ra, nếu cho = 0xff hay 0b11111111 thì là ngõ vào.
- cho phép biến ngắt toàn cục, ngắt chỉ xảy ra nếu cho phép 2 bit ngắt là bit ngắt toàn cục và bit ngắt timer 0.
-
void main(void)
{
trisd=0;
ENABLE_INTERRUPTS(Global);
ENABLE_INTERRUPTS(INT_TIMER0);
set_timer0(130); // lẹnh này đặt giá trị ban đầu cho timer 0, nó không bắt đầu đếm từ 0 mà từ 130.
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //set timer cho nay de nhay vo ct ngat phai ko?
count =0; //trong ct ngat da co tai sao phai gan’ o~ day??
a=1; // nhu tren??
while(true) //neu da “true” thi no luon nam trong while nay thi lam sao ma ngat dc nua~ ??? - bạn không hiểu về ngắt rồi, ngắt làm việc độc lập, bạn hiểu không. mỗi lần xảy ra ngắt là mỗi lần bạn cho biến đếm tăng lên 1, và khi ngắt đủ 2500 lần thì thay đổi biến a rồi xuất ra portd và lại đặt biến count về = 0, lại ngắt xảy ra, biến count lại tăng lên, tăng lên 2500 thì lại cho a xoay 1 bit rồi lại xuất ra portd, nếu a = 256 tức led sáng hết rồi thì gán lại cho nó = 1 để xoay lại từ đầu nhé. tóm lại là cho led sáng dần ấy mà.
- tóm lại bạn phải hiều về ngắt, chương trình chính cứ thực thi, nếu có ngắt xảy ra thì dừng chương trình chính lại và thwucj hiện ngắt, xong rồi lại quay lại chương trình chính. vì việc này thực thi rất nhanh nên có cảm giác vi điều khiển làm được nhiều việc cùng một lúc, thực ra mỗi thời điểm nó chỉ làm một việc thui nhé.
{
portd=a; //chang nhe luc nao portd cung bang 1 ?? - trời ơi, port d = giá trị biến a
- giả sử lúc đầu a = 1 tức 0b00000001 tức 1 led sáng ở portd, timer0 cứ chạy , chạy đến khi tràn thì ngắt, ngắt thì biến count tăng lên 1 đơn vị, ngắt đủ 2500 lần thì biến count = 2500, lúc đó a thay đổi ( xoay trái), a = 3 ( thập phân ) hay a = 0b00000011- nhị phân => có 2 led ở portb sáng. hết
- sắp sáng, em buồn ngủ quá nên viếc nếu sai thì thông cảm, không thì thanks cho cái để ngủ ngon nhá
}
}Be quan. Plz contact through email:
-
Nhầm một chỗ lệnh dịch bit, bạn xem lại nhéNguyên văn bởi Lenh Ho Xem bài viết#include <16f877a.h> // su dung cac dinh nghia lien quan ( ban cu mo len thí e rõ)
#include <def_877a.h>
#device *=16 ADC=8 // con tro 16 bit de su dung het RAM, ADC thiet lap su dung 8 bit ( mac du 16f887 la 10 bit nhung ban su dung che do 8 bit thoi)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT // cau hinh - khong watdog timer, chế độ nguồn cung clock cao - HS, không bảo về code trong bộ nhớ, không tự động reset khi nguồn không ổn định,...
#use delay(clock=20000000) // sử dụng lệnh delay thì phải khai báo cái này
int8 a;
int16 count;
#int_timer0
void ngat_timer0()
{
tmr0if=0; // xóa cờ , mỗi khi timer0 đếm lên 255 thì xảy ra tràn, cờ này set lên 1 và nếu cho phép ngắt thì ngắt xảy ra. tóm lại mỗi khi có ngắt thì xóa nó để lần tiếp sẽ lại ngắt
set_timer0(130);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //125*16*0.2us=400us
count++; // mỗi khi ngắt thì biến count tăng lên 1
if(count==2500) // nếu biến count = 2500 thì cho biến cout bằng 0 để đếm tiếp, đồng thời xoay biến a sang trái 1 bit. kiểm tra tiếp nếu biến a = 256 hay 0xff ( toàn số 1) thì gán lại a = 1
{count=0;
a=a<<1;
if (a==256) a=1;
}
}
// chương trình chính giải thích như sau:
- lệnh tris đầu tiên cho = 0 để cấu hình port d là ngõ ra, nếu cho = 0xff hay 0b11111111 thì là ngõ vào.
- cho phép biến ngắt toàn cục, ngắt chỉ xảy ra nếu cho phép 2 bit ngắt là bit ngắt toàn cục và bit ngắt timer 0.
-
void main(void)
{
trisd=0;
ENABLE_INTERRUPTS(Global);
ENABLE_INTERRUPTS(INT_TIMER0);
set_timer0(130); // lẹnh này đặt giá trị ban đầu cho timer 0, nó không bắt đầu đếm từ 0 mà từ 130.
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //set timer cho nay de nhay vo ct ngat phai ko?
count =0; //trong ct ngat da co tai sao phai gan’ o~ day??
a=1; // nhu tren??
while(true) //neu da “true” thi no luon nam trong while nay thi lam sao ma ngat dc nua~ ??? - bạn không hiểu về ngắt rồi, ngắt làm việc độc lập, bạn hiểu không. mỗi lần xảy ra ngắt là mỗi lần bạn cho biến đếm tăng lên 1, và khi ngắt đủ 2500 lần thì thay đổi biến a rồi xuất ra portd và lại đặt biến count về = 0, lại ngắt xảy ra, biến count lại tăng lên, tăng lên 2500 thì lại cho a xoay 1 bit rồi lại xuất ra portd, nếu a = 256 tức led sáng hết rồi thì gán lại cho nó = 1 để xoay lại từ đầu nhé. tóm lại là cho led sáng dần ấy mà.
- tóm lại bạn phải hiều về ngắt, chương trình chính cứ thực thi, nếu có ngắt xảy ra thì dừng chương trình chính lại và thwucj hiện ngắt, xong rồi lại quay lại chương trình chính. vì việc này thực thi rất nhanh nên có cảm giác vi điều khiển làm được nhiều việc cùng một lúc, thực ra mỗi thời điểm nó chỉ làm một việc thui nhé.
{
portd=a; //chang nhe luc nao portd cung bang 1 ?? - trời ơi, port d = giá trị biến a
- giả sử lúc đầu a = 1 tức 0b00000001 tức 1 led sáng ở portd, timer0 cứ chạy , chạy đến khi tràn thì ngắt, ngắt thì biến count tăng lên 1 đơn vị, ngắt đủ 2500 lần thì biến count = 2500, lúc đó a thay đổi ( xoay trái), a = 3 ( thập phân ) hay a = 0b00000011- nhị phân => có 2 led ở portb sáng. hết
- sắp sáng, em buồn ngủ quá nên viếc nếu sai thì thông cảm, không thì thanks cho cái để ngủ ngon nhá
}
}
a=1; (0b00000001)
a=a<<1 ; //a now is 2 (0b00000010) , not 3 (0b00000011)
// neu a dich trai n bit thì tương đương a*2^n
Comment
-
Thông cảm nhé! tại đệ đang tự tìm hiểu về VĐK! huynh chỉ cần nói "nó hoạt động độc lập" là đệ thông suốt rồi ! tại cứ tưởng chương trình chạy tuyến tính con trỏ gặp lệnh nào thì giải quyết lệnh đó! không biết cái ngắt nó hoạt động độc lập nên.....ù ờ! sẳn huynh cho hỏi muốn ngắt do RB0 thì khai báo INT_?...? . còn cái ngắt ngoài INT_EXT ý nghĩa của nó có phải là bất kì pin nào bị tác động thì đều ngắt phải ko? nhưng sao lập trình thì nó chỉ ngắt khi RB0 bị tác động! 2 cái này là một àh, thế còn cái INT_EXT1,2 là ngắt gì vậy??? Còn các timer0,1,2 ngoài mục đích dùng kèm với ngắt, delay, tạo xung thì mình còn làm gì được với nó nữa ! sẵn làm ơn cho chót xin mạn phép nhờ huynh tút cho đoạn code dùng timer làm delay lun! thanhk trước ! các huynh ai biết chỉ với!
Comment
Bài viết mới nhất
Collapse
-
bởi IemanjaTôi có một câu hỏi kỹ thuật muốn hỏi.
Động cơ bước vòng kín của tôi được sử dụng trong một cơ cấu dao động đảo chiều thường xuyên. Sau khi hoạt động vài ngày, vị trí điểm 0 của bộ mã hóa được thiết lập ban đầu bị trôi dần, và...-
Channel: Điện tử dành cho người mới bắt đầu
hôm nay, 14:12 -
-
bởi theidiotcatGiải pháp cấu hình tối ưu chi phí và hiệu năng cho phòng net hiện đại với AMD Ryzen 7 5700G, 5700X và Radeon RX 6500XT, 7600 8GB
Giải pháp toàn diện cho bài toán đầu tư phòng net
Mô hình phòng net hiện đại ngày nay đòi hỏi...-
Channel: Đánh giá sản phẩm DTVN
hôm nay, 13:55 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi lvhnE nhớ bác Vivanpham làm bên điện tử y sinh, có lần đó cái sơ đồ máy chụp x quang sao có mấy con thryristor làm gì mà ko ai trả lới đúng cả
...
-
Channel: Tâm tình dân kỹ thuật
hôm nay, 09:17 -
-
Trả lời cho Amply bị rò DC 22 voltbởi lvhnBác kiểm tra lại đường mạch, mối hàn xem có bị hở hoặc dẫn không tốt không?
Thay cầu diode lớn hơn càng tốt không vấn đề gì cả....-
Channel: Điện thanh
hôm nay, 09:12 -
-
bởi LantheChào bạn.
Trục đầu ra của hộp số hành tinh xoắn ốc được kết nối với mặt bích của khách hàng thông qua một trục răng trong. Sau chưa đầy sáu tháng hoạt động, nó phát ra tiếng kêu lách cách và độ rơ lớn đáng báo động.
Việc...-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 13:05 -
-
bởi ittcChào các anh em nhé, mình dự định sắp tới sẽ đi học lái xe Ôtô, thi lấy bằng lái. Cụ thể mình sẽ học và thi lấy giấy phép lái xe hạng B. Thật sự mình là người chưa có kiến thức hiểu biết gì về Ôtô cả ? tất nhiên mình sẽ phải...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 06:22 -
-
Trả lời cho Amply bị rò DC 22 voltbởi trung30000Theo sự hướng dẫn của bác, sau khi em kiểm tra tầng Vi sai sử dụng cặp c1815, tiếp đến là 1 con a1013, và cặp thúc sử dụng mje304g và mje305g, em đã tiến hành thay cặp Vi sai c1815 sau đó mở máy lên đo ngõ công suất DC 0,2V hai giây sau máy đo...
-
Channel: Điện thanh
05-08-2026, 20:09 -
-
bởi theidiotcatBộ máy đa năng toàn diện cho học tập và làm việc hàng ngày
Đối với học sinh, sinh viên và người làm việc văn phòng, việc sở hữu một bộ PC cân bằng giữa học tập, công việc và giải trí là nhu cầu vô cùng thực tế. Combo Ryzen...-
Channel: Đánh giá sản phẩm DTVN
05-08-2026, 10:28 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi mèomướpDạ cháu đọc 1 số bài viết của bác vi... thì nhớ đc bác là 1 cụ già gần 80 tuổi, sức khỏe yếu. Đam mê và làm vc về kỹ thuật điện. Thích thơ ca. Có nhìu bài chia sẻ quý báu cho thế hệ sau. Tuy nhiên già rồi nên khái tính, bảo thủ, nhưng vẫn đáng kính ạ... còn lão nhathung... thì kiểu bố đời
-
Channel: Tâm tình dân kỹ thuật
31-07-2026, 12:52 -
-
bởi lvhnHãng nào tùy thích thôi bác! bây giờ các hãng đều hỗ trợ xem qua máy tính hay điện thoại đều được. Gắn Trước tiên mua về cắm nguồn set ip hết xong hãy lắp lên, cam poe chỉ cần 4 lõi là hoạt động bình thường nên 1 dây kéo cho 2 cam vẫn ok
-
Channel: Tâm tình dân kỹ thuật
30-07-2026, 15:49 -

Comment