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


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