PDA

View Full Version : Hỏi bài?


wicamb
21-09-2007, 02:49 AM
chào cả nhà.Là 1 người mới bắt đầu về Pic nên em cũng có 1 vài câu hỏi,mà tinh thần thì cũng như bạn "anhdk" vậy.Vi e thấy mục này thich hợp nên muốn hỏi 1 câu:
Nếu viết 1 đoạn chương trình delay đơn giản có nội dung


..... ;các lệnh ở trên

MOVLW 0x20 ;đưa giá trị 20h vào W
MOVWF delay_reg ;gán W cho delay_reg
loop
DECFSZ delay_reg ;giảm giá trị của delay_reg
;và so sánh với 0
GOTO loop

..... ;các lệnh khác


(thạnh anh 4MHz)
gọi t1 là thời gian của 1 chu kì lệnh thì
thời gian của đoạn delay la 3*t1*(N+1)(ở đây N=20)

tại sao lại là N+1 mà không phải N,e đếm thử mà
thấy chưa hợp lí? Nhờ mọi người giải thich tường minh cho
e đoạn này ,xin cảm ơn

wicamb
21-09-2007, 11:37 AM
vẫn chưa có ai chú ý tới câu hỏi chắc nó dễ quá! hôm qua e đã đọc được 1 đoạn viết rằng khi giá trị của 1 thanh ghi giảm về 0 sẽ có 1 chu kì lệnh được phát sinh,có lẽ đó là nguyên nhân làm cho vòng lặp quay lại thêm 1 lần nữa...
đây cũng chỉ là suy nghĩ chủ quan vậy, ai có ý kiến khác thì cùng nhau bàn bạc nha.Tạm thời về câu này như thế đã.E muốn hỏi 1 câu khác
trong lệnh _CONFIG (thiết lập các bit điều khiển các khối chức năng của PIC),nếu viết:
_CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF &_PWRTE_ON & _XT_OSC &_WRT_OFF & _LVP_OFF & _CPD_OFF
e mới chỉ hiểu khai báo _LVP_OFF là để ngắt chức năng nạp của chân RB3 để nó có thể hoạt động như 1 pin I/O bình thường,vì rằng ở đây có 8 khai báo nên có thể hiểu là 1 khai báo tương ứng với sự làm việc bình thường của các pin dược không?và ý nghĩa cụ thể của từng khai báo là gì?(ví như là khai báo _WDT_OFF sẽ là tắt bộ WDT? và nó liên quan đến pin nào của POST B?)
Mong được phản hồi từ anh em!

cuopbienquin
21-09-2007, 12:23 PM
1.WDT là "chó giữ nhà" (Watchdog Timer). Bộ phận này có nhiệm vụ reset lại PIC sau một khoảng thời gian định trước. WDT sẽ reset vi điều khiển khi bộ đếm của WDT bị tràn. Mục đích của nó là tránh trường hợp vi điều khiển bị "treo" khi phải hoạt động liên tục trong một khoảng thời gian lâu dài.

Thời gian định trước này phụ thuộc vào tần số loại thạch anh sử dụng và bộ chia tần số trước (prescaler) của WDT.
2.XT ,HS,RC,LP là khai báo các tần số dao động thạch sử dụng cho vi điều khiển.Thường XT cỡ 4MHZ,HS là tần số cao cỡ 15_20 MHz,
RC là dùng clock (điện trở _tụ điện).Cài này thì về điện tử cơ bản bạn đã học tần số dao động của mạch RC rồi
3.Code protection(CP) có thể ngăn chặn những dòng lệnh bị lỗi của vi điều khiển khi hồi về phần lập trình của vi điều khiển.
4. BODEn có nghĩa là khi nó được set ,nó sẽ giữ nguồn cho VDK trong một thời gian ngắn khi nguôn VDK bị lỗi
5.PWRTE (power up timer ):khi PWRTE được set ,nó sẽ làm cho thời gian ổn định của VDK khi nạp nguồn và dao động thạch anh có thể ngắn và phù hợp
Bạn nên vễ xem lại những kiến thức cơ bản "chip configuration word" trong chương đầu PIC.Chúc vui

namqn
21-09-2007, 06:16 PM
1.WDT là "chó giữ nhà" (Watchdog Timer). Bộ phận này có nhiệm vụ reset lại PIC sau một khoảng thời gian định trước. WDT sẽ reset vi điều khiển khi bộ đếm của WDT bị tràn. Mục đích của nó là tránh trường hợp vi điều khiển bị "treo" khi phải hoạt động liên tục trong một khoảng thời gian lâu dài.

Thời gian định trước này phụ thuộc vào tần số loại thạch anh sử dụng và bộ chia tần số trước (prescaler) của WDT.
2.XT ,HS,RC,LP là khai báo các tần số dao động thạch sử dụng cho vi điều khiển.Thường XT cỡ 4MHZ,HS là tần số cao cỡ 15_20 MHz,
RC là dùng clock (điện trở _tụ điện).Cài này thì về điện tử cơ bản bạn đã học tần số dao động của mạch RC rồi
3.Code protection(CP) có thể ngăn chặn những dòng lệnh bị lỗi của vi điều khiển khi hồi về phần lập trình của vi điều khiển.
4. BODEn có nghĩa là khi nó được set ,nó sẽ giữ nguồn cho VDK trong một thời gian ngắn khi nguôn VDK bị lỗi
5.PWRTE (power up timer ):khi PWRTE được set ,nó sẽ làm cho thời gian ổn định của VDK khi nạp nguồn và dao động thạch anh có thể ngắn và phù hợp
Bạn nên vễ xem lại những kiến thức cơ bản "chip configuration word" trong chương đầu PIC.Chúc vui
Bạn nên cẩn thận với những phát biểu của mình, nhất là khi trả lời cho những người mới học, vì họ sẽ xem những gì bạn nói là thánh kinh.

