phantramxung=9; delaylong(20000); phantramxung=4; delaylong(20000); } }
Giả sử khi các bạn gán phantramxung=4; Thì cứ mỗi 100uS ngắt xảy ra 1 lần, và kiểm tra biến đếm. Lần đầu dem=1 <4 nên giá trị P2_0 = 1 mức cao, lần thứ 2 , 200 uS, dem =2<4
DKS_GROUP Microcontroller Training Center
P2_0=0 mức thấp, …, dem =10 <4 sai P2_0 mức thấp đủ 1000 uS , 400uS cao, 600uS thấp quay vòng dem=0, ngắt lần thứ 11, dem=1 < 4 , P2_0=1 mức cao, có xung thấp lên cao….
Để PWM 2 chân P2_0 và P3_5, các bạn khai báo thêm 1 biến phantramxung2 và đưa thêm dòng lệnh sau vào hàm ngắt.
if(dem<phantramxung) P3_5=1;// Neu bien dem < phan tram xung thi dua gia tri 1 ra chan, xung 5V
else P3_5=0;// Neu dem = phan tram xung
Chú ý: Thực ra 1 chu kí như ta vừa làm không chính xác 100% là 1Khz, vì ta chưa tính
đến độ dài của hàm ngắt,mỗi lần ngắt 100uS, 10 lần là 1000uS đã đủ, còn thời gian thực hiện hàm ngắt nữa, như vậy là chu kì của ta lớn hơn 1000uS, tần sỗ sẽ <1Khz, nhưng thực sự sai sốđó không đáng kể. Nếu các bạn muốn chính xác tôi cũng chiều lòng các bạn. Các bạn chạy debug, để thạch anh đúng 12Mhz, quan sat dòng sec xem hàm ngắt diễn ra trong bao nhiêu chu kì máy, khi nạp giá trị cho TL0 và TH0 các bạn lấy 155 trừđi giá trịđó được gía trị a gán vào, như vậy a+thời gian thực hiện hàm ngắt đúng đủ 100uS.
DKS_GROUP Microcontroller Training Center
Chỉ vào list mode: Chọn chếđộ, rồi quan sát giá trịở TMOD rồi quay lại điền vào chương trình.
Chú ý: Vô cùng quan trọng các bạn chỉđược chạy với động cơ loại nhỏ, nếu động cơ loại to phải có mạch điều khiển riêng không là sẽ cháy chip. Nếu không có mạch điều khiển các bạn có thể làm, có thể mượn của tôi, không thì chịu khó chạy mô phỏng.