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 Bài Trong Ngày 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 09-02-2009, 05:25 PM   #301
tiendh
Nhập môn đệ tử
 
Tham gia ngày: Feb 2009
Bài gửi: 10
:
Chào các huynh
đệ mới nhập môn pic,các huynh cho đệ hỏi chút. Đệ viết đoạn code này nhưng sao nó cứ báo lỗi khi dịch nhỉ? Nhân tiện các huynh cho đệ hỏi cách truy nhập đến từng bit của thanh ghi bất kỳ, chẳng hạn portB. Đệ dùng CCS.ko biết dùng chỉ thị #bit hay #byte vậy có đượcko?

Code:
#include <16F877.h>
#use delay( clock=20000000)
#byte portb=0x06
int1 x;
Main()
{ 
x=portb.0;
while(1)
{ 
output_high(x) ;
Delay_ms(50) ; // delay 250ms
Output_low (x);
Delay_ms (50 );
}
}

thay đổi nội dung bởi: namqn, 09-02-2009 lúc 05:57 PM.
tiendh vẫn chưa có mặt trong diễn đàn  
Old 09-02-2009, 06:08 PM   #302
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 tiendh View Post
Chào các huynh
đệ mới nhập môn pic,các huynh cho đệ hỏi chút. Đệ viết đoạn code này nhưng sao nó cứ báo lỗi khi dịch nhỉ? Nhân tiện các huynh cho đệ hỏi cách truy nhập đến từng bit của thanh ghi bất kỳ, chẳng hạn portB. Đệ dùng CCS.ko biết dùng chỉ thị #bit hay #byte vậy có đượcko?

Code:
#include <16F877.h>
#use delay( clock=20000000)
#byte portb=0x06
int1 x;
Main()
{ 
x=portb.0;
while(1)
{ 
output_high(x) ;
Delay_ms(50) ; // delay 250ms
Output_low (x);
Delay_ms (50 );
}
}
Bạn nên cho biết thông báo lỗi mà bạn đã gặp, nó sẽ giúp những người khác giúp bạn tốt hơn.

Tôi không dùng CCS C, nhưng theo tài liệu hướng dẫn của trình dịch này, các hàm output_high() và output_low() nhận đối số là địa chỉ bit (ít nhất là cần 8 bit, theo tài liệu thì có thể dùng 16 bit). Code của bạn lấy trạng thái của chân RB0 để gán cho biến x (kiểu bit), rồi dùng biến x đó làm đối số của các hàm vừa nêu, theo tôi là không ổn.

Trong thực tế, để bật/tắt các chân I/O của PIC, bạn cũng cần phải thiết lập chúng như những ngõ ra, bằng cách xóa các bit tương ứng trong thanh ghi TRISx tương ứng.

Các bit của các port I/O đã được định nghĩa sẵn trong các header file được cung cấp cùng với CCS C.

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 09-02-2009, 07:13 PM   #303
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 phandinh View Post
cho em hỏi trong phần delay lệnh:
GOTO $-1
GOTO $+2
nghĩa là sao
em mới học nên chưa rành lắm
GOTO $-1 nghĩa là nhảy đến lệnh nằm trước (dấu trừ) lệnh hiện hành (ký hiệu $) 1 từ lệnh, GOTO $+2 là nhảy đến lệnh nằm sau (dấu cộng) lệnh hiện hành 2 từ lệnh.

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 09-02-2009, 07:51 PM   #304
tong nhat khon
Nhập môn đệ tử
 
Tham gia ngày: Feb 2009
Bài gửi: 6
:
sao em không thấy anh Chính viết tiếp các bải dạy về Pic16f877a nữa ạ . Em thấy anh viết rất dễ hiểu mà nhất là đối với người mới bắt đầu học về Pic như em. Mong anh tiếp tục viết bài để giúp đỡ những người mơi học chúng em . em cảm ơn anh nhiều !
tong nhat khon vẫn chưa có mặt trong diễn đàn  
Old 09-02-2009, 09:15 PM   #305
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 phandinh View Post
cho em hỏi trong phần delay của bác nhh:
LOOP
DECFSZ COUNT1,1
GOTO LOOP
DECFSZ COUNT2,1
GOTO LOOP
DECFSZ COUNT3,1
GOTO LOOP
RETURN

END
vậy khi count1 đã về 0 rồi nhưng khi lặp lại thì gt trong count1 có phải là 255 ko?
nếu đúng như vậy (giống 8051) thì csch1 tính delay sẽ ko chính xác nữa
Không rõ bạn nói đến cách tính nào sẽ không chính xác.

Tôi vừa xem lại phần tính toán của nhh ở post #31, thấy có chỗ không ổn, nên đã ngồi tính toán lại (tôi thường ít dùng các hàm delay kiểu này cho thời gian từ vài ms trở lên). Sau đây là phần tính toán:

- Gọi a, b, c (a > 0, b > 0, và c > 0) là các giá trị được khởi tạo của các biến COUNT1, COUNT2, và COUNT3 trước khi thực hiện chương trình con LOOP trên.

1. Sau (a-1)*3 chu kỳ máy thì COUNT1 = 1.

2. Tốn thêm 2 chu kỳ máy để COUNT1 = 0 và bỏ qua lệnh GOTO thứ nhất (ngay sau lệnh DECFSZ COUNT1, 1). Từ lúc này a không còn tác dụng.

3. Sau (b-1)*[3 + 255*3 + 2] chu kỳ máy tiếp theo thì COUNT2 = 1.

4. Tốn thêm 2 chu kỳ máy để COUNT2 = 0 và bỏ qua lệnh GOTO thứ hai (ngay sau lệnh DECFSZ COUNT2, 1). Từ lúc này b không còn tác dụng.

5. Sau (c-1)*{3 + 255*[3 + 255*3 + 2] + (255*3 + 2) + 2} chu kỳ máy để COUNT3 = 1.

6. Tốn thêm 2 chu kỳ máy để COUNT3 = 0 và bỏ qua lệnh GOTO thứ ba (ngay sau lệnh DECFSZ COUNT3, 1).

Như vậy, tổng số chu kỳ máy cần thiết để hoàn tất đoạn lệnh bên trong chương trình con LOOP (không kể lệnh RETURN) sẽ là:
No_cycles = (a-1)*3 + 2 + (b-1)*[3 + 255*3 + 2] + 2 + (c-1)*{3 + 255*[3 + 255*3 + 2] + (255*3 + 2) + 2} + 2 = 3*(a-1) + 770*(b-1) + 197122*(c-1) + 6

Chú ý giả thiết a, b, và c đều là các số dương. Công thức đã được kiểm tra với các giá trị ngẫu nhiên a, b, và c, sử dụng MPLAB SIM.

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 10-02-2009, 06:26 AM   #306
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
thanhks so much
phandinh vẫn chưa có mặt trong diễn đàn  
Old 11-02-2009, 12:38 AM   #307
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
Tài liệu về pic

Em có tài liệu này nói về phần ngắt timer khá hay của bác nào ko rõ, em đang nghiên cứuuuu.
Các bác xem thử
phandinh vẫn chưa có mặt trong diễn đàn  
Old 11-02-2009, 12:52 AM   #308
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
giờ mới được

giờ mới được
File Kèm Theo
File Type: rar PICtongquat.rar (483.6 KB, 1637 lần tải)
phandinh vẫn chưa có mặt trong diễn đàn  
Old 11-02-2009, 01:03 AM   #309
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
Wink

Em đang học PIC bằng cả 2 ngôn ngữ A SM và C
ko biết có tham lam quá ?????
khi viết bên mplab ok rồi qua ccs viết lại nếu ok nữa thì
thật tuyệt vời (...dù chỉ mói viết nhấp nháy led...)
Nhưng không sao , em sẽ cố gắng từ cái đơn giản nhất.
Chúc cả làng ngon giấc
"impossible i s nothing"
phandinh vẫn chưa có mặt trong diễn đàn  
Old 11-02-2009, 10:55 AM   #310
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
sao không có ai thảo luận luồng này nữa vậy
phandinh vẫn chưa có mặt trong diễn đàn  
Old 11-02-2009, 09:53 PM   #311
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
kíu em

Đây là bài em viết mỗi khi nhấn nút ở chân RB0 thì sẽ hiển thị lên led ở po rtA.
Dịch ra file he x thì ok, nhưng mô phỏng proteus lại ko dc.
Em nghĩ là do ngắt .
Code:
;=======================================================
		TITLE 		"Mach test ngat ngoai"
		PROCESSOR	P16F877A
		INCLUDE 	<P16F877A.inc>
		__CONFIG    _CP_OFF	& _PWRTE_ON & _WDT_OFF &_HS_OSC

;chan RB0 noi voi cong tac de dem so lan nhan
;port A noi voi cac led hien de hien thi so binary
;===============================================================================
count 	equ 	0x30
portA 	equ 	0x05
intcon 	equ	 0x0b
TRISB	equ 	0x86
trisA	equ 	0x85

		ORG	0x0000
		GOTO	MAIN
		org 0x0400
		goto 	ngat
		ORG	0x0005
MAIN	
		bsf 		intcon,7
		bsf 		intcon,4
		bcf 		intcon,1
		BANKSEL		TRISB		; bank select
		movlw 		b'00000001'
		movwf		TRISB	; trisb = #w; rb0 = input
		BANKSEL		trisA
		movlw  		0x000
		movwf    	             trisA

		movwf 		count
		movlw 		portA		
		goto 		$-2