1. WDT dùng để reset PIC khi PIC bị treo vì một lý do gì đó. Khi dùng WDT thì trong các vòng lặp người ta thường có lệnh xóa thanh ghi đếm của bộ WDT để tránh bị reset khi chương trình chạy bình thường.

2. XT thường dùng cho tần số thạch anh từ vài trăm kHz đến 4 MHz, còn HS thường dùng cho tần số thạch anh từ 4 MHz đến tần số tối đa của chip. LP là chế độ công suất thấp của bộ dao động, thường dùng với thạch anh đồng hồ tần số 32768 Hz.

3. Code protection là chế độ bảo vệ mã chương trình, tức là không cho phép đọc code từ bộ nhớ chương trình của PIC ra bên ngoài. Thường dùng cho mục đích chống sao chép chương trình trên chip.

4. BODEN là cho phép phát hiện sự cố suy giảm nguồn (brown-out detection). Brown-out là muốn nói đến việc nguồn của chip bị suy giảm nhưng không mất hẳn, tuy nhiên, việc chạy chương trình ở điện áp suy giảm này có thể không an toàn (theo đánh giá của người thiết kế), do đó người thiết kế có thể bật tính năng này nếu không muốn chip làm việc ở điều kiện brown-out.

5. PWRTE là cho phép bộ định thời khi bật nguồn hoạt động. Bộ định thời này sẽ thêm vào một khoảng thời gian giữ chip ở trạng thái reset, như vậy điện áp nguồn và tần số của bộ dao động sẽ được ổn định hơn.

Thân,

angel_eyes
14-01-2008, 11:06 PM
chào cả nhà.Là 1 người mới bắt đầu về Pic nên em cũng có 1 vài câu hỏi,mà tinh thần thì cũng như bạn "anhdk" vậy.Vi e thấy mục này thich hợp nên muốn hỏi 1 câu:
Nếu viết 1 đoạn chương trình delay đơn giản có nội dung

..... ;các lệnh ở trên


MOVLW 0x20 ;đưa giá trị 20h vào W
MOVWF delay_reg ;gán W cho delay_reg
loop
DECFSZ delay_reg ;giảm giá trị của delay_reg
;và so sánh với 0
GOTO loop

..... ;các lệnh khác

(thạnh anh 4MHz)
gọi t1 là thời gian của 1 chu kì lệnh thì
thời gian của đoạn delay la 3*t1*(N+1)(ở đây N=20)

tại sao lại là N+1 mà không phải N,e đếm thử mà
thấy chưa hợp lí? Nhờ mọi người giải thich tường minh cho
e đoạn này ,xin cảm ơn

Em cũng thắc mắc chỗ này trong cái tut02.pdf của diễn đàn về Delay. Em đã thử đếm thì rõ ràng nếu N = 20 thì sẽ có 19 vòng lặp chương trình thực hiện đủ 2 lệnh DECFSZ và GOTO (tốn 3 chu kỳ lệnh). Tới vòng cuối cùng, lúc đó giá trị thanh ghi W là 1 và lệnh DECFSZ sẽ giảm nó về 0, sau đó so sánh với 0. Vì lúc này giá trị = 0 nên nó sẽ không thực hiện lệnh GOTO nữa mà thay vào đó bằng lệnh NOP (1 chu kỳ).
Như vậy tổng số chu kỳ thực hiện sẽ là 3*19 + 2 chứ đâu phải là 3*(20+1) như bài viết. Như vậy công thức 3*(N+1)*t1 là không đúng. Ngay cả 3*N*t1 cũng không đúng vì ở vòng lặp cuối, lệnh sau DECFSZ sẽ được bỏ qua và thay bằng NOP.
Mọi người có thể giải thích rõ chỗ này không ạ ?

namqn
15-01-2008, 12:00 AM
Trả lời cho hai bạn wicamb và angel_eyes, cùng những bạn khác đã và sẽ có thắc mắc về cách tính thời gian trễ (trì hoãn) này. Với đoạn code dưới đây:
movlw D'20'
movwf cnt
wait
decfsz cnt
goto wait
lệnh goto sẽ được thực thi 19 lần, và khi cnt giảm từ 1 xuống 0, lệnh goto sẽ bị bỏ qua, thay bằng một lệnh nop. Thời gian thực thi của đoạn code này là (2 + 19*3 + 2) chu kỳ máy. 2 chu kỳ máy đầu tiên dành cho 2 lệnh movlw và movwf.

Tổng quát, nếu bạn thay 20 bằng N (0 < N <= 255), thời gian thực thi của đoạn code trên sẽ là (2 + (N-1)*3 + 2) chu kỳ máy. Viết gọn lại là (3*N + 1).

Tutorial của Chính tính không chính xác, và thời gian đó tôi đã không kiểm tra code trong tutorial.

Thân,