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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 06-07-2006, 08:12 PM   #1
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
Thạch anh 4 MHz là đủ để em học rồi.

Chương trình của em được viết theo kiểu "râu ông nọ cắm cằm bà kia", phản ứng của nó là khó xác định trước. Phần code đã sửa chỉ để hướng dẫn cho em cách viết cblock, nó không phải là một chương trình hoàn chỉnh. Em dùng lệnh gọi chương trình con DELAY, nhưng chương trình con đó lại không có lệnh return để trở về chương trình gọi. Ngoài ra, phần code để đặt d1, d2, và d3 hoàn toàn không được thực thi, nên có chỉnh chúng cũng không có tác dụng.

RB4 của 628A là một chân đặc biệt, nếu con chip của em mới tinh, và em không xóa bit cấu hình LVP, thì chân RB4 là ngõ vào, dùng để kích hoạt chế độ nạp chương trình ở điện áp thấp. Đó có thể là lý do khiến chân RB4 không phản ứng giống những chân kia.

Để hiểu thêm về hợp ngữ thì em đọc thêm tài liệu "MPASM™ Assembler, MPLINK™ Object Linker, MPLIB™ Object Librarian User’s Guide" (DS33014j), download tại đây:
http://ww1.microchip.com/downloads/e...Doc/33014J.pdf

Nếu không upload được chương trình lên forum thì có thể gửi email cho tôi, địa chỉ email của tôi có trong phần thông tin thành viên.

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, 06-07-2006 lúc 08:27 PM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-07-2006, 11:48 AM   #2
chuchinh
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 23
:
OK. Đúng là phần code d1, d2, d3 của em không thực thi. Bây giờ em đã biết cách thực hiện trễ trong chương trình theo ý muốn.
Em vẫn có một số thắc mắc, mong anh giải đáp dùm:
+ RB4 của em đã sáng sau khi xóa LVP, nhưng RA4 lại không sáng.
+ Đoạn code sau em dùng lệnh if chỉ để thay đổi giá trị thanh ghi W theo d4, trước khi vào kiểm tra em đã đặt d4=1, không hiểu sao vào chương trình nó lại kiểm tra thấy d4!=1 (Em dùng f7 để chạy thấy nó trỏ ngay đến dòng movlw 0x01 sau lệnh else thứ 2).

cblock 0x020
COUNT_L
d4
endc
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
movlw 0x01
movwf d4
if(d4==0x01)
movlw 0x01; bit 0
incf d4,f
else
if d4==0x02
movlw 0x02
decf d4,f
else
movlw 0x01 ; con tro tro luon den dong nay
movf d4
movlw 0x06
endif
endif
movwf COUNT_L
nop
;================================================= ============================
GOTO $
END

Không biết cách đặt code vào trong khung thế nào nhỉ, thấy anh falleaf hướng dẫn đâu đó mà tìm không thấy.
chuchinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-07-2006, 06:55 PM   #3
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
+ RA4 không sáng vì nó là loại open drain (cực máng hở), nó chỉ có thể kéo dòng vào mà không thể cấp dòng ra. Nói cách khác, nó chỉ có thể tạo mức thấp ở ngõ ra và không thể tạo mức cao ở ngõ ra. Hy vọng không phải giải thích thêm về open drain cho em nữa (nếu cần thì em xem thêm figure 5-4 trong datasheet của PIC16F628A).

+ lệnh if ... else ... endif là lệnh hợp dịch có điều kiện, nó không dùng để thực hiện các lệnh chuyển điều khiển trong chương trình. Trong chương trình của em, d4 được gán giá trị hằng số là 0x21, còn các lệnh movwf d4 sẽ đặt giá trị trong thanh ghi W vào ô nhớ có địa chỉ là d4 (0x21 trong trường hợp này). Do đó những gì mà em đã thấy khi debug là đúng (vì cả hai lệnh if đều không thỏa, chúng so sánh hằng số d4 với các hằng số 0x01 và 0x02).

+ Để đặt khối lệnh vào khung code, em chọn khối lệnh đó, nhấn vào nút có hình # ở phía góc phải (nút thứ ba từ phải sang). Em có thể phải chọn phần Advanced thì mới thấy các nút này.

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   Trả Lời Với Trích Dẫn
Old 12-07-2006, 06:57 PM   #4
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
[code]... đoạn code...[/c*de]
Thay * bằng chữ o là được
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-07-2006, 10:01 AM   #5
chuchinh
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 23
:
Cảm ơn hai anh, tại vị trí RA4 em cho thêm một con trở kéo lên và đèn đã sáng. Như vậy việc test out tại các cổng đã xong.
Bây giờ em test cổng A như là đầu vào với các chân được nối với trở 560R xuống GND, 4 phím bấm nối với các chân RA0-RA3 và có chân chung là 5V. Em copy đoạn chương trình bật đèn tại cổng B tương ứng phím bấm tại cổng A của anh Falleaf, chỉ bật đèn ở Port B khi có tín hiệu 5V tại port A tương ứng (thay lệnh BTFSC bằng BTFSS). Tuy nhiên các đèn lại sáng hết và không có tác động gì khi ấn phím. Còn khi thay hai lệnh BTFSS bằng BTFSC thì hai đèn tương ứng bị tắt. Dường như Port A không thay đổi giá trị khi ấn phím và luôn luôn giữ giá trị 0. Các anh có thể chỉ cho em tại sao không?
Đoạn chương trình của em:
Code:
			TITLE "Mach test ban phim"
			PROCESSOR P16F628A
			INCLUDE <P16F628A.inc>
			__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC & _LVP_OFF
;================================================= ======
			ORG 0x0000
			GOTO MAIN
			ORG 0x0005
MAIN
			BANKSEL TRISB
			CLRF	TRISB
			MOVLW	0xff  ; chon cong A la dau vao
			MOVWF	TRISA
			BANKSEL	PORTB
			;CLRF 	PORTA ; lenh nay co hay khong deu thuc hien nhu nhau
			CLRF 	PORTB

;=============================================================================

SW0          BTFSS            PORTA,         0
             GOTO             TURNON0
             BCF              PORTB,         0

SW1          BTFSC            PORTA,         1
             GOTO             TURNON1
             BCF              PORTB,         1; khi thay BTFSS boi BTFSC thi den nay tat

SW2          BTFSS            PORTA,         2
             GOTO             TURNON2
             BCF              PORTB,         2

SW3          BTFSC            PORTA,         3
             GOTO             TURNON3
             BCF              PORTB,         3; khi thay BTFSS boi BTFSC thi den nay tat

             GOTO             SW0                          ; quay l?i quét t? d?u

TURNON0      BSF              PORTB,          0
             GOTO             SW1

TURNON1      BSF              PORTB,          1
             GOTO             SW2

TURNON2      BSF              PORTB,          2
             GOTO             SW3

TURNON3      BSF              PORTB,          3
             GOTO             SW0			


			nop
;=============================================================================
			END
Còn nữa, anh có giải pháp nào để em có thể so sánh giá trị tại địa chỉ d4 mà không phải là so sánh d4 với 0x01 không, chỉ em luôn nhé.
Cho em hỏi thêm ngoài lề: nếu dùng LCD với 4 đường dữ liệu thì đấu nối RB0 với D4, RB1 với D5, RB2 với D6, RB3 với D7? còn khi khởi động thì đưa giá trị 30h ra LCD để RESET LCD trước (theo cách 4 đường dữ liệu) hay khởi tạo LCD ở chế độ 4 bít trước?
Thank so much.

thay đổi nội dung bởi: chuchinh, 17-07-2006 lúc 06:07 PM.
chuchinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-07-2006, 06:48 PM   #6
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
- RA0..RA3 của PIC16F628(A) là các chân được dồn kênh với các ngõ vào của các bộ so sánh, với trạng thái mặc định là ngõ vào cho các bộ so sánh, và sẽ có giá trị '0' khi đọc về. Do đó, để sử dụng như các chân vào/ra số, em phải đặt trạng thái cho các chân là vào/ra số thông qua thanh ghi CMCON. Xem chương 5 'I/O Ports' trong datasheet của chip, đọc ví dụ Example 5-1 để biết cách thiết lập thanh ghi CMCON.

- Câu hỏi thứ hai của em không rõ lắm, thực sự không hiểu em định làm gì.

- Nếu em có datasheet của một LCD dùng chip tương thích HD44780 (của Hitachi), đọc phần hướng dẫn cách khởi tạo cho chế độ giao tiếp 4-bit. Nếu không có datasheet đó thì tải tài liệu dưới đây, xem hình 26.

Thân,
File Kèm Theo
File Type: pdf LCD1602-HD44780.pdf (389.9 KB, 217 lần tải)
__________________
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   Trả Lời Với Trích Dẫn
Old 19-07-2006, 04:11 PM   #7
chuchinh
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 23
:
Trích:
Nguyên văn bởi namqn
Em phải đặt trạng thái cho các chân là vào/ra số thông qua thanh ghi CMCON
Ổn rồi anh ạ, đèn đã sáng khi em ấn phím tương ứng.
Trích:
Nguyên văn bởi namqn
- Câu hỏi thứ hai của em không rõ lắm, thực sự không hiểu em định làm gì.
Trong phần code em gửi kèm trong mục 46 bài này có hằng địa chỉ d4, em đem so sánh với 1 và 2 nhưng không bằng (như anh đã chỉ ở trên là do em nạp giá trị vào địa chỉ d4 chứ bản thân d4 bằng 0x21), vậy em phải viết lệnh như thế nào thì so sánh giá trị tại d4 với 0x01? Ngoài ra câu này em không hiểu: "lệnh if ... else ... endif là lệnh hợp dịch có điều kiện, nó không dùng để thực hiện các lệnh chuyển điều khiển trong chương trình". Khi kiểm tra giá trị tại địa chỉ d4 mà bằng 1, em muốn thực hiện một số thao tác nào đó (sửa giá trị một biến nào đó chẳng hạn), còn nếu không bằng thì thực hiện các thao tác khác, điều này có được không a? Phần ngôn ngữ em có nhiều cái chưa hiểu, mong anh chỉ dùm.
Trích:
Nguyên văn bởi namqn
- Nếu em có datasheet của một LCD dùng chip tương thích HD44780 (của Hitachi), đọc phần hướng dẫn cách khởi tạo cho chế độ giao tiếp 4-bit
OK, màn hình của em đã hiển thị được dòng chữ "Cam on anh nhieu". He he, merci.
Em hỏi thêm tý: em muốn dùng ngắt bàn phím, nhưng không biết mắc thế nào. Hiện nay Port B đã dùng để cho LCD 4 bit (RB0-RB3 cho D4-D7, RB4 cho RS, RB6 cho R/W, RB7 cho E). Còn tại cổng A thì RA0-RA3 đang dùng cho đầu vào 4 phím, RA6, RA7 dùng cho CLK. Trong mạch 8051, để dùng ngắt bàn phím em thấy họ dùng con 148 và lấy đầu ra báo ngắt để đưa vào chân ngắt. Ở đây có làm tương tự được không anh?
chuchinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-07-2006, 07:40 PM   #8
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 chuchinh
Trong phần code em gửi kèm trong mục 46 bài này có hằng địa chỉ d4, em đem so sánh với 1 và 2 nhưng không bằng (như anh đã chỉ ở trên là do em nạp giá trị vào địa chỉ d4 chứ bản thân d4 bằng 0x21), vậy em phải viết lệnh như thế nào thì so sánh giá trị tại d4 với 0x01? Ngoài ra câu này em không hiểu: "lệnh if ... else ... endif là lệnh hợp dịch có điều kiện, nó không dùng để thực hiện các lệnh chuyển điều khiển trong chương trình". Khi kiểm tra giá trị tại địa chỉ d4 mà bằng 1, em muốn thực hiện một số thao tác nào đó (sửa giá trị một biến nào đó chẳng hạn), còn nếu không bằng thì thực hiện các thao tác khác, điều này có được không a? Phần ngôn ngữ em có nhiều cái chưa hiểu, mong anh chỉ dùm.?
Việc em muốn thực thi một số lệnh ứng với d4 = 0x01 chính là sử dụng khả năng chuyển điều khiển trong chương trình, còn những lệnh hợp dịch có điều kiện, chẳng hạn như if ... else ... endif, là những lệnh cho phép em dịch một khối lệnh nào đó tùy theo điều kiện nào đó (ví dụ, lúc debug em muốn có một số lệnh chèn vào code để kiểm tra, nhưng khi chạy tốt thì không cần các lệnh đó, nếu làm bằng tay thì rất mất công, dùng lệnh hợp dịch có điều kiện thì chỉ cần define một hằng nào đó chẳng hạn là xong).

Về chuyển điều khiển dựa vào giá trị tại d4, sau đây là một ví dụ
Code:
    movf d4, w    ;Đặt d4 vào W
    sublw 0x01    ;So sánh với 0x01
    skpz    ;Nếu bằng thì bỏ lệnh kế tiếp
    goto sosanh2
    incf d4    ;Đây là khối lệnh sẽ được thực thi nếu W = d4 = 0x01
    movlw '1'
    goto xong
sosanh2
    movf d4, w    ;Đặt d4 vào W
    sublw 0x02    ;So sánh với 0x02
    skpz    ;Nếu bằng thì bỏ lệnh kế tiếp
    goto xong
    decf d4    ;Đây là khối lệnh sẽ được thực thi nếu W = d4 = 0x02
    movlw '2'
xong
Trích:
Nguyên văn bởi chuchinh
Em hỏi thêm tý: em muốn dùng ngắt bàn phím, nhưng không biết mắc thế nào. Hiện nay Port B đã dùng để cho LCD 4 bit (RB0-RB3 cho D4-D7, RB4 cho RS, RB6 cho R/W, RB7 cho E). Còn tại cổng A thì RA0-RA3 đang dùng cho đầu vào 4 phím, RA6, RA7 dùng cho CLK. Trong mạch 8051, để dùng ngắt bàn phím em thấy họ dùng con 148 và lấy đầu ra báo ngắt để đưa vào chân ngắt. Ở đây có làm tương tự được không anh?
PIC16F628A có một số chân để dùng với ngắt ngoài, chẳng hạn RB0/INT cho phép chọn cạnh tạo ngắt, còn RB4..RB7 thì sẽ tạo ngắt khi có thay đổi (tất nhiên là phải thiết lập một cách thích hợp, và cho phép ngắt tương ứng). Vậy em có thể theo cách tương tự như với 8051, lấy đầu ra báo ngắt để đưa vào RB0/INT chẳng hạn, để thực hiện ngắt bàn phí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   Trả Lời Với Trích Dẫn
Trả lờ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
Cho mình hỏi cách tạo xung mV hoặc microvon trungnnd PIC - Thiết kế và Ứng dụng 1 22-03-2013 02:30 PM


Múi giờ GMT. Hiện tại là 02:47 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