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 04-12-2005 01:36 PM

"PIC16F877A!NÀO TA CÙNG CHAT!"
 
Chào cả làng!

Đây là luồng để cho các bạn thảo luận, thắc mắc và … nói nhảm về các bài post lên trong luồng “PIC16F877A từ dễ tớI khó”. Rất mong các bạn tham gia đóng góp ý kiến.

mafd_47a 04-12-2005 03:14 PM

Trích:

Nguyên văn bởi ntc
Chào cả làng!

Đây là luồng để cho các bạn thảo luận, thắc mắc và … nói nhảm về các bài post lên trong luồng “PIC16F877A từ dễ tớI khó”. Rất mong các bạn tham gia đóng góp ý kiến.


Em sẽ theo chân bác. Hôm nọ vừa làm hỏng mất một con F877A. xot quá.

Bác cứ POST lên đê, tôi cũng đang dung con này



Để cho tiện theo dõi mọi người khi bình luận bài nào bên luồng “PIC16F877A từ dễ tớI khó”, các bạn cho biết bài đấy là bài số mấy trong Topic đó. Ít bài thì ko sao nhưng khi mà có nhiều bài hơn rồi thì việc làm thế này sẽ dễ quản lý hơn

Lưu ý: để biết số bài các bạn chú ý đến #number góc phải của bài mình cần quan tâm. VD như bài của tôi là có số #2 trong mục này

ntc 04-12-2005 10:52 PM

Hehe! Mới có một con mà đã la ầm lên rồi. Phải chấp nhận hy sinh mà tiến lên thôi bác màd 47a thân mến.

Tui post bài số 1 lên rồi. Mời bà con nhào dzô.

ntc 26-12-2005 08:58 PM

Bạn tinhthanhthep nhớ qua đây rồi thảo luận nghe.

Lâu lắm mới có được một người cho biết ý kiến.

Bài thứ hai bà con chịu khó thư thả cho tui một chút. Tui đang ... thi học kì. :D

minhtienbk 02-01-2006 11:07 AM

em la` tha`nh vien moi , em muon hoi 1 chut ,em co' 1 doa.n code cho con 15f84 ,nhung trong tay la.i co' 16f877 ,con quy nay nhieu chan wa' ,ko biet la`m sao de nap cho no' ,can sua cod lai nhu the na`o ... mong ca'c anh chi cu the giu'p :->

falleaf 02-01-2006 12:53 PM

Trích:

Nguyên văn bởi minhtienbk
em la` tha`nh vien moi , em muon hoi 1 chut ,em co' 1 doa.n code cho con 15f84 ,nhung trong tay la.i co' 16f877 ,con quy nay nhieu chan wa' ,ko biet la`m sao de nap cho no' ,can sua cod lai nhu the na`o ... mong ca'c anh chi cu the giu'p :->

Code em tạm thời giữ nguyên, thay đổi như sau:

thay đổi con chip processor

nếu nó có tương tác với portA, thì trong 16F877, em cần phải set portA thành chế độ I/O.

Còn lại em nối mạch tương ứng vào các chân PORTA và PORTB của 877 giống như 84. Vì 84 chỉ có 2 port này.

Về các biến đặt trogn chương trình, nếu nó chỉ ghi vào ở 0x020 trở xuống thì không thành vấn đề gì, bởi vì bộ nhớ của 877 lớn hơn 84, cho nên chắc chắn các vị trí bộ nhớ trong chương trinh 84 có giá trị đối với 877.

Em dịch và nạp lại thử. Nếu không được, thì gửi chương trình lên đây cho mọi người giúp.

Chúc vui.

minhtienbk 05-01-2006 09:22 AM

cảm ơn anh falleaf rất nhiu`

minhtienbk 06-01-2006 02:43 PM

anh cho hoi chu't nua :
phan khai bao ban dau trong code : co' nguoi viet nhu sau
=====
list 16f877a
#include <p16f877a.inc>
=====
co' nguoi viet la`
====
list p=pic16f84a
include p16f84a.inc
=======
co' nguoi viet la`
===
PROCESSOR 16F877A
#INCLUDE <P16F877A.inc>


