![]() |
|
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 |
Trưởng lão PIC bang
|
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. |
![]() |
![]() |
![]() |
#2 |
Đệ 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. |
![]() |
![]() |
![]() |
#3 |
Trưởng lão PIC bang
|
+ 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 |
![]() |
![]() |
![]() |
#4 |
PIC Bang chủ
|
[code]... đoạn code...[/c*de]
Thay * bằng chữ o là được
__________________
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? |
![]() |
![]() |
![]() |
#5 |
Đệ 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 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. |
![]() |
![]() |
![]() |
#6 |
Trưởng lão PIC bang
|
- 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,
__________________
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 |
![]() |
![]() |
![]() |
#7 | |||
Đệ tử 1 túi
Tham gia ngày: Apr 2006
Bài gửi: 23
: |
Trích:
Trích:
Trích:
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? |
|||
![]() |
![]() |
![]() |
#8 | ||
Trưởng lão PIC bang
|
Trích:
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:
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 |
||
![]() |
![]() |
![]() |
|
|
![]() |
||||
Ðề 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 |