PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 12-02-2006, 01:19 PM   #1
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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
nhh vẫn chưa có mặt trong diễn đàn  
Old 14-02-2006, 08:08 AM   #2
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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.
nhh vẫn chưa có mặt trong diễn đàn  
Old 12-05-2008, 02:08 PM   #3
doremino
Đệ tử 3 túi
 
Tham gia ngày: Apr 2008
Bài gửi: 48
:
Cool !!!!nhờ các bác giải đáp giúp em!!!!!

Trích:
Nguyên văn bởi nhh View Post
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
cho em hỏi đoạn _CONFIGURATION_... có tác dụng gì vậy!!!
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
doremino vẫn chưa có mặt trong diễn đàn  
Old 12-05-2008, 08:36 PM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi doremino View Post
cho em hỏi đoạn _CONFIGURATION_... có tác dụng gì vậy!!!
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!!!
Đoạn __CONFIG ... dùng để đặt cấu hình cho PIC, nên có. Nếu không có đoạn này thì PIC sẽ chạy ở cấu hình mặc định (thông tin có trong datasheet của PIC).

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
namqn vẫn chưa có mặt trong diễn đàn  
Old 14-02-2006, 08:10 AM   #5
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
;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
nhh vẫn chưa có mặt trong diễn đàn  
Old 14-02-2006, 10:01 AM   #6
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
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.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 15-02-2006, 01:19 PM   #7
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Ặ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.
__________________

ntc vẫn chưa có mặt trong diễn đàn  
Old 15-02-2006, 02:49 PM   #8
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
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.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 15-02-2006, 02:52 PM   #9
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
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.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 17-02-2006, 09:06 AM   #10
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi ntc
Ặ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.
nhh đã chạy thử rồi mới dám post lên chứ!Bác ntc thử chạy xem sao?
__________________
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
nhh vẫn chưa có mặt trong diễn đàn  
Old 17-02-2006, 09:59 AM   #11
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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.
nhh vẫn chưa có mặt trong diễn đàn  
Old 17-02-2006, 10:18 AM   #12
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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
nhh vẫn chưa có mặt trong diễn đàn  
Old 17-02-2006, 11:27 AM   #13
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  
Old 17-02-2006, 11:23 AM   #14
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
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.
__________________

ntc vẫn chưa có mặt trong diễn đàn  
Old 20-02-2006, 01:29 PM   #15
tinhthanthep
Đệ tử 6 túi
 
tinhthanthep's Avatar
 
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.
tinhthanthep vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

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


Múi giờ GMT. Hiện tại là 08:00 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam