![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
Đệ tử 9 túi
|
Bác ntc post tiếp các phần tiếp theo cho anh em tham khảo!Đợi bác mãi sốt ruột quá!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
|
|
|
#2 |
|
Đệ tử 9 túi
|
BẬT TẮT LED 1s
Code:
;======================================== ;Auhor: NHH ;Date: 10/02/06 ;Hardware: PIC16F877A ;XTAL 10MHz, PORTB noi voi 8 LED qua 8 dien tro 220Ohm ;======================================== TITLE "ON-OFF LED 1 SECOND" PROCESSOR PIC16f877A INCLUDE<P16f877A.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF ;============================================================================= COUNT1 EQU 0x20 COUNT2 EQU 0x21 COUNT3 EQU 0x22 ;=========================CHUONG TRINH CHINH========================= ORG 0x000 GOTO MAIN MAIN BCF STATUS,RP1 BSF STATUS,RP0 ; select BANK 1 CLRF TRISB ; PORTB output BCF STATUS,RP0 ; select BANK 0 MOVLW d'255' MOVWF COUNT1 ;<-COUNT1=255 MOVWF COUNT2 ;<-COUNT2=255 NEXT MOVLW d'14' MOVWF COUNT3 ;<-COUNT3=13 MOVLW b'11111111' ;LED ON MOVWF PORTB CALL LOOP MOVLW d'14' MOVWF COUNT3 ;<-COUNT3=13 MOVLW b'00000000' ;LED OFF MOVWF PORTB CALL LOOP GOTO NEXT ;========================CHUONG TRINH CON==================== LOOP DECFSZ COUNT1,1 GOTO LOOP DECFSZ COUNT2,1 GOTO LOOP DECFSZ COUNT3,1 GOTO LOOP RETURN END
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 thay đổi nội dung bởi: nhh, 17-02-2006 lúc 10:12 AM. |
|
|
|
|
#3 | |
|
Đệ tử 3 túi
Tham gia ngày: Apr 2008
Bài gửi: 48
: |
Trích:
không có thì có vấn đề gì không ạ?????Tại sao đoạn code trên không thấy khai báo tần số của thạch anh?có phải người viết quên không anh? "CLOCK(10000000)" Cảm ơn các bác nhiều!!! thay đổi nội dung bởi: doremino, 12-05-2008 lúc 02:16 PM. Lý do: thiếu sót |
|
|
|
|
|
#4 | |
|
Trưởng lão PIC bang
|
Trích:
Khi lập trình hợp ngữ thì thông tin tần số của thạch anh thường không cần thiết, đặc biệt là trình hợp dịch không cần thông tin này. Mọi tính toán dựa vào tần số của thạch anh đều do người viết code chịu trách nhiệm. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
#5 |
|
Đệ tử 9 túi
|
;hex File
;==================== :020000040000fa :1000000001280313831686018312ff30a000a1008c :100010000d30a200ff30860013200d30a20000300a :10002000860013200828a00b1328a10b1328a20b6d :040030001328080089 :02400e00323f3f :00000001ff
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
|
|
|
#6 |
|
PIC Bang chủ
|
Ai phân tích đoạn chương trình này nào?
Lưu ý là có đoạn goto LOOP về chung, và lưu ý rằng khi 0 - 1 = 255 <> 0, nên sẽ không bị nhảy về LOOP trở lại nhé Công thức tính thời gian delay ở đây được tính như thế nào? Mời các bạn tham gia tính toán con số chính xác. Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
#7 |
|
Đệ tử 8 túi
|
Ặc ăc !! Viết chương trình delay như vậy thì tính thời gian delay cũng chua lắm đó. Bà con thử phân tích coi. Đây cũng là một đề bài thú vị. Chú ý là mhh sử dụng thạch anh 10 MHz.
nhh đã nạp vào PIC và chạy thử chưa. Nhìn sơ qua có cái gì đó không ổn. |
|
|
|
|
#8 |
|
PIC Bang chủ
|
Cách tính khá đơn giản, không phải quá khó đâu em, anh đã viết gợi ý rồi, nhưng xoá đi để mọi người cùng thảo luận.
Anh cũng chưa tính ra con số cụ thể, nhưng nếu biết cách tính khéo léo thì rất là hay. Đoạn code này là một thủ thuật viết hàm delay khá thú vị. Bây giờ giả sử loop 3 vòng như thế này, các giá trị count1, count2, count3 là a, b, và c. Vậy công thức tổng quát của còng lặp này là bao nhiêu chu kỳ máy? Đây là câu hỏi! Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
#9 |
|
PIC Bang chủ
|
Tất nhiên, phải chỉ ra điều kiện ràng buộc của a, b và c. Nếu như mình làm 1 vòng, 2 vòng, 3 vòng lặp thì giá trị a, b, c phải là bao nhiêu?
Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
#10 | |
|
Đệ tử 9 túi
|
Trích:
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
|
|
|
|
#11 |
|
Đệ tử 9 túi
|
Nếu sử dụng vòng lặp như thế này với giá trị nạp vào của count1,count2,count3 là a,b,c:
------------------------------ LOOP DECFSZ COUNT1,1 GOTO LOOP DECFSZ COUNT2,1 GOTO LOOP DECFSZ COUNT3,1 GOTO LOOP RETURN ------------------------------ Khi count1 giảm đến 0,sau đó giảm count2 xuống 1 và quay về LOOP count1 giảm thêm 1 nên sẽ là 255.Do vậy giá trị a không có ý nghĩa. Tương tự giá trị b cũng vậy. THỜI GIAN CHO VÒNG LẶP LOOP NÀY: Khi con trỏ đang ở dòng DECFSZ COUNT2,1 thì count1 có giá trị 0 Khi con trỏ đang ở dòng DECFSZ COUNT3,1 thì count1,count2 đều có giá trị 0 1) DECFSZ COUNT1,1 mất 1 chu kỳ máy GOTO LOOP mất 2 chu kỳ máy Để count1 giảm từ 0 về 1 mất 255*3 chu kỳ máy,giảm từ 1 về 0 mất thêm 1 chu kỳ máy nữa.Bây giờ con trỏ đang ở dòng DECFSZ COUNT2,1 Vậy thời gian đã thực thi là : (255*3 + 1)*t (t là thời gian thực thi 1 chu kỳ máy) 2) Mỗi lần count2 giảm 1 thì lại quay lại giảm count1 Thời gian giảm count2 cũng tính tương tự Vậy khi con trỏ ở DECFSZ COUNT3,1 thì thời gian đã thực thi là: ((255*3 + 1)*t)*255 + (255*3 + 1)*t 3) Tương tự tính cho giảm count3 từ c về 0. Vậy thời gian cho vòng lặp LOOP sẽ là: {[(255*3 + 1)*t]*255 + (255*3 + 1)*t}*(c-1) + [(c-1)*3 + 1]*t = {{[(255*3 + 1)]*255 + (255*3 + 1)}*(c-1) + (c-1)*3 + 1}*t = [(766*255 + 766)*(c-1) + (c-1)*3 + 1]*t = [196096*(c-1) + (c-1)*3 + 1]*t = (196099*c - 196098)*t Với c = 14 ,t = 0,4us thời gian này là (196099*14 - 196098)*0.4us = 1.02s Chắc không khó khăn gì để tính thời gian lặp kiểu này với n biến count!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 thay đổi nội dung bởi: nhh, 17-02-2006 lúc 10:14 AM. |
|
|
|
|
#12 |
|
Đệ tử 9 túi
|
Bác NTC hay bác F có thể post bài hướng dẫn tiếp về ngắt,timer,PWM,....cho anh em tham khảo được không ?
Đợi bài của các bác!
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
|
|
|
#13 |
|
PIC Bang chủ
|
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
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
#14 |
|
Đệ tử 8 túi
|
Thú vị thiêt. Tuy là cách tính có vẻ rắc rối, nhưng công thức cuối cùng lại rất đơn giản. Tính để một hai bữa nữa cho bà con ngâm cứu rồi trả lời mà nhh đã tự bật mí rồi.
|
|
|
|
|
#15 |
|
Đệ tử 6 túi
Tham gia ngày: Jun 2005
Bài gửi: 141
: |
Tiến tới Timer, ngắt và PMW đi thôi các bác.
|
|
|
![]() |
| Ðiều Chỉnh | |
| Xếp Bài | |
|
|
Similar Threads
|
||||
| Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
| TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
| TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
| Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
| Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
| CCS C for PIC16F877A | nhh | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 405 | 24-04-2008 12:00 PM |