noi' chung co`n nhieu cach viet khac nua ,anh chi em xem tai sao lai co chuyen nhu vay ,dau la` cach viet dung nhat .merci beaucoup

falleaf 06-01-2006 02:47 PM

Không vấn đề gì cả, chỉ là cách viết directive, các các viết này có quy định trong cách viết directive.

Chúng ta nên thống nhất cách viết này với nhau, để có thể viết chương trình được chuẩn hoá tốt. Theo như các chương trình mẫu anh viết, em nên bắt chước làm theo, còn những chương trình khác, họ chưa có ý định làm thành chuẩn, vì vậy vẫn còn viết theo thói quen, hoặc theo một tài liệu hướng dẫn nào đó mà họ học đầu tiên. Chính vì vậy, anh mới đưa ra chuẩn để khi tụi em học, học ngay từ đầu cái chuẩn đó. picvietnam chủ trương đi đầu về việc chuẩn hoá mà.

minhtienbk 06-01-2006 02:50 PM

sao trong 1 so doan code nguoi ta ko khai bao TRISA ,PORTA..., ha anh , no' dc mac dinh a`

falleaf 06-01-2006 05:05 PM

hehheehe.. thôi, mấy cái này anh để Chính trả lời cho em... Chính là mod phần này, tại anh hay lên mạng quá, lại thói quen cứ thuận miệng trả lời, hy vọng chính sẽ trả lời bằng cái tut sau hấp dẫn hơn :).

Chúc vui.

ntc 17-01-2006 05:53 PM

Mấy cái bạn minhtienbk hỏi liên quan đến cái header file. Đây là cái file đính kèm mà bạn "include" vào chương trình thông qua lệnh "INCLUDE <.... .inc>". Nội dung của file này đại khái là dùng để định nghĩa và khai báo một số thông số liên quan đến vi điều khiển PIC, ví dụ như định nghĩa địa chỉ các thanh ghi chức năng. Và do mỗi vi điều khiển PIC được tổ chức sắp xếp theo một qui tắc riêng (ví dụ như địa chỉ các thanh ghi chức năng được sắp xếp khác nhau) nên mỗi vi điều khiển cần một cách định nghĩa hay một file header riêng (bạn dùng PIC16F84 thì phải "INCLUDE <p16f84.inc>, dùng PIC16F877 thì phải "INCLUDE <p16f877.inc>", ...)

Việc dung header file có nhiều tác dụng

Thứ nhất, khỏi phải tốn thì giờ đi định nghĩa lại mấy thanh ghi.

Thứ hai, người viết chương trình sẽ cảm thấy thân thiện hơn trong việc lập trình cho vi điều khiển PIC. VÍ dụ, nếu không sử dụng header file, muốn đưa một giá trị nào đó vào thanh ghi TRISA, bạn phải tra coi cái địa chỉ của thanh ghi TRISA là bao nhiêu, rồi sau đó mới thao tác trên thanh ghi TRISA dựa vào địa chỉ đó. Như vậy đoạn mã lệnh sẽ rất tối nghĩa. Khi đã đính kèm header file, bạn chỉ việc sử dụng cái "tên" TRISA một cách tự nhiên mà không cần quan tâm tới việc địa chỉ của nó là bao nhiêu. Bên cạnh đó đoạn mã lệnh sẽ trở nên thân thiện và dễ hiểu hơn.

Như vậy thực chất PORTA, TRISA, ... chỉ là những cái tên dùng để thay thế cho địa chỉ của các thanh ghi chức năng đó.

Tóm lại

Thứ nhất, không phải là không cần định nghĩa, mà các định nghĩa này đã được thực hiện trong cái header file.

Thứ hai, khi đã đính kèm header file, bạn cứ viết chương trình và sử dụng nó một cách thoải mái, cứ như là đã được "mặc định" như bạn nói.

nhh 12-02-2006 01:41 PM

1 Attachment(s)
Đề nghị mod NTC post tiếp bài cho anh em tham khảo!Lâu quá!

newuser 19-04-2006 11:39 PM

mình có thắc mắc với bộ nhớ chương trình của P16F877A, mong được bạn Chính giúp đỡ, theo mình hiểu thì bộ nhớ chương trình của P16F877A là bộ nhớ Flash, nghĩa là nó cho phép ta truy cập trực tiếp (đọc/ghi/xóa) nhiều lần bằng phần mềm? Nếu chương trình viết nạp vào mà còn thừa dung lượng thì ta có thể dùng phần thừa ấy như những vùng nhớ khác (lưu dữ liệu chẳng hạn)?có gì khác trong cách truy cập nó với EEPROM?
một thắc mắc nhỏ nữa là về cách định trang của bộ nhớ chương trình, khác với con F84 mình đã từng vọc, con này có 4 pages , vậy cách sự dụng nó như thế nào? các lệnh như GOTO hay CALL chỉ có thể trỏ đến không quá 2K bộ nhớ chương trình, bằng cách nào ta có thể truy cập đến những vùng nhớ còn lại ????
rất mong được bạn Chính phúc đáp!
tb: bạn Chính có nhớ mình không nhỉ? Mình có gặp bạn buổi tối hôm mua mạch nạp ở nhà anh Đăng ấy!

ntc 20-04-2006 05:20 PM

Hì. Nhớ.

Bộ nhớ chương trình của PIC6F877A có dung lượng 8K và được chia làm 4 page.

Để mã hóa hết bộ nhớ chương trình, thì bộ đếm chương trình PC (Program Counter) cần có dung lượng 13 bit (8 K = 2exp13).

Các lệnh GOTO và CALL chỉ có thể gọi và nhảy trong vòng 2 K (trong trường hợp này nó là một page bộ nhớ chương trình, vì có 4 page, mỗi page 2 K => 8 K) bởi vì trong cách mã hóa lệnh của PIC dòng 16F cho các lệnh GOTO và CALL, thì 3 bit đầu dùng cho opcode (opcode dùng để mã hóa lệnh), 11 bit còn lại dùng cho tham số của các lệnh này. Việc cấu trúc như vậy giúp đảm bảo rằng mỗi lệnh của PIC sẽ được mã hóa bằng một số lượng bit nhất định, trong trường hợp của PIC dòng 16F là 14 bit.

Do tham số của các lệnh GOTO và CALL chỉ là 11 bit, cho nên vùng nhớ chương trình mà các lệnh GOTO và CALL có thể chuyển đến chỉ giới hạn trong vòng 2exp11 = 2 K.

Coi như giải quyết xong vấn đề về lệnh CALL và GOTO. Mình giải quyết tiếp vấn đề truy xuất bộ nhớ chương trình.

Địa chỉ truy xuất bộ nhớ chương trình nằm trong thanh ghi PC 13 bit và bao gồm 2 thanh ghi, PCL và PCH.

PCL là thanh ghi 8 bit. Nó nằm trong bộ nhớ dữ liệu luôn. Như vậy nó cho phép các thao tác như thanh ghi bình thường (đọc, ghi, xóa, ...). Một ứng dụng cho việc truy xuất này là kĩ thuật bảng. Bạn đọc lại cái TUT về kĩ thuật bảng của anh Hiệp hay của mình để nắm rõ hơn.

PCH chứa các bit cao của PC. Nhưng PC chỉ sử dụng 5 bit thấp (cộng lại là 13 bit). Thanh ghi này không cho phép các thao tác thông thường, vì nó không nằm trong bộ nhớ dữ liệu. Việc truy xuất nó phải thông qua thanh ghi PCLATH. Thanh ghi PCLATH nằm trong bộ nhớ dữ liệu.

Lệnh GOTO hay CALL sẽ lấy 3 bit thấp của thanh ghi PCH, và 8 bit của thanh ghi PCL làm tham số điều khiển (tổng cộng 11 bit).

Vấn đề còn lại nằm ở 2 bit 4 và 5 của thanh ghi PLH. Khi được reset, mặc định các bit này mang giá trị 0. Như vậy nếu chỉ dùng các lệnh GOTO hay CALL, ta chỉ có thể nhảy đi nhảy lại trong page 0 của bộ nhớ chương trình. Muốn chuyển đến các page khác, ta phải điều chỉnh giá trị trong các bit này.

Ví dụ:
Chuyển đến Page 1: PCLATH<5:4> = 01.
Chuyển đến Page 2: PCLATH<5:4> = 10.
Chuyển đến Page 3: PCLATH<5:4> = 11.

Thực chất của việc điều khiển này là để diều chỉnh lại giá trị trong bộ đếm chương trình thôi. Muốn truy xuất đến vũng nhớ có địa chỉ cao thì phải điều khiển giá trị địa chỉ của nó. Do giới hạn điều chỉnh của các lệnh GOTO và CALL mà ta cần thêm các thao tác bổ trợ này.

Vấn đề về bộ nhớ Flash. Nó cho phép ta truy cậo trực tiếp bằng phần mềm. Bạn tham khảo thêm datasheet của PIC để biết các thao tác truy xuất như thế nào. Việc truy xuất bộ nhớ chương trình đòi hỏi các yêu cầu khắc khe, các lệnh điều khiển cũng phải gộp chung lại thành một khối lệnh. Trong datasheet có hướng dẫn đó.

Một trong những ứng dụng rất hưu ích của việc ghi lên bộ nhớ chương trình là Tiny Bootloader. Firmware Tiny Bootloader thực hiện công việc này để bố trí lại bộ nhớ chương trình, cũng như ghi chương trình mới lên bộ nhớ chương trình mà không cần thông qua mạch nạp.

Tất nhiên ta cũng có thể sử dụng bộ nhớ chương trình với vai trò như EEPROM. Vấn đề là cách đọc và ghi lên nó. Còn EEPROM ngoài được truy xuất dựa trên các phương thức giao tiếp với nó.

:D

newuser 21-04-2006 12:07 AM

mình sẽ đọc kĩ phần trả lời này của bạn rồi sẽ trao đổi thêm với bạn nhé. Cảm ơn bạn Chính nhiều !

newuser 25-04-2006 11:23 PM

ừ... mình đã xem kĩ phần trả lời của bạn rồi. Và mình cũng đã đọc datasheet, đúng là như thế, bộ nhớ Flash cho phép ta đọc 1 lân 1 word và ghi một lần 4 words thông qua các thanh ghi buffer. Mình sẽ tìm hiểu về bootloader...
đọc trong datasheet, mình thấy người ta có nói đến code protect, theo đó, nếu ta đã config word là code protect on thì nó sẽ ngăn cấm việc truy cập từ bên ngoài vào bộ nhớ chương trình và bộ nhớ EEPROM, tuy nhiên bộ nhớ vẫn truy cập bình thường bởi chính VĐK, vùng ID location (ở địa chỉ 2000h đến 2003h) có liên quan gì đến việc này không bạn ? Khi xoá bộ nhớ thì những vùng nhớ như ID location hay configuration Word có bị xoá theo không ?

ntc 26-04-2006 10:10 AM

Hìhì.

Sao bạn không thử tự kiểm tra nhẩy.

Có mạch nạp trong tay rồi thì việc kiểm tra đâu có khó.

Thú thật mình không có nhiều kinh nghiệm trong vấn đề khóa code.

:D

Để thử xem như thế nào đã.

thuctap 27-04-2006 11:17 AM

pic6f877
 
Chao cac anh chi
em la thanh vien moi toanh,con chu be doi,moi bat dau bap be hoc,mong cac anh chi huong dan cach hpoc pic,va trinh tu hoc cho no hieu qua.
Chan thanh da ta!!!

falleaf 27-04-2006 12:08 PM

http://picvietnam.com/forum/showthread.php?t=263

Em xem luồng này.

Các mod chú ý xoá bài này của thuctap và của F trong 1 tuần nữa, để tránh làm phân tán nội dung của luồng.

Chúc vui

newuser 22-05-2006 09:26 PM

hai tuần nay mình khong login được, cảm ơn bạn Chính đã hướng dẫn nhé!
Nếu bạn nào khi đăng nhập rồi mà lúc post bài lại bị log out thì bạn nhớ hãy đánh dấu vào ô [ghi nhớ] trước khi đăng nhập xem sao!

newuser 25-05-2006 05:52 PM

đây là mấy chương trình, mình đọc tài liệu của bạn Chính xong, làm thử thấy chạy oK, mình gửi lên coi như báo cáo quá trình học tập với bạn Chính nhé !
Mình sẽ cố gắng mỗi khi bạn có tài liệu mới, mình viết thử một chương trình để "báo cáo" với bạn. Cảm ơn bạn nhiều !
À, không quên chúc bạn sinh nhật vui vẻ !

newuser 25-05-2006 05:54 PM

3 Attachment(s)
đây là bài đầu tiên : truy xuất PORT

romanza 25-05-2006 06:57 PM

Các bác cho em hỏi, mạch nạp Faleaf Pic2 mà các bác quảng cáo ở mục bên có nạp được con 16F877 không ?

juro 26-05-2006 12:28 AM

chao moi nguoi .Toi moi bat dau nghien cuu ve pic, toi duoc biet pic co trinh dich ccs nhung ko biet co the kiem o dau.Ai biet co the chi giup duoc ko?
xin cam on!

falleaf 26-05-2006 01:18 PM

http://www.picvietnam.com/forum/forumdisplay.php?f=10

Bạn phải chịu khó đọc các luồng hướng dẫn cơ bản ở phía bên trên, đọc các chú ý, thông báo, đó là những điều rất hữu ích cho những người mới vào.

Chúc vui.

dameco 27-05-2006 09:19 AM

chào cả nhà !
sao các bạn kô dung micropasscal để viết chương trình cho PIC. Tôi thấy cái đó dễ học lắm. Nhưng chỉ tiết là bản DEMO thôi.
ai mà crack dc nó thì tuyệt vời !

ntc 27-05-2006 10:23 AM

Trích:

đây là mấy chương trình, mình đọc tài liệu của bạn Chính xong, làm thử thấy chạy oK, mình gửi lên coi như báo cáo quá trình học tập với bạn Chính nhé !
Mình sẽ cố gắng mỗi khi bạn có tài liệu mới, mình viết thử một chương trình để "báo cáo" với bạn. Cảm ơn bạn nhiều !
Bạn newuser làm vậy thì rất tốt. Nhưng mà bạn khách sáo quá, đôi lúc làm mình cảm thấy ngại. Mình cùng nhau học PIC mà, giúp được chừng nào thì giúp thôi.

Về các bài viết của bạn, nếu được bạn có thể post sơ đồ nguyên lí của chương trình lên luôn, như vậy mới dễ theo dõi, các đoạn code viết lên diễn đàn luôn cũng được. Bạn xem mấy luồng của nhh viết, viết như vậy sẽ dễ theo dõi hơn. Bên cạnh đó bạn chịu khó chú thích các vấn đề trong chương trình một tí (dựa trên cơ sở nào để viết chương trình như vậy, giải thuật như thế nào, ...).

Một vài điểm góp ý như vậy.

:D

newuser 27-05-2006 01:34 PM

các chương trình trên mình viết rồi cho chạy thử trên mạch thí nghiệm nên nếu muốn post kèm sơ đồ mạch thì mình phải vẽ lại. Ừ, lần sau mình sẽ làm như thế.
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ỉ???

newuser 27-05-2006 05:53 PM

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ứ ?
tối nay mình sẽ viết chương trình thử cho DS12887 để xem suy nghĩ của mình có đúng không? nếu DS12887 cũng thực hiện chức năng được như một con Slave thì tốt quá !

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


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