PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Thảo luận xung quanh Học PIC trong 1 ngày (http://www.picvietnam.com/forum/showthread.php?t=446)

namqn 04-07-2006 06:05 PM

cblock là từ khóa bắt đầu macro khai báo một khối hằng số. Trong chương trình của bạn, nó được dùng để khai báo 3 hằng số d1, d2, d3 (được dùng làm địa chỉ của 3 biến byte). Để chương trình có thể dịch được thì bạn phải cung cấp một hằng số sau cblock, đó chính là giá trị bắt đầu của các hằng số. Ví dụ
Code:

cblock 0x20
d1
d2
d3
endc

sẽ tạo ra 3 hằng số d1 = 0x20, d2 = 0x21, và d3 = 0x22.

Bạn phải xác định địa chỉ của khối biến cho thích hợp và đặt địa chỉ đầu của khối biến vào sau cblock.

Thân,

chuchinh 05-07-2006 09:31 AM

1 Attachment(s)
Oh, xin lỗi vì em cũng chỉ mới bắt đầu tìm hiểu về MPASM nên chưa hiểu nhiều về các cấu trúc của nó. Em đã thêm 0x023 vào sau cblock, nhưng chương trình vẫn báo lỗi này:
Error - section '.org_4' can not fit the absolute section. Section '.org_4' start=0x00000005, length=0x0000003c
Em gửi kèm theo file của em, anh xem hộ nhé:

namqn 05-07-2006 06:59 PM

1 Attachment(s)
Đã chỉnh lại chương trình cho em rồi đây. Em nhớ chọn chip từ lệnh mênu Configure > Select Device để có chip là 16F628A nhé. Sau đó có thể mở tập tin nguồn, chọn lệnh Quickbuild từ mênu Project (không cần phải tạo project cho chương trình chỉ có một tập tin .asm).

Đừng để ý cái warning về chip và cái message nhắc nhở là thanh ghi không nằm ở bank 0.

Thân,

chuchinh 06-07-2006 10:32 AM

Cảm ơn anh, cho em hỏi thêm
 
Em đã biết anh sửa chỗ nào nhưng cũng chưa hiểu sao cách khai báo đấy lại không được. Đang nghiên cứu quyển MPLAB IDE, hy vọng sau khi đọc xong sẽ bớt hỏi hơn.
Em muốn hỏi thêm: Em dùng thạch anh 11,0592MHz có được không? Vì em thấy thời gian trễ lâu quá, cả phút. Mặc dù em đã thay đổi d1, d2, d3 về 0x02 rồi mà vẫn thấy lâu.
Ngoài ra, chân RB4 của em không sáng được. Khi em cho chế độ test led (Sáng hết hoặc tắt hết) thì đo ngay tại chân RB4 thấy như nhau và luôn 0,42V. Liệu có thể hỏng tại đúng một chân không anh?
Muốn gửi đoạn chương trình test LED nhưng phần gửi gặp lỗi gì đó nên em không gửi được.

namqn 06-07-2006 08:12 PM

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,

chuchinh 12-07-2006 11:48 AM

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.

namqn 12-07-2006 06:55 PM

+ 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,

falleaf 12-07-2006 06:57 PM

[code]... đoạn code...[/c*de]
Thay * bằng chữ o là được

chuchinh 17-07-2006 10:01 AM

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.

namqn 17-07-2006 06:48 PM

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,

chuchinh 19-07-2006 04:11 PM

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?

namqn 19-07-2006 07:40 PM

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,

briantk_1988 26-07-2006 08:53 PM

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

namqn 26-07-2006 09:29 PM

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,

briantk_1988 27-07-2006 04:17 PM

Cám ơn rất nhiều

Mình đã gỡ rối được rồi

Thân

chuchinh 01-08-2006 04:56 PM

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.

namqn 01-08-2006 06:23 PM

Trích:

Nguyên văn bởi chuchinh
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.

Bạn nên post phần code của bạn lên, cùng với cách kết nối phần cứng nữa thì mới có thể biết tại sao mạch chạy như vậy.

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,

newuser 01-08-2006 07:20 PM

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.

chuchinh 24-08-2006 09:01 AM

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é!

newuser 24-08-2006 06:33 PM

Trích:

Đây liệu có phải là hiện tượng tràn trang không anh nhỉ?
chương trình của bạn chưa đủ làm tràn trang chương trình đâu, bạn có thể kiểm tra trên file .lst
Trích:

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ì.
bạn kiểm tra bit cờ bận của LCD xem sao, sẽ chủ động hơn nhiều vì mỗi LCD có thời gian thực thi lệnh khác nhau, bạn cũng nên có một khoảng thời gian delay chờ LCD khởi động
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:

Retlw 0x00 ở sau nhãn NEXTMESSAGE30 sẽ trả về đâu
chỗ nào có lệnh CALL NEXTMESSAGE30 thì trả về chỗ đó chứ nhỉ?

namqn 24-08-2006 07:13 PM

Chương trình của em chỉ có nhãn NEXTMESSAGE3, thuộc chương trình con HIEN_THI_BAN_DAU, chương trình con này được gọi từ chương trình chính, ngay trước vòng lặp chính. Do đó, lệnh RETLW đó sẽ trở về ngay trước vòng lặp chính.

Các điểm kia newuser đã nói rồi, em cần kiểm tra lại thuật toán của chương trình khi xử lý phím nhấn và hiển thị.

Thân,

kysikodau 01-04-2007 01:58 PM

các bác ui, em tìm khắp các luồng mà ko thấy chỗ nào nói chi tiết về cái timer cả? nhất là cái ví dụ làm led nhấp nháy ấy, ko biết làm bằng timer ntn, mong mọi người giúp đỡ, em ko biết nhiều lắm nên các bác cứ nói chi tiết vào

kysikodau 01-04-2007 02:06 PM

tiện thể , cho em xin link thư viện orcad luon

nguyenluong 09-03-2009 05:52 PM

Trích:

Nguyên văn bởi tinhthanthep (Post 720)
Hôm nay mới thứ 6 mà. Đã cuối tuần đâu.
Cho tớ hỏi? mạch của tớ mắc nút bấm với điện trở kéo xuống: tức là nguồn 5V mắc với nút bấm rồi đến chân của PIC, rồi cái chân đó lại nối với điện trở 10k rồi xuống đất. Tớ thấy nếu mắc kiểu này thì giữa chân PIC và nguồn 5V không có điện trở để giới hạn dòng. Liệu có hỏng PIC khi bấm nút không? Có phải nếu để chân PIC là ngõ INPUT thì nó ko cho dòng vào mà chỉ đọc giá trị điện áp ở chân có đúng không?
Thế là mất toi hai ngày cuối tuần để thử mấy cái nút bấm rùi. Bác falleaf ác như con thú! :cool:

Bạn mắ như vậy cũng được, tức là khi chưa bấm thì input ở mức thấp (0V), khi bấm thì nối lên mức cao (5V), ko sao cả . Vì trong cấu trúc PIC đã có điện trở nối xuống Mass rùi.
Nhưng tôi thường dùng là ngược lại như bạn. Tức là khi bấm là input ở mức 0
Có gì thì post lên nhé, các bạn sẽ giúp cho, chào bạn

nguyenluong 09-03-2009 05:55 PM

Các bạn nào nghiên cứu về CCP trong PIC chưa vậy?

kimnga311 28-11-2009 11:41 PM

sao kì vầy nè, cách mắc đầu tiên trong hai cách mắc thì bảo không được, sau rồi cũng chính cái hình đó (của bạn tinhthanthep) lại bảo được là thế nào vậy a?

phamhiepst 23-07-2010 09:12 AM

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL3,CPUDIV1,V REGEN
dòng này dùng làm gì vậy các đại ca?

nhan1968 14-08-2010 08:54 PM

Xin chào tất cả các anh chị em trong diển đàn, năm nay tôi đã ngoài 40 tuổi, ngày xưa đi học thì vi điều khiển chưa có phát triển. Nay đi làm đụng chạm rất nhiều nhưng kiến thức có hạng biết làm sao. Nhưng tính tò mò tìm hiểu thì không thiếu, thấy các bạn trẻ ngày nay giỏi quá thật đáng khâm phục.
Nay các bạn cho mình hỏi nhé: muốn học tốt vi điều khiển nên bắt đầu từ đâu, tài liệu nào hướng dẫn, cách học như thế nào để đạt kết quả tốt;
các bạn có thể chỉ giáo giúp cho mình;
Địa chỉ liên lạc: anhduc1996@gmail.com
Chúc các bạn sức khoảe - xin chân thành cám ơn

ronin 30-08-2010 01:15 AM

http://www.picvietnam.com/forum/showthread.php?t=263
bac vào đây. ở đây hướng dẫ khá cụ thể các bước để bắt đầu tìm hiều ra sao.
Success-RNET.

DCP 02-09-2010 03:06 PM

chào các bác,em mới học pic và đang làm quen với con 16f84a.em đang muốn viết một chương trình cho nó giao tiếp với con ep rom họ 24c nhưng không biết phải viết thế nào,mong các sư huynh chỉ giáo giúp,em xin cám ơn rất nhiều.

bankjmun 25-01-2011 03:15 PM

em đang làm đồ án về ứng dụng GSM trong điều khiển từ xa.và muốn liên kết modul GSM SIM300cz,PIC6F877A,máy tính theo dõi,cùng một số thiết bị dân dụng như điều hòa, bình nóng lạnh...nhưng chưa biết sơ đồ ghép nối(sơ đò khối) sẽ như thế nào.có bác nào đã từng đi qua vấn đề này thì chỉ giáo giúp em cái nhé.em là thành viên mới toánh của gia đình ta mà....

thanhkc 16-11-2011 09:16 PM

cac anh oi choi em hoi chut sao em k chuyen sang dc duoi .hex nhi. an f9 k bao loi

thanhkc 16-11-2011 09:18 PM

ai giup em voi

serum 27-04-2012 10:14 AM

Luồng này bị bỏ quên rùi

thaihoc2401 14-03-2017 01:02 AM

cho mình hỏi về cách lập trình cho nút nhấn với pwm với, hay ai có tài liệu chi tiết thì cho mình xin cũng được. Xin cảm ơn.


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