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. |
+ 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, |
[code]... đoạn code...[/c*de]
Thay * bằng chữ o là được |
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" 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. |
1 Attachment(s)
- 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, |
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? |
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 Trích:
Thân, |
Em la lính mới, lâu nay chỉ quen viết code bằng C và Basic, hôm nay mới xêm căn bản của MPAsm. Từ thread Hoc pic trong 1 ngay, em copy doan code sau
[QUOTE] TITLE "Mach test LED_1" PROCESSOR P16F628A INCLUDE <P16F628A.inc> __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC ORG 0x0000 GOTO MAIN ORG 0x0005 MAIN BANKSEL TRISB ; bank select CLRF TRISB ; trisb = 00000000 ; portb = output BANKSEL PORTB BSF PORTB, 0 ; rb0 = 1 ; RB0 = 5V GOTO $ ; dung chuong trinh tai day ; vong lap tai cho^~ ; khong bao gio ket thuc END ; lenh bat buoc de ket thuc [\QUOTE] nhung den khi dich thi MPasm lai báo: Error[132] temp.ASM 2 : Unknown processor (P16F628A) Message[301] P16F628A.INC 35 : MESSAGE: (Processor-header file mismatch. Verify selected processor.) Error[131] temp.ASM 4 : Processor type is undefined Warning[207] ASD.ASM 7 : Found label after column 1. (GOTO) Error[122] temp.ASM 7 : Illegal opcode (MAIN) Message[312] temp.ASM 13 : Page or Bank selection not needed for this device. No code generated. Warning[207] temp.ASM 14 : Found label after column 1. (CLRF) Error[122] temp.ASM 14 : Illegal opcode (TRISB) Message[312] temp.ASM 16 : Page or Bank selection not needed for this device. No code generated. Warning[207] temp.ASM 17 : Found label after column 1. (BSF) Error[122] temp.ASM 17 : Illegal opcode (PORTB) Warning[207] temp.ASM 19 : Found label after column 1. (GOTO) Error[108] temp.ASM 19 : Illegal character ($) Error[131] temp.ASM 23 : Processor type is undefined Mong các tiền bối giúp đỡ Cám ơn |
Bộ xử lý được chọn trong MPLAB khác với PIC16F628A mà bạn đang định dùng. Bạn vào mênu Configure của MPLAB, chọn lệnh Select Device ..., sau đó chọn PIC16F628A trong danh sách thả xuống Device, sau đó nhấn nút OK.
Biên dịch lại xem còn có thông báo lỗi nào không. Các warning là để nhắc nhở, đôi khi bạn viết tập tin nguồn không đúng khuôn dạng đã định trước (nhãn nằm sau cột 1, các directive hay lệnh mnemonic nằm ở cột 1, ...) Thân, |
Cám ơn rất nhiều
Mình đã gỡ rối được rồi Thân |
Sao chưa thấy anh falleaf viết tiếp nhỉ?
Qua bài học pic trong một ngày, cùng với sự giúp đỡ của anh Nam, em đã làm được những việc sau: hiển thị led chạy vòng ở PortB, hiển thị LCD (cũng ở PortB), nhận phím bấm từ PortA và thay đổi hiển thị tương ứng trên LCD.
Chỉ còn chưa tìm ra nguyên nhân tại sao khi hiển thị lên LCD, các ký tự hiển thị lần lượt và cách nhau một lúc chứ không tạo ra được cảm giác hiện đồng thời, dù rằng trong chương trình hiển thị có delay sau khi đưa ký tự nhưng là delay tối thiểu (nhỏ nữa thì cứ hai ký tự nó lại hiện một). Bác Namqn có thể giải thích hộ em không (Data LCD của em là 4 bit, và các chân Port B dùng chung cho cả LCD và các LED hiển thị). Cũng coi như tạm ổn phần vào ra, bàn phím và hiển thị, bây giờ đang muốn giao tiếp với máy tính nhưng chưa thấy chủ đề nào của anh falleaf cả. Rất mong anh viết tiếp nhé. Nếu có thể anh cho luôn mạch giao tiếp giữa PIC và cổng COM luôn. |
Trích:
Về phần giao tiếp giữa PIC và cổng nối tiếp, bạn đọc thêm trong luồng về bootloader, và các luồng nói về PIC16F877A. Thân, |
mình đoán là trong đoạn code ghi dữ liệu lên LCD của bạn có đoạn mã tạo trễ nên mỗi khi gửi một ký tự nó trễ một chút.
|
3 Attachment(s)
Em đã đọc phần truyền thông nối tiếp nhưng chưa kịp làm vì có một số lỗi khi thực hiện phím và hiển thị.
Mục đích của em là ban đầu cho hiển thị hai dòng ký tự, sau khi ấn phím key0 thì nó sẽ xóa hai dòng ban đầu và ghi lên đó hai dòng mới. Em dùng kỹ thuật bảng để truy xuất các dòng ký tự. Tuy nhiên nếu hai dòng ban đầu của em dài quá (mỗi dòng 19 ký tự chẳng hạn) thì sau khi hiển thị ban đầu xong PIC sẽ tự khởi động lại và liên tục như vậy. Khi cho dòng ban đầu ngắn đi, thì hiện tượng tương tự xảy ra khi ấn phím. Sau khi ấn, màn hình xóa hai dòng ban đầu và ghi hai dòng mới, sau khi ghi được một số ký tự thì PIC khởi động lại và hiển thị lại hai dòng ban đầu. Nếu cho hai dòng sau ngắn đi thì không khởi động lại. Đây liệu có phải là hiện tượng tràn trang không anh nhỉ? Lỗi thứ hai: trong chương trình hiển thị của em dùng hàm trễ (các giá trị không chính xác do em thay đổi các giá trị tham số ở trong để thử). Khi hiển thị, các ký tự lần lượt hiện lên rất chậm. Em đã thử giảm thời gian trễ nhưng khi đó hoặc là hiển thị thiếu ký tự, hoặc là hiển thị sai chỗ hoặc sai từ. Không hiểu lý do gì. Nếu có thời gian anh xem hộ em lệnh Retlw 0x00 ở sau nhãn NEXTMESSAGE30 sẽ trả về đâu nhé, em muốn nó thoát khỏi KEY1_0 nhưng không biết có được không? Em gửi kèm đây sơ đồ nguyên lý vẽ bằng Protel, ảnh sơ đồ nguyên lý, và chương trình của em, anh xem hộ nhé! |
Trích:
Trích:
MOVLW H'28' CALL WRITE_COMMAND CALL DELAY MOVLW H'28' CALL WRITE_COMMAND bạn cần thêm lệnh dịch màn hình và con trỏ, trước khi hiển thị thì đưa địa chỉ cần hiển thị để WRITE_COMMAND trước rồi WRITE_DATA sau thì vị trí chữ hiển thị sẽ đúng thôi. Trích:
|
Múi giờ GMT. Hiện tại là 06:09 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam