View Full Version : "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
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
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ô.
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
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.
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.
Đề 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!
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 ?
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
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
đâ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 ?
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 !
đâ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á !
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.
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
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
...
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
Em nên viết
...
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
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 .
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
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,
anhthang
09-02-2007, 08:09 AM
Gởi anh Nguyễn Trung Chính, Em chỉ mới biết về Pic được 15 ngày!
Em có xem vài cái tutorial do Anh viết, Em rất thích! Mong rằng Anh nhín chút thời gian viết tiếp nữa, Em ủng hộ Anh. Em biết:"Thật là khó khăn để trình bày một vấn đề cho người mới học". Em tin: "Chẳng bao lâu nữa, mọi người sẽ được phổ cập Pic" và sẽ gởi bài như Anh...
Trong tutorial viết về hàm delay của Anh, có một số chỗ Em thấy khó chịu. Trước khi mọi việc được sáng tỏ, Em mong Anh cho em biết:
" Có tài liệu nào trình bày thời gian thực hiện của một lệnh nào đó không ?"
Nếu có được điều Em muốn, thì mới tự tin cho Anh thấy chỗ khó chịu trong tutorial viết về hàm delay.
Một lần nữa, Em xin Cảm ơn mọi thành viên trong PicVietNam ( Falleaf, NHH, NTC, NamQN,..còn nhiều lắm!) đã góp phần phổ cập Pic cho Em!
qanhep
09-02-2007, 08:37 AM
Chú anhthang chịu khó vào www.microchip.com mà load cái instruction set về mà đọc. Trong đó nói rõ, lệnh nào thực hiện hết bao nhiêu chu kỳ máy.
Bài viết về chương trình delay bạn download bản đã chỉnh sửa để đọc nhé. Tại đây, bài số #22:
http://www.picvietnam.com/forum//showthread.php?t=238&page=2
Về thời gian thực thi lệnh, bạn đọc trong datasheet, từ khóa là "instruction cycle". Có thể dùng để search trên google để tìm hiểu thêm.
anhthang
09-02-2007, 07:48 PM
Cảm ơn anh NTC và bạn Qanhep nhiều, chúc mọi người khỏe mạnh, hạnh phúc!
hieulongan039
09-02-2007, 10:24 PM
chao các ban,
mình có 1 vài thắc mắc muốn thỉnh giáo các bạn:
1/ minh cũng vừa mới tìm hiểu PIC mà thôi mà mình chỉ có tài liệu tiếng việt về PIC 16F84 mà thôi mà mình thì muốm tìm hiểu PIC 16F877 nen ko biết là tập lệnh (những lệnh giống giữa 2 loại này) có xài chung được hay ko (vì mình muốn học 16F877 nhưng sau nay có dùng 16F84 cung duợc).
2/ trong bank thanh ghi của PIC có phần thanh ghi mục đích chung W (G-P-R) mà mình thấy là một nhiều địa chỉ có nghĩa là nó là tập hợp của nhiều thanh ghi vậy khi minh truy xuất thì nó sẽ như thến nào.
3/ trong PIC 16F877 có tấc cả 4 bank thank ghi nhưng sao mình thấy nó có những thanh ghi cùng tên nhưng khác địa chỉ vậy là sao?
4/ mình dùng mạch nạp qua cổng COM (PGC2)mà bác falleaf upload lên có thể dùng trong mạch thí nghiệm nạp xong chạy luôn ko? vì mình thấy mạch đó ko cần cấp nguồn nuôi.
5/ giá của PIC 16F877 là bao nhiêu 1 con, để mình biết mà cẩn thận hơn (sinh viên mà).
6/ trong TP>HCM có chổ nào học PIC ko nếu có các bác chỉ mình đi học với.
còn nữa mình sẽ hỏi tiếp trong lần sau (để về nghiên cứu trước đã hehe) hehe
anhthang
10-02-2007, 08:39 AM
Thật là xui xẻo! Trung gõ cho Bạn được 30 phút tự nhiên cúp điện.
Trung nghĩ Bạn chưa xem hết các luồng trong trang Web này, tất cả các câu trả lời điều nằm trong đó hết.
Pic16F877A giá 90 ngàn
Lớp học Pic do PicVietNam chỉ mở ở Hà Nội!
Mạch nạp PG2C không cho phép chạy trực tiếp, nhiệm vụ của nó chỉ là nạp chương trình.
Còn mạch nạp Tiny Bootloader thì cho phép chạy trực tiếp để thí nghiệm.
Nhưng không thể loại bỏ một trong hai mạch nạp.
Trước tiên Bạn cần biết khái niệm Bootloader là gì?
Bootloader là chương trình Asm dùng để nạp vào vi điều khiển Pic. Muốn nạp nó vào Pic thì Bạn dùng PG2C để nạp.Khi nạp xong, Bạn cắm Pic vào mạch chạy thử . Sau khi reset, nó sẽ đợi tín hiệu từ máy tính trong một giây,nếu nhận được tín hiệu từ máy tính thì nó sẽ nhận chương trình nạp mới vào ( nếu Bạn có kết nối với mạch Tiny Bootloader và mạch tiny bootloader có kết nối với máy tính)
Còn nếu không nhận được tín hiệu từ máy tính nó sẽ thực thi chương trình cũ.
Bạn thấy tiện lợi không, khi Bạn kết nối mạch chạy thử ( Test ) với Tiny Bootloader và kết nối với máy tính. Trong khoảng thời gian 1s tính từ lúc reset mạch, chương trình Bootloader sẽ thực thi, và sẵn sàng nạp chương trình mới từ máy tính vào ( nếu có tín hiệu từ máy tính ). Còn nếu không nhận được tín hiệu từ máy tín thì nó sẽ thực thi chương trình cũ.
anhthang
10-02-2007, 08:55 AM
Mạch nạp PG2C yêu cầu như sau: Bạn phải cắm Pic vào mạch nạp, và từ đó mới được phép cắm mạch nạp vào máy tính. Sau khi nạp xong bạn phải gỡ mạch nạp ra khỏi máy tính, và từ đó mới được phép lấy Pic ra. Giả sử Bạn đã viết xong một chương trình, muốn nạp nó vào Pic. Bạn phải cắm Pic vào mạch nap, và cắm mạch nạp vào máy tính. Sau khi nạp xong, Bạn phải thực hiện các thao tác: gỡ mạch nạp ra khỏi máy tình, gỡ Pic ra khỏi mạch nạp và cắm vào mạch chạy thử ( mạch test ). Không may chương trình viết sai thì sao? Bạn phải sửa chương trình và nạp lại, mệt mỏi lắm!
Mạch nạp Bootloader sẽ giúp Bạn.
Vì mạch PG2C đã lấy các tín hiệu cần thiết từ cổng RS232. Trung cũng mới học Pic như Bạn, hi. Qua tết mình sẽ mua PG2C, Tiny Bootloader, và 2 con Pic16F877A về chơi, mấy hôm nay thèm quá!
Mong thành viên trong PicVietNam thông cảm nếu em trình bày không đúng, vì em chỉ mới học Pic có 16 ngày thôi!
Chúc mọi người năm mới hạnh Phúc!
F: mọi người đều cùng học hỏi lẫn nhau, F rất cảm ơn những bài trả lời như thế này, vì những câu hỏi căn bản luôn được hỏi đi hỏi lại, vậy các bạn thành viên hãy cùng giúp các thành viên khác, và giúp đỡ diễn đàn.
anhthang
10-02-2007, 08:57 AM
xin lỗi: vì Pic lấy tín hiệu cần thiết qua cổng RS232 nên không cần cấp nguồn.
anhthang
10-02-2007, 06:51 PM
Trời! mình gõ nhầm: mạch nạp PG2C lấy các tín hiệu cần thiết từ cổng RS232 của máy tính nên "không cần cấp nguồn" chứ không phải Pic lấy tín hiệu cần thiết từ cổng RS232. Thành thật xin lỗi.
namqn: vậy phiên bản gốc của bạn chỉ thiếu cụm từ "nên không cần cấp nguồn", hai post sau có thể xóa đi. Nếu bạn không biết cách sửa thì tôi sẽ sửa sau.
hawinter
10-02-2007, 07:12 PM
các bác cho hỏi khi muốn nạp một chương trình mới vào PIC
mình có cách nào để xoá chương trình cũ đi không em nghe nói là nên
xoá chương trình cũ trước khi nạp chương trình mới (em sử dụng pg2c và Icprog)
Em mua con 877A có 55k ở Hà Nội (17A Hàn Thuyên)
falleaf
10-02-2007, 08:08 PM
Nếu như bạn nạp lại mới, thì bạn nên xóa chương trình cũ trước, sau đó mới nạp, và nên đặt chế độ verify.
Trong ICPROG nó có nút xóa. Hoặc trong một số trình nạp, nó cho phép bạn đặt chết độ khi bấm nút nạp, thì nó xóa trước rồi mới nạp và verify luôn.
Chúc vui
namqn
10-02-2007, 09:46 PM
Trước tiên Bạn cần biết khái niệm Bootloader là gì?
Bootloader là chương trình Asm dùng để nạp vào vi điều khiển Pic. Muốn nạp nó vào Pic thì Bạn dùng PG2C để nạp.Khi nạp xong, Bạn cắm Pic vào mạch chạy thử . Sau khi reset, nó sẽ đợi tín hiệu từ máy tính trong một giây,nếu nhận được tín hiệu từ máy tính thì nó sẽ nhận chương trình nạp mới vào ( nếu Bạn có kết nối với mạch Tiny Bootloader và mạch tiny bootloader có kết nối với máy tính)
Còn nếu không nhận được tín hiệu từ máy tính nó sẽ thực thi chương trình cũ.
Bạn thấy tiện lợi không, khi Bạn kết nối mạch chạy thử ( Test ) với Tiny Bootloader và kết nối với máy tính. Trong khoảng thời gian 1s tính từ lúc reset mạch, chương trình Bootloader sẽ thực thi, và sẵn sàng nạp chương trình mới từ máy tính vào ( nếu có tín hiệu từ máy tính ). Còn nếu không nhận được tín hiệu từ máy tín thì nó sẽ thực thi chương trình cũ.
Nói tổng quát hơn, bootloader là một chương trình (viết bằng bất cứ ngôn ngữ gì) dùng để nạp code mới vào chip thông qua một phương tiện truyền thông nào đó (thường dùng RS-232, hay USB). Một điều kiện cần là chip phải có khả năng tự nạp chương trình, đây là lưu ý quan trọng vì nhiều bạn vẫn dùng PIC1F84(A) hay PIC16F628(A) để bắt đầu học PIC, và các chip này không dùng với bootloader được.
Thân,
hungpq
12-02-2007, 09:35 AM
Báo cáo với các bác là tôi đã ghi được dữ liệu vào bộ nhớ Flash của con pic16f877a. Đoạn code trong datasheet của con 16f877a nó bị sai các bác ah, còn MPLAB vẫn cho mô phỏng việc ghi flash bình thường, chỉ có điều nó không cho mình xem bit WR trong thanh ghi EECON1 set lên.
hieulongan039
13-02-2007, 06:00 PM
cám ơn bác anhthang rat nhieu.
nhan tiện năm mới chúc bác cùng cả gia đình PIC Việt Nam năm mới an khang thịnh vượng nhiều niềm vui sức khoẻ để tiếp tục nghiên cứu PIC càng ngày càng chuyên nghiệp và số người sử dụng cũng tăng theo. (hơi dài dòng).
bác cho mình hỏi thêm vài cài nữa nghe:
1/ khi mình muốn truy xuất bất kỳ 1 thanh ghi nào thì mình fải nhảy đếm bank chứa thanh ghi đó bằng cách set bit ớ thanh ghi status hả bác.
2/ trong PIC 16f877 co tới 4 bank thanh ghi mà nó có các thanh ghi trùng tên như status hay portB và cả thanh ghi muc đích chung mình vẫn chưa hiểu lám vì thanh ghi muc đích chung là cả 1 khoảng thanh ghi vậy khi nói đến W, hay status thì nó biết cài nào mà truy xuất chứ?
thân ái
and HAPPY NEW YEAR
hieulongan039
14-02-2007, 06:26 PM
cho minh hoi thêm 1 câu kỹ thuật bảng là gì vậy? hồi xưa mình có sử dụng 89 nhưng chưa nghe thuật ngữ này mong anh em chỉ giáo
falleaf
15-02-2007, 02:21 PM
http://www.picvietnam.com/forum//showthread.php?t=5
Bạn đọc bài số 27 của F trong luồng trên, (Học PIC trong 1 ngày) và download tài liệu về kỹ thuật bảng về để tìm hiểu thêm.
Chúc vui.
manofpic
11-03-2007, 10:14 PM
cảm ơn các bác post lên toàn các thông tin bổ ích cho 1 người mới làm quen với PIC như e. 10Q
tranvanthuong
15-03-2007, 09:35 AM
Chào các bạn trong diển dàn tui là một thành viên mới toan, tui rất yêu thích PIC và bắt đầu bằng con 16F84A. Tui chưa biết phần mền nào lập trình cho nó nhờ các bac chi giúp, mình có MPLAP IDE v7.50 nhung không biết sài nhờ các bác chỉ cho. Mình đang chờ tin của các bạn
Bạn tham khảo trong luồng này:
http://www.picvietnam.com/forum/showthread.php?t=354
The lastest
26-03-2007, 09:33 PM
Mình mới là thành viên mới của diễn đàn và cũng mới học Pic gần đây thôi. Cho mình hỏi vấn đề này với, chương trình sau khi biên dịch thành công và đã debug bằng MPLab SIM thì nạp vào chương trình có thể chắc chắn là chương trình đó đã đúng ko. Mình đã nạp vào Pic 16f877a mà không chạy được.
Mình sử dụng mạch nạp GTP-USB , chương trình nạp là WinPic800
cám ơn nhiều nhé
namqn
27-03-2007, 12:00 AM
Mình mới là thành viên mới của diễn đàn và cũng mới học Pic gần đây thôi. Cho mình hỏi vấn đề này với, chương trình sau khi biên dịch thành công và đã debug bằng MPLab SIM thì nạp vào chương trình có thể chắc chắn là chương trình đó đã đúng ko. Mình đã nạp vào Pic 16f877a mà không chạy được.
Mình sử dụng mạch nạp GTP-USB , chương trình nạp là WinPic800
cám ơn nhiều nhé
Khi đã mô phỏng bằng MPLAB SIM thì vẫn chưa hoàn toàn chắc chắn là chương trình đã đúng.
Bạn nạp chương trình vào chip rồi mà không chạy được thì không hẳn chương trình đó sai. Bạn phải kiểm tra lại các từ cấu hình có được thiết lập đúng chưa, phần cứng đã đảm bảo những yêu cầu tối thiểu để chip có thể chạy chưa.
Tốt nhất là bạn post sơ đồ mạch thử nghiệm của bạn, cùng các từ cấu hình mà bạn đã dùng. Nếu những phần đó đúng thì mới cần xem xét đến code của chương trình.
Thân,
hieulongan039
01-05-2007, 11:54 PM
các bác chi cho mình các lệnh banksel va pagesel viết như thế nào cho dúng
co phải như vầy ko?
banksel 0; chọn bank 0
pagesel 0; chọn trang 0,
cho mình hỏi thêm tí nữa là khi mình dùng lệnh call hay goto mình chỉ quan tâm đến page của bộ nhớ chuơng trình thôi (nếu vượt 2k) ko quan tâm đến bank thanh ghi à
còn khi thao tác các lệnh tiếp theo thì như thế nào ko cùng bank, hoặc page
vd: call congviec1
.....
.....
congviec1:
............
.....; các cộng việc ở day khac bank hoặc khác page thì sau fai chọn bank hoặc page lại hả
xin cac bác chỉ giúp
thanks
namqn
02-05-2007, 12:16 AM
Tôi nhớ rõ ràng là tôi đã viết về pagesel và banksel, nhưng tìm mãi không ra (đến giờ tôi spam được gần 700 lần rồi, nên khó tìm).
Cú pháp của các directive đó rất đơn giản, bạn dùng tên của ô nhớ (thanh ghi) với banksel, và dùng nhãn với pagesel.
Ví dụ, banksel PORTB, sẽ sinh ra các lệnh hợp ngữ cần thiết để chọn bank cho thanh ghi PORTB. Còn pagesel ctcon1 sẽ sinh ra các lệnh hợp ngữ cần thiết để thiết lập PCLATH thích hợp cho lệnh chuyển điều khiển đến ctcon1 nằm sau đó.
pagesel liên quan đến trang bộ nhớ chương trình, còn banksel liên quan đến trang của bộ nhớ dữ liệu. Hai phần này nói chung không có liên quan gì với nhau.
Tổng quát, nếu sắp chuyển điều khiển (bằng call hay goto) đến một đoạn mã lệnh nằm khác trang bộ nhớ chương trình thì phải chuyển trang, còn nếu sắp truy xuất một ô nhớ dữ liệu nằm ở bank khác với hiện tại thì phải chuyển bank. (Tôi viết vừa tiếng Anh vừa tiếng Việt để bạn dễ phân biệt)
Thân,
hieulongan039
02-05-2007, 01:37 PM
cám ơn bạn namqn nhiều, cho hỏi thêm tí nữa nghe
(vì mình hơi cậm tiêu hehe).
lệnh pagesel ctcon1 rồi mới tới lệnh gọi chuơng trình con 1 phải ko?
cd:
............
call ctcon1
........
............
call ctcon2
.........
pagesel ctcon1
ctcon1:
..........
.......
ret ;dừng ct con 1
pagesel ctcon2
ctcon2:
..........
..........
ret ;dừng ct con 2
; cú pháp vậy dúng ko bạn namqn
bây giờ thì mình hiểu thêm đuợc tí, nhờ có cầu trúc banksel, pagesel mà đơn giản hơn nhiều khi chọn bank hoặc page.
thanks
namqn
04-05-2007, 01:41 AM
cám ơn bạn namqn nhiều, cho hỏi thêm tí nữa nghe
(vì mình hơi cậm tiêu hehe).
lệnh pagesel ctcon1 rồi mới tới lệnh gọi chuơng trình con 1 phải ko?
cd:
............
call ctcon1
........
............
call ctcon2
.........
pagesel ctcon1
ctcon1:
..........
.......
ret ;dừng ct con 1
pagesel ctcon2
ctcon2:
..........
..........
ret ;dừng ct con 2
; cú pháp vậy dúng ko bạn namqn
bây giờ thì mình hiểu thêm đuợc tí, nhờ có cầu trúc banksel, pagesel mà đơn giản hơn nhiều khi chọn bank hoặc page.
thanks
Bạn phát biểu đúng nhưng viết code sai, phải viết như sau:
cd:
............
pagesel ctcon1
call ctcon1
........
............
pagesel ctcon2
call ctcon2
.........
ctcon1:
..........
.......
ret ;dừng ct con 1
ctcon2:
..........
..........
ret ;dừng ct con 2
hieulongan039
04-05-2007, 07:22 PM
cám ơn bạn namqn nhiều, bây giờ thì mình hiểu ra rùi.
phamthanhkhuyen
20-05-2007, 08:34 PM
Bạn namqn
cho mình hỏi 1 tí trong Datasheet PIC 16F877a trang 38 ở ví dụ
EXAMPLE 3-4 ở dòng 3 từ dưới đếm lên
XORLW 0X03
đúng ra nó phải là
XORLW 0X04
không biết tôi nghĩ như vậy có đúng không ?
xin bạn chỉ dùm
sau đây là nguyên bản của Datasheet
--------------------------------------------------------------------------
EXAMPLE 3-4: WRITING TO FLASH PROGRAM MEMORY
--------------------------------------------------------------------------
; This write routine assumes the following:
;
; 1. A valid starting address (the least significant bits = ‘00’)is loaded in ADDRH:ADDRL
; 2. The 8 bytes of data are loaded, starting at the address in DATADDR
; 3. ADDRH, ADDRL and DATADDR are all located in shared data memory 0x70 - 0x7f
;
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Bank 2
MOVF ADDRH,W ; Load initial address
MOVWF EEADRH ;
MOVF ADDRL,W ;
MOVWF EEADR ;
MOVF DATAADDR,W ; Load initial data address
MOVWF FSR ;
LOOP MOVF INDF,W ; Load first data byte into lower
MOVWF EEDATA ;
INCF FSR,F ; Next byte
MOVF INDF,W ; Load second data byte into upper
MOVWF EEDATH ;
INCF FSR,F ;
BSF STATUS,RP0 ; Bank 3
BSF EECON1,EEPGD ; Point to program memory
BSF EECON1,WREN ; Enable writes
BCF INTCON,GIE ; Disable interrupts (if using)
MOVLW 55h ; Start of required write sequence:
MOVWF EECON2 ; Write 55h
MOVLW AAh ;
MOVWF EECON2 ; Write AAh
BSF EECON1,WR ; Set WR bit to begin write
NOP ; Any instructions here are ignored as processor
; halts to begin write sequence
NOP ; processor will stop here and wait for write complete
; after write processor continues with 3rd instruction
BCF EECON1,WREN ; Disable writes
BSF INTCON,GIE ; Enable interrupts (if using)
BCF STATUS,RP0 ; Bank 2
INCF EEADR,F ; Increment address
MOVF EEADR,W ; Check if lower two bits of address are ‘00’
ANDLW 0x03 ; Indicates when four words have been programmed
XORLW 0x03 ;
BTFSC STATUS,Z ; Exit if more than four words,
GOTO LOOP ; Continue if less than four words
namqn
20-05-2007, 09:01 PM
Bạn namqn
cho mình hỏi 1 tí trong Datasheet PIC 16F877a trang 38 ở ví dụ
EXAMPLE 3-4 ở dòng 3 từ dưới đếm lên
XORLW 0X03
đúng ra nó phải là
XORLW 0X04
không biết tôi nghĩ như vậy có đúng không ?
xin bạn chỉ dùm
...
Bạn đọc post #17 của luồng này về cách sửa:
http://www.picvietnam.com/forum/showthread.php?t=934
Phần code ví dụ trong datasheet đó đã được xác định là có lỗi.
Thân,
mgdaubo
15-06-2007, 05:45 PM
Em có vài thắc mắc(mới học PIC được 1 buổi tối):
1/Em thấy pic16F877a PORTA chỉ có từ RA0-->RA4, em muốn dùng hết 8bit PORTA thì dùng chân nào nữa? có phải AN5-->AN7 ko?
2/Em đang viết chương trình chạy 1 dãy led (32led),chương trình thế này: có nhiều mode chạy led, khi bắt đầu thì chọn ngẫu nhiên 1 mode chạy, trong quá trình chạy nếu nhấn reset MRST thì pic reset lại và nó lại chọn ngẫu nhiên 1 mode khác... viết bằng ASM.
Nhưng hiện em đang bí phần tạo số ngẫu nhiên, xin hỏi ASM cho pic có cách nào tạo được số ngẫu nhiên ko? nếu dùng C thì sao?
3/Anh nào viết 1 tut về sử dụng chức năng Analog của portA đi
namqn
15-06-2007, 08:24 PM
Em có vài thắc mắc(mới học PIC được 1 buổi tối):
1/Em thấy pic16F877a PORTA chỉ có từ RA0-->RA4, em muốn dùng hết 8bit PORTA thì dùng chân nào nữa? có phải AN5-->AN7 ko?
2/Em đang viết chương trình chạy 1 dãy led (32led),chương trình thế này: có nhiều mode chạy led, khi bắt đầu thì chọn ngẫu nhiên 1 mode chạy, trong quá trình chạy nếu nhấn reset MRST thì pic reset lại và nó lại chọn ngẫu nhiên 1 mode khác... viết bằng ASM.
Nhưng hiện em đang bí phần tạo số ngẫu nhiên, xin hỏi ASM cho pic có cách nào tạo được số ngẫu nhiên ko? nếu dùng C thì sao?
3/Anh nào viết 1 tut về sử dụng chức năng Analog của portA đi
1/ PIC16F877A được thiết kế PORTA như vậy, không có các chân RA6 và RA7. Các bit 6 và 7 không được sử dụng trong các thanh ghi PORTA và TRISA. Do đó bạn không thể dùng PORTA như một port 8-bit, bạn chỉ có thể dùng nó như một port 6-bit.
2/ Ở www.piclist.com có các đoạn code hợp ngữ để tạo số ngẫu nhiên, trang sau đây có các đoạn code để tạo số ngẫu nhiên 8-bit:
http://www.piclist.com/techref/microchip/rand8bit.htm
Các trình biên dịch C thường có hàm sinh số ngẫu nhiên, nếu viết chương trình bằng C thì chỉ cần dùng hàm đó.
3/ Dưới đây là các bước thực hiện để sử dụng module A/D (được dịch và chú thích thêm từ datasheet của PIC16F877A)
1. Cấu hình module A/D
- Cấu hình các chân analog/điện áp chuẩn (tham chiếu) và các chân digital (dùng thanh ghi ADCON1)
- Chọn kênh ngõ vào A/D (thanh ghi ADCON0)
- Chọn nguồn xung chuyển đổi A/D (thanh ghi ADCON0)
- Bật module A/D (thanh ghi ADCON0)
2. Cấu hình ngắt A/D (nếu cần)
- Xóa bit ADIF (thanh ghi PIR1)
- Bật bit ADIE (thanh ghi PIE1)
- Bật bit PEIE (thanh ghi INTCON)
- Bật bit GIE (thanh ghi INTCON)
3. Chờ đủ thời gian lấy mẫu
4. Bắt đầu chuyển đổi: bật bit GO/DONE (thanh ghi ADCON0)
5. Chờ cho việc chuyển đổi hoàn tất bằng 1 trong 2 cách sau:
- Hỏi vòng bit GO/DONE để phát hiện nó bị xóa (đã cấm ngắt)
- Chờ ngắt A/D
6. Đọc cặp thanh ghi kết quả (ADRESH:ADRESL), xóa bit ADIF nếu cần
7. Với phép chuyển đổi tiếp theo, quay trở về bước 1 hay 2 tùy trường hợp.
TAD là thời gian chuyển đổi 1 bit.
Datasheet của PIC16F877A đã giải thích chi tiết về các thanh ghi liên quan đến module A/D. Bạn hãy đọc những phần đó.
Nếu cần thiết, bạn có thể tự viết đoạn code và post lên đây để các thành viên khác có thể xem xét giúp bạn.
Thân,
chào các bác em là dân mơi học píc 16f877a ,em đang làm đồ án về điều khiễn động cơ 1 chiều kích thích quay thuận quay ngược ,em làm được mạch nhưng về phần code thì em làm mãi mà nó vẫn ko chạy , mong các bác giúp đỡ em bác nào có code thì pots lên cho em tham khão với .
em xin cãm ơn các bác ?
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.