ngat    
		incf 		count,1	;tăng giá trị lên 1 và lưu lại trong count	
		retfie 
		END				
;================================================================================
File Kèm Theo
File Type: rar ngat ngoai.rar (11.6 KB, 177 lần tải)

thay đổi nội dung bởi: namqn, 12-02-2009 lúc 01:11 AM.
phandinh vẫn chưa có mặt trong diễn đàn  
Old 11-02-2009, 11:32 PM   #312
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
em cũng đã thử thêm lệnh ' BCF INTCON,INTF '
vào chương trình ngắt mà vẫn ko dc
phandinh vẫn chưa có mặt trong diễn đàn  
Old 12-02-2009, 01:20 AM   #313
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
- Vector ngắt nằm ở 0x0004 chứ không phải ở 0x0400 như bạn đã viết.

- TRISA và TRISB nằm cùng bank, do đó BANKSEL TRISA là không cần thiết.

- PORTA nằm khác bank với TRISA, chỗ này thì bạn lại thiếu BANKSEL PORTA.

- Hai lệnh MOVWF COUNT và MOVLW PORTA lẽ ra phải là MOVF COUNT, W và MOVWF PORTA.

- Xử lý xong ngắt thì phải xóa cờ ngắt, do đó vẫn cần xóa cờ INTF trong thanh ghi INTCON trước khi thoát khỏi chương trình xử lý ngắt.

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

thay đổi nội dung bởi: namqn, 12-02-2009 lúc 09:11 PM. Lý do: bổ sung một ý
namqn vẫn chưa có mặt trong diễn đàn  
Old 12-02-2009, 04:39 PM   #314
phandinh
Đệ tử 6 túi
 
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
:
Từ sáng giờ em đã làm lại. Do vừa tìm hiểu lệnh, các thanh ghi nữa nên
hơi lâu. ct được viết lại như dưới nhưng vẫn chưa được.
Nút nhấn chỉ có tác dụng ở lần đầu tiên. tức là ' nhấn lần thứ NHẤT ---> RA0 = 1 '
nhưng những lần nhấn tiếp theo vẫn chỉ có RA0 = 1 .
Em nghi ngờ ở lần ngắt đầu tiên (trong chương trình ngắt) đã tác động
đến thanh ghi nào đấy , và nó đã không cho phép ngắt nữa.
---------------------------------------------
Code:
;=======================================================
		TITLE 		"Mach test ngat ngoai"
		PROCESSOR	P16F877A
		INCLUDE 	<P16F877A.inc>
		__CONFIG    _CP_OFF	& _PWRTE_ON & _WDT_OFF &_HS_OSC

;chan RB0 noi voi cong tac de dem so lan nhan
;port A noi voi cac led hien de hien thi so binary
;=================================================================
COUNT 	equ 	20H
		ORG		00H
		GOTO	MAIN
		org 	04H	
		goto 	NGAT
;===============CHUONG TRINH CHINH================================
		ORG	0x0005
MAIN		
		BANKSEL		TRISB		; bank select
		movlw 		b'00000001'
		movwf		TRISB		; trisb = #w; rb0 = input
		movlw  		00h
		movwf    	TRISA
		BANKSEL 	PORTA
		bsf 		INTCON,7                         
		bsf 		INTCON,4
		bcf 		INTCON,1
		CLRF 		W
		movwf 		PORTA		
		goto 		$-1			
;==================CHUONG TRINH NGAT=============================
NGAT    
		incf 		COUNT,0	;tang g.tri count len 1 & luu trong 'W'		
		BCF			INTCON,1
		retfie 					; return from interrupt		
END				
;====================================================================

thay đổi nội dung bởi: namqn, 12-02-2009 lúc 05:13 PM.
phandinh vẫn chưa có mặt trong diễn đàn  
Old 12-02-2009, 09:07 PM   #315
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
Chương trình chạy theo đúng những gì bạn đã viết. Trong phần xử lý ngắt, bạn tăng biến COUNT lên 1 đơn vị, nhưng lại ghi kết quả vào W, do đó biến COUNT vẫn chứa giá trị ban đầu (không hề bị thay đổi). Ở những lần ngắt tiếp theo, giá trị cũ của biến COUNT vẫn được tăng lên 1 đơn vị và ghi vào thanh ghi W, còn biến COUNT hoàn toàn không bị thay đổi giá trị.

Phần xử lý ngắt của bạn còn thiếu một lệnh, đó là ghi lại kết quả phép toán tăng 1 đơn vị vào biến COUNT (movwf COUNT), sau lệnh INCF COUNT, 0.

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  
Ðề tài đã khoá


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à 06:31 PM.


Đượ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