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)
-   -   "PIC16F877A!NÀO TA CÙNG CHAT!" (http://www.picvietnam.com/forum/showthread.php?t=239)

ntc 28-05-2006 11:23 AM

Trích:

mình có thể thay thanh ghi DATAOUT trong chương trình bạn viết bằng thanh ghi FSR, sau đó mình muốn truy cập đến thanh ghi nào, mình chỉ cần cấp địa chỉ lên FSR rồi chạy lại INDF lấy dữ liệu xuất ra PORTD được chứ ?
Mình viết vậy cho dễ hiểu. Bạn thử lại xem như thế nào.

Trích:

nhân đây, mình muốn hỏi bạn về PSP. Chân CS\ của P16F877A có thể dùng như chân ALE trong 8051 không ? đặt trường hợp bus dữ liệu và bus địa chỉ dùng chung như Port0 của 8051 ấy , ví dụ như mình muốn lấy data trong DS12887 ở một địa chỉ nào đó, mình phải thiết lập cho PORTD là output, rồi đưa địa chỉ ra đó, tiếp theo là kéo chân CS\ từ HIGH-->LOW để chốt địa chỉ, sau đó lại chuyển PORTD thành input rồi đọc dữ liệu? Hồi trước mình làm với 8051 nên không để ý chuyện này vì 8051 có lệnh hỗ trợ giao tiếp với bộ nhớ ngoài.PIC cũng có định địa chỉ gián tiếp, không biết nó có giúp mình trong trường hợp này không nhỉ???
Hìhì, PIC còn biết chút chút, còn 8051, phải nói là ... mù 8051. Mình không tìm hiểu thực sự nghiêm túc 8051. Với lại, gần 2 năm chưa đụng tới nó rồi. :D

Còn về DS12887, nó có 2 chế độ giao tiếp BUS, đó là giao tiếp BUS theo Motorola hoặc Intel. Nếu theo cách giao tiếp BUS của Intel, nó chỉ xem chân CS là chân để chọn chip (Chip Select), ngoài ra không có chức năng nào khác. Nếu chọn cách giao tiếp của Motorola, chân CS (của DS12887) tương ứng với chân ALE thì phải. Mình không để ý kĩ lắm, vì cứ dựa vào giản đồ xung mà viết chương trình thôi. Chọn đại một cái (Motorola hay Intel), rồi dựa vào cái giản đồ xung tương ứng mà "chế" code thôi.

Cái này gọi là "vô chiêu thắng hữu chiêu" phải không nhẩy.

Bản thân chức năng cái chân CS của PSP trong PIC chỉ dùng để chọn chip thôi.

Bạn cứ thử những ý tưởng của mình, rồi thông báo kết quả cho mọi người biết nhá. Cũng có thể ứng dụng PSP để giao tiếp với DS12887. Bạn thử xem sao.

:D

newuser 16-06-2006 05:42 PM

Đây là đoạn chương trình kiểm tra cờ bận BF cho chương trình giao tiếp LCD mà mình đã post,nếu bạn nào nạp thử chương trình trước chạy không được thì chỉ cần thế đoạn mã kiểm tra cờ BF này là xong.

; KIEM TRA CO BF
TEST_BF
BANK1
MOVLW H'FF'
MOVWF TRISD ;PORTD NHAP/XUAT DATA
BANK0 ; HIEN TAI LA PORT INPUT
BSF EN
BCF RS ; DOC TRANG THAI BANG CACH CHO RS=0
BSF RW ; BIT0 DEN 6 LA DIA CHI HIEN TAI CUA CON TRO-> KO QUAN TAM
NOP ; BIT 7 = BF
BSF EN
NOP
NOP
BUSY_BF
BSF EN
RLF PORTD,W ; C = BF = PORTB<7>
BTFSC STATUS,C
GOTO BUSY_BF ; NEU BF = 1 THI TIEP TUC KIEM TRA
BANK1
CLRF TRISD ; PORTD = OUTPUT
BANK0
RETURN

newuser 28-06-2006 12:19 PM

có bạn nào giải thích dùm mình về cách định trang chương trình trong P16F877A không? ví dụ như chương trình con SUB_A của mình đang nằm ở trang0, trong khi chương trình phục vụ ngắt nằm ở trang 1, vậy nếu trong chương trình ngắt có gọi chương trình SUB_A này thì phải làm sao ?
mình đang viết một chương trình, khi dung lượng còn nhỏ hơn 2K thì không sao, nhưng khi chương trình vượt qua ngưỡng 2K thì một số chương trình con không thực thi được, mình đọc datasheet rồi nhưng vẫn chưa thông lắm.

newuser 28-06-2006 12:31 PM

ORG 0X7F ;nằm ở trang 0
SUB_A
...
...
...
RETURN
...
ORG 0X800 ;trang 1
INT_ISR
PAGE0
CALL SUB_A
....
RETFIE
trước lệnh gọi mình đã chọn trang 0 như vậy có đúng không ?

namqn 28-06-2006 06:04 PM

Trích:

Nguyên văn bởi newuser
ORG 0X7F ;nằm ở trang 0
SUB_A
...
...
...
RETURN
...
ORG 0X800 ;trang 1
INT_ISR
PAGE0
CALL SUB_A
....
RETFIE
trước lệnh gọi mình đã chọn trang 0 như vậy có đúng không ?

Em nên viết
Code:

...
pagesel SUB_A
call SUB_A
...

Thân,

anhdungcan 02-07-2006 12:11 PM

cac bac noi ro nguyen nhan hong con PIC de em con chanh. Hong mot con la di mot lit chu it dau, nhi ?

newuser 02-07-2006 01:33 PM

Trích:

Nguyên văn bởi namqn
Em nên viết
Code:

...
pagesel SUB_A
call SUB_A
...

Thân,

Ôi, thật đơn giản và rõ ràng !. Câu trả lời của anh giúp em lộ ra hai vấn đề, thứ nhất là em học máy móc và đơn giản quá, không tự đặt nổi một câu hỏi "đã có banksel thì sao lại không có pagesel, MPLAB có hỗ trợ biên dịch không nhỉ ?" và vấn đề thứ hai là không chịu đọc kỹ tài liệu.
trước khi đọc bài trả lời của anh em đã viết chương trình lại rồi, nó đã chạy tốt. Em đã làm theo cách củ chuối là vào file.LST để xem đoạn chương trình đó thuộc trang nào rồi cứ mỗi khi gọi chương trình đó, em lại chọn trang một lần theo kiểu em đã viết ở trên, tuy chương trình chạy được nhưng ... củ chuối quá đi thôi !
các bạn mới học rút kinh nghiệm từ mình nhé !

chuthong1 11-07-2006 05:30 PM

hay wa'!!
Đề nghị anh NTC tiếp tục post bài tiếp lên đi !!
Hi!!

leduy173 30-08-2006 02:33 AM

ủa như newuser làm thí chỉ có cách củ chuối đó thui sao buộc lòng fai vô file .lis để kiếm coi nó nằm ở trang mấy ha?thấy bất tiện quá có cách nào khác ko?
Làm thế nào đề bít khi thực hiện lênh gọi chương trình con mà nó bị vươt quá 2k, khi dịch MP nó có báo lỗi cho mình bít là ko nhảy tới đó được ko!em chưa viết chương trinh nao wa dài nen ko bit.MOng được học hỏi thêm

Jerry 03-10-2006 09:57 AM

Theo mình biết thì còn có 1 cách để kiểm tra 1 chương trình có vượt quá 1 page hay không, bạn vào trang www.microchip.com, search dòng chữ "Crossing Page Boundary Detection", trong đó nói rất rõ.
MPLAB không báo lỗi cho bạn biết là không nhảy được tới chương trình con khác Page đâu. Bình thường mỗi khi viết chương trình, mình luôn để chương trình chính và chương trình xử lý ngắt ở Page0, các loại chương trình con khác thì để ở Page 1 hoặc 2 hoặc 3. Để nhảy tới chương trình con khác Page mình hay dùng lệnh LCALL hoặc LGOTO. Dùng PAGESEL cũng được, nhưng như vậy lại phải viết thêm 1 lệnh nên mình thường không dùng
(PAGESEL Subroutine
Call Subroutine)
Tuy nhiên khi dùng Lcall và Lgoto phải chú ý đến bit 4 và bit 3 trong thanh ghi PCLATH. Nếu đang ở Page0, bạn muốn gọi Subroutine ở Page1 thì trong Subroutine đó bạn phải dùng lệnh CLRF PCLATH để sau khi gọi Subroutine, chương trình có thể xử lý được lệnh tiếp theo ở Page0.
Cụ thể :
; Page 0
....
lcall Subroutine
......
; Page 1
Subroutine:
; thực hiện các công việc cần thiết ở đây
clrf PCLATH
return

newuser 03-10-2006 10:30 AM

Trích:

Nguyên văn bởi Jerry (Post 5217)
Theo mình biết thì còn có 1 cách để kiểm tra 1 chương trình có vượt quá 1 page hay không, bạn vào trang www.microchip.com, search dòng chữ "Crossing Page Boundary Detection", trong đó nói rất rõ.
MPLAB không báo lỗi cho bạn biết là không nhảy được tới chương trình con khác Page đâu. Bình thường mỗi khi viết chương trình, mình luôn để chương trình chính và chương trình xử lý ngắt ở Page0, các loại chương trình con khác thì để ở Page 1 hoặc 2 hoặc 3. Để nhảy tới chương trình con khác Page mình hay dùng lệnh LCALL hoặc LGOTO. Dùng PAGESEL cũng được, nhưng như vậy lại phải viết thêm 1 lệnh nên mình thường không dùng
(PAGESEL Subroutine
Call Subroutine)
Tuy nhiên khi dùng Lcall và Lgoto phải chú ý đến bit 4 và bit 3 trong thanh ghi PCLATH. Nếu đang ở Page0, bạn muốn gọi Subroutine ở Page1 thì trong Subroutine đó bạn phải dùng lệnh CLRF PCLATH để sau khi gọi Subroutine, chương trình có thể xử lý được lệnh tiếp theo ở Page0.
Cụ thể :
; Page 0
....
lcall Subroutine
......
; Page 1
Subroutine:
; thực hiện các công việc cần thiết ở đây
clrf PCLATH
return

ừ, mình mới post bài xong thì gặp bài của bạn ở đây. Thú vị đó!

huunam 03-10-2006 11:19 AM

Bác nào có sơ đồ mạch in PG2C nạp cho PIC6F877A cho em xin với .
Em xin cảm ơn trước .

nhh 03-10-2006 07:03 PM

Trích:

Nguyên văn bởi huunam (Post 5223)
Bác nào có sơ đồ mạch in PG2C nạp cho PIC6F877A cho em xin với .
Em xin cảm ơn trước .

Ở đây: http://www.picvietnam.com/forum//showthread.php?t=19

qanhep 02-02-2007 05:20 PM

Hôm vừa rồi đã đọc ở đâu đó, hình như trong datasheet việc xác định xem địa chỉ nhảy có nằm cùng page với lệnh goto hay lệnh call hay không rồi. Đó là sử dụng lệnh của trình biên dịch để xác định địa chỉ cần gọi. Sau đó, gán địa chỉ này cho thanh ghi địa chỉ byte cao. Cụ thể lệnh thì không nhớ, vì mình không sử dụng asm mà dùng C luôn cho tiện.
Có một điều là các bạn phải chịu khó đọc datasheet, hiểu thế nào thì làm mô phỏng trên máy, quan sát kết quả. Nếu thấy kết quả đúng thì nạp vào IC để kiểm tra thực tế, nếu không đúng thì đọc lại datasheet, làm lại và mô phỏng, như thế kiến thức sẽ vững hơn.

namqn 02-02-2007 06:21 PM

Trích:

Nguyên văn bởi hungpq (Post 7189)
Các bác ơi giúp tôi với. Tôi muốn ghi dữ liệu vào bộ nhớ Flash của con 16f877a mà không sao ghi được. Tôi đã làm theo hướng dẫn trong datasheet nhưng vẫn không được. Mong các cao thủ giúp đỡ.

Bạn nói cụ thể hơn, làm theo hướng dẫn là bạn đã làm những gì?

Nếu dùng ngôn ngữ cấp cao thay vì hợp ngữ thì đoạn chương trình ghi vào Flash vẫn phải dùng hợp ngữ để đảm bảo đúng thứ tự thực hiện các lệnh và số lệnh được thực hiện (cho đoạn code được đánh dấu là Required Sequence trong ví dụ), đồng thời nên cấm ngắt trước đoạn code đó, và cho phép ngắt trở lại sau đoạn code đó.

Thân,


Múi giờ GMT. Hiện tại là 09:12 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam