View Single Post
Old 17-02-2006, 11:27 AM   #34
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Một điểm chú ý là, giữa các vòng lặp sau, thì điểm khởi đầu của count1 và count2 luôn luôn là 0. Vì vậy, để đảm bảo lần thứ nhất chạy đúng, thì giá trị khởi tạo phải là 0. Như vậy, a = b = 0.

Nếu như có N vòng lồng nhau, thì giá trị các vòng trước đó là count1,2...n-1 = 0.

Nếu không đặt như vậy, thì lần đầu tiên chạy sẽ bị sai. Khi đem ứng dụng vào những bài toán khác, không phải là nhấp nháy led, thì việc không cẩn thận này rất nguy hiểm.

Khi có độ lệch về thời gian trong các vòng lặp, phải chọn mức thấp hơn.

Vd: không chọn c = 14 để vòng lặp là 1.02s mà phải chọn c =13, sau đó dùng một đoạn code khác để bù vào vòng lặp này.

Như vậy, chúng ta sẽ có chính xác thời gian thực.

Một thủ thuật nhỏ của việc viết vòng lặp này đó là cài đặt lại giá trị ở vòng lặp thứ n-1, trong trường hợp này là cài đặt lại giá trị của count2 mỗi khi count3 giảm đi 1 đơn vị. Có nghĩa là chỉ cần thực hiện một lệnh DECF cho count2 trước khi giảm count3.

Khi đó count2 luôn giảm từ 254 xuống. Mất 1 lệnh, hệ số trước count2 lại nhân 3. Như vậy, mình giảm được 2 lệnh. Tính lên vòng lặp trên, lại giảm được 255*3 ..

Vậy chỉ cần thêm một lệnh giảm, thì sẽ giảm ít hơn là giảm count3 1 đơn vị. Cái này là do độ phân giải mình muốn.

Bạn thử dùng lại cách này, và tính chính xác lại thời gian, sau đó bù lại sao cho nó đáp ứng đúng 1s thử xem?

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn