Ðăng Nhập

View Full Version : PIC16F887_SomeQuestions?


bluexylitol
14-08-2009, 12:47 PM
Hi,
Mình đang tìm hiểu con PIC16F887 và có 1 số vấn đề thắc mắc:
1. Oscillator
a. Mình chưa hiểu về 1 vấn đề trong internal clock về Mode INTOSC và INTOSCIO, tức là bit SCR quy định nguồn đồng hồ là internal or defined by FOSC, nhưng tại sao trong FOSC lại có INTOSC và INTOSCIO? hay cái này cũng là internal mà. và 2 mode này khác với Mode Internal Oscillator (cái mà được chọn khi chọn SCR=1) là gì?
b. bit HTS xác định chế độ stable or not stable vậy stable ở đây nghĩa là gì vậy?

2. Timers

Mình không hiểu cái hình vẽ này: về mối quan hệ giữa TMR2, PR2, Postscaler và bit TMR2IF. Mình đọc trong datasheet mà chẳng hiểu gì:
"The match output of the Timer2/PR2 comparator is then fed into the Timer2 postscaler. The postscaler has postscale options of 1:1 to 1:16 inclusive. The output of the Timer2 postscaler is used to set the TMR2IF interrupt flag bit in the PIR1 register"

Thanks a lot in advance!

Mr.Bi
14-08-2009, 10:19 PM
Hi,
Mình đang tìm hiểu con PIC16F887 và có 1 số vấn đề thắc mắc:
1. Oscillator
a. Mình chưa hiểu về 1 vấn đề trong internal clock về Mode INTOSC và INTOSCIO, tức là bit SCR quy định nguồn đồng hồ là internal or defined by FOSC, nhưng tại sao trong FOSC lại có INTOSC và INTOSCIO? hay cái này cũng là internal mà. và 2 mode này khác với Mode Internal Oscillator (cái mà được chọn khi chọn SCR=1) là gì?
b. bit HTS xác định chế độ stable or not stable vậy stable ở đây nghĩa là gì vậy?

2. Timers

Mình không hiểu cái hình vẽ này: về mối quan hệ giữa TMR2, PR2, Postscaler và bit TMR2IF. Mình đọc trong datasheet mà chẳng hiểu gì:
"The match output of the Timer2/PR2 comparator is then fed into the Timer2 postscaler. The postscaler has postscale options of 1:1 to 1:16 inclusive. The output of the Timer2 postscaler is used to set the TMR2IF interrupt flag bit in the PIR1 register"

Thanks a lot in advance!

- giới hạn đếm lên của thanh ghi TMR2 là TMR2<PR2 . Do đó , vd u khai báo PR2 là 10 thì TMR2 chỉ đếm đến 10 là bật cờ
- TMR2IF là cờ báo ngắt timer2 . nếu khai báo ngắt timer2 thì khi timer2 tràn , bit TMR2IF sẽ = 1.

namqn
14-08-2009, 11:05 PM
Hi,
Mình đang tìm hiểu con PIC16F887 và có 1 số vấn đề thắc mắc:
1. Oscillator
a. Mình chưa hiểu về 1 vấn đề trong internal clock về Mode INTOSC và INTOSCIO, tức là bit SCR quy định nguồn đồng hồ là internal or defined by FOSC, nhưng tại sao trong FOSC lại có INTOSC và INTOSCIO? hay cái này cũng là internal mà. và 2 mode này khác với Mode Internal Oscillator (cái mà được chọn khi chọn SCR=1) là gì?
b. bit HTS xác định chế độ stable or not stable vậy stable ở đây nghĩa là gì vậy?

2. Timers

Mình không hiểu cái hình vẽ này: về mối quan hệ giữa TMR2, PR2, Postscaler và bit TMR2IF. Mình đọc trong datasheet mà chẳng hiểu gì:
"The match output of the Timer2/PR2 comparator is then fed into the Timer2 postscaler. The postscaler has postscale options of 1:1 to 1:16 inclusive. The output of the Timer2 postscaler is used to set the TMR2IF interrupt flag bit in the PIR1 register"

Thanks a lot in advance!
1.
a. SCS (chứ không phải SCR) sẽ quyết định bộ dao động nội hay nguồn xung clock chọn bởi FOSC<2:0> được dùng cho hệ thống. INTOSC và INTOSCIO khác nhau ở chỗ: với INTOSC, chỉ có chân OSC1 có thể dùng làm I/O, còn chân OSC2 vẫn xuất tín hiệu clock (có thể dùng để kiểm tra tần số bộ dao động nội, hay cấp xung clock cho một linh kiện khác), còn với INTOSCIO, cả hai chân OSC1 và OSC2 đều được dùng làm chân I/O, và không có tín hiệu clock được xuất ra.

b. Mạch dao động nào cũng cần thời gian để đạt trạng thái ổn định (stable). HTS là cờ báo hiệu bộ HFINTOSC đã chạy ổn định hay chưa.

2. Tạm dịch đoạn văn đó:

"Ngõ ra báo hiệu khớp của bộ so sánh Timer2/PR2 sau đó được đưa vào bộ chia sau Timer2. Bộ chia sau có các giá trị chia tùy chọn từ 1:1 đến 1:16. Ngõ ra của bộ chia sau Timer2 được dùng để thiết lập trạng thái của cờ ngắt TMR2IF trong thanh ghi PIR1".

Nhìn sơ đồ khối thì thấy đúng như vậy. Tức là, khi Timer2 = PR2 thì ngõ ra bộ so sánh có một lần đổi trạng thái từ '0' lên '1' (rồi sẽ về '0' khi giá trị Timer2 trở 0 một cách tự động). Xung ở ngõ ra bộ so sánh sẽ được đưa vào bộ chia trước Timer2. Nếu chọn giá trị cho bộ chia trước là 1:n thì sau n lần ngõ ra bộ so sánh đổi trạng thái từ '0' lên '1', cờ ngắt TMR2IF mới được bật.

Thân,

bluexylitol
15-08-2009, 09:24 AM
Ok, thanks 2 bạn. Vấn dề 2 mình đã hiểu, đặc biệt là phần giải thích của bạn @namqn "Nếu chọn giá trị cho bộ chia trước là 1:n thì sau n lần ngõ ra bộ so sánh đổi trạng thái từ '0' lên '1', cờ ngắt TMR2IF mới được bật". Nhưng vấn đề 1 thì mình vẫn chưa rõ:

Về sự khác nhau giữa INTOSC và INTOSCIO mình ok. nhưng vấn đề của mình là thế này: SCS quy định bộ dao động nội hoặc clock source được định nghĩa trong FCSC. Mình thấy cả 2 cái INTOSC và INTOSCIO cũng đều là dao động nội tuy nhiện lại được chọn khi SCS=0 và được định nghĩa bởi giá trị của FCSC (100 & 101). 2 dao động này khác với dao động nội khi ta chọn SCS=1 như thế nào?
Thanks!

namqn
15-08-2009, 09:40 PM
Ok, thanks 2 bạn. Vấn dề 2 mình đã hiểu, đặc biệt là phần giải thích của bạn @namqn "Nếu chọn giá trị cho bộ chia trước là 1:n thì sau n lần ngõ ra bộ so sánh đổi trạng thái từ '0' lên '1', cờ ngắt TMR2IF mới được bật". Nhưng vấn đề 1 thì mình vẫn chưa rõ:

Về sự khác nhau giữa INTOSC và INTOSCIO mình ok. nhưng vấn đề của mình là thế này: SCS quy định bộ dao động nội hoặc clock source được định nghĩa trong FCSC. Mình thấy cả 2 cái INTOSC và INTOSCIO cũng đều là dao động nội tuy nhiện lại được chọn khi SCS=0 và được định nghĩa bởi giá trị của FCSC (100 & 101). 2 dao động này khác với dao động nội khi ta chọn SCS=1 như thế nào?
Thanks!
SCS = 1 hay dùng SCS = 0 kết hợp với FOSC<2:0> = 100/101 thì đều cho kết quả là PIC dùng bộ dao động nội (tần số bằng bao nhiêu thì do IRCF<2:0> trong thanh ghi OSCCON quyết định). Tuy nhiên, FOSC<2:0> thì không thể được thay đổi khi đang thực thi chương trình (vì chúng là các bit trong từ cấu hình), còn SCS thì có thể được thay đổi khi đang thực thi chương trình.

Việc dùng SCS cho phép chương trình ứng dụng linh hoạt chuyển đổi nguồn xung clock hệ thống. Ví dụ, bạn có thể dùng thạch anh ngoài 20 MHz để đạt tốc độ xử lý nhanh nhất có thể có, và cấu hình tần số bộ dao động nội ở giá trị thấp nhất để tiết kiệm điện năng. Khi chương trình ứng dụng thực thi, bạn chỉ cần thay đổi giá trị SCS để chuyển đổi giữa hai nguồn xung clock, nhằm đáp ứng tốt với các yêu cầu tính toán, cũng như tiết kiệm được điện năng trong lúc chờ thông tin từ người dùng (vòng lặp chờ người dùng nhấn phím hoặc delay thì bạn đâu cần cho PIC chạy ở tốc độ tối đa).

Thân,