TUT PIC 16F887 cơ bản

#11
Kinh nghiệm riêng của em khi lựa chọn dòng pic sử dụng là trước hết phải xét đến ứng dụng của mình cần hướng tới chức năng gì, cần những modul nào , sau đó vào trang của microchip xem các dòng chip hỗ trợ, nó có thể là pic10,12,16,18,24 hoặc dspic30,33. Tiếp theo thì tìm xem các dòng chip phổ biến tại việt nam có thể dễ dàng mua xem có dòng nào phù hợp không (có thể vào 1 số trang web như của tme hoặc techpal). Nếu có thì anh em mới tính đến xem dùng con nào kinh tế nhất. Khi thực hiện với 1 dự án cụ thể ta có rất nhiều sự lựa chọn pic, ta cần lựa ra phương án tối ưu nhất.
-Ở HN tôi thấy ICVN.COM.VN bán pic giá cũng rẻ, những con chip hay ứng dụng đều có....
- Bác vuxuansyhut nói chuẩn đấy, tui cũng thấy như vậy, trước tiên phải xem ứng dụng mình là gì, lựa chọn pic phù hợp với mạch in, chú ý là rom và ram của chip đối với ứng dụng...còn mua chip thì bạn dùng số lượng nhiều có thể đặt hàng từ tme loại nào cũng có hết (họ nói chip là sịn của microchip,ko biết thật ko)
 

vuxuansyhut

Sinh viên đại học
#12
Em có thể lấy 1 ví dụ. Ngày trước em làm với mạng Canbus. Tra trên trang của microchip thấy nó ghi PIC18, PIC24H, dsPIC30F và dspic33f đều có những con hỗ trợ. Sau đó em tìm pic18 xem trên thị trường bán những con nào (thực ra cũng không nhiều loại lắm) tính đi tính lại thấy mình còn thiếu kiến thức thế là tìm dòng nào có nhiều tài liệu (hỏi bác google). Cuối cùng chọn pic18f4580. Nhưng khi có kinh nghiệm và mục đích thương mại thì không thể lựa chọn theo hướng này.
 
#13
Em có thể lấy 1 ví dụ. Ngày trước em làm với mạng Canbus. Tra trên trang của microchip thấy nó ghi PIC18, PIC24H, dsPIC30F và dspic33f đều có những con hỗ trợ. Sau đó em tìm pic18 xem trên thị trường bán những con nào (thực ra cũng không nhiều loại lắm) tính đi tính lại thấy mình còn thiếu kiến thức thế là tìm dòng nào có nhiều tài liệu (hỏi bác google). Cuối cùng chọn pic18f4580. Nhưng khi có kinh nghiệm và mục đích thương mại thì không thể lựa chọn theo hướng này.
Thằng Microchip nó có nhiều dòng như vậy là vì mỗi dòng, mỗi loại có thêm chức năng cũng như dung lượng nhớ tùy thuộc vào ứng dụng của bạn giá thành của nó cũng sẽ tăng nếu chip có nhiều chức năng hơn....
Tôi trước thử với mảng 16f ko thể khai báo với mảng có >200 phần tử(code với cả css or htpic)=> phải dùng 18f mặc dù nếu chọn con 16f là phù hợp với ứng dụng của mình.
 

Thai Tran

Học sinh phổ thông
#14
Chào,

cho mình hỏi tại sao mạch phát triển Easypickit2 không nạp dc cho 887. phải chăn mạch k hổ trợ nạp cho con 887 này?!
Điều khiển IO
sơ đồ chân pic16F887

để VĐK hoạt động ta mắc mạch như sau:
cấp nguồn cho VĐK:
Chân 11, chân 32 nối với nguồn 5V
chân 12, chân 31 nối GND
chip có thể hoạt động với dao động nội nhưng ta sử dụng thạch anh ngoài và mắc mạch như sau
(trong ví dụ kid sử dụng thạch anh 8Mhz)

chi tiết các bạn tham khảo tài liệu ở trên
ở đây ta chỉ nói về cách sử dụng
để xuất dữ liệu ra bạn cần đặt giá trị =0 cho các bit tương ứng của thanh ghi điều khiển chiều
TRISx (TRISA, TRISB, TRISC, TRISD, TRISE)
thêm nữa để cấu hình các chân vào ra là Digital bạn gán ALSEL=ALSELH=0;
để VĐK dừng lại không làm gì trong 1 khoảng thời gian ta sử dụng các macro delay... của HTC
dưới đây là ví dụ

để cho led sáng ta ghi giá trị 1 vào bit tương ứng của PORTB (các PORT khác tương tự)
để cho led tắt ta ghi giá trị 0 vào bit tương ứng của PORTB
code:
Mã:
#include <htc.h>
#include <pic.h>
__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBUG_OFF);
__CONFIG(BOR4V_BOR40V&WRT_OFF);
//dau tien ta thu cho xuat ra 8 led tai cong b
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 8000000
#endif
 
void main() {
TRISB=0;//cau hinh PORTB la cong ra
ANSEL=ANSELH=0;//cau hinh IO la digital
while(1) {
PORTB=0xff;//cho sang tat ca cac led
__delay_ms(250);//delay 500ms
PORTB=0;//tat cac led
__delay_ms(250);
}
}
Chào bạn,
cho mình hỏi mạch kit phát triển easypickit2 có nạp dc cho con 887 này k?
 

NgoHungCuong

http://ngohungcuong.com
#15
Điều khiển IO
sơ đồ chân pic16F887

để VĐK hoạt động ta mắc mạch như sau:
cấp nguồn cho VĐK:
Chân 11, chân 32 nối với nguồn 5V
chân 12, chân 31 nối GND
chip có thể hoạt động với dao động nội nhưng ta sử dụng thạch anh ngoài và mắc mạch như sau
(trong ví dụ kid sử dụng thạch anh 8Mhz)

chi tiết các bạn tham khảo tài liệu ở trên
ở đây ta chỉ nói về cách sử dụng
để xuất dữ liệu ra bạn cần đặt giá trị =0 cho các bit tương ứng của thanh ghi điều khiển chiều
TRISx (TRISA, TRISB, TRISC, TRISD, TRISE)
thêm nữa để cấu hình các chân vào ra là Digital bạn gán ALSEL=ALSELH=0;
để VĐK dừng lại không làm gì trong 1 khoảng thời gian ta sử dụng các macro delay... của HTC
dưới đây là ví dụ

để cho led sáng ta ghi giá trị 1 vào bit tương ứng của PORTB (các PORT khác tương tự)
để cho led tắt ta ghi giá trị 0 vào bit tương ứng của PORTB
code:
Mã:
#include <htc.h>
#include <pic.h>
__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBUG_OFF);
__CONFIG(BOR4V_BOR40V&WRT_OFF);
//dau tien ta thu cho xuat ra 8 led tai cong b
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 8000000
#endif
 
void main() {
TRISB=0;//cau hinh PORTB la cong ra
ANSEL=ANSELH=0;//cau hinh IO la digital
while(1) {
PORTB=0xff;//cho sang tat ca cac led
__delay_ms(250);//delay 500ms
PORTB=0;//tat cac led
__delay_ms(250);
}
}
Hôm nay kid sẽ tiếp tục post về pic16f887
Timer0
Module Timer0 là bộ định thời hoặc bộ đếm với các tính năng sau:
+ 8 bit định thời hoặc đếm
+ bộ chia tần 8 bit (chia sẻ với Watchdog Timer)
+ Lựa chọn mềm nguồn xung nội hoặc xung ngoại
+ Lựa chọn mềm cạnh xung ngoại
+ Ngắt khi tràn
untitled.JPG
untitled2.JPG
untitled3.JPG


cụ thể hơn bạn tham khảo trong các tài liệu kid đã post
ta đi vào cách sử dụng:
Chọn chế độ:
*chế độ được chọn bằng bit T0CS của thanh ghi OPTION_REG (0 chế độ định thời, 1 chế độ đếm)
Mã:
T0CS=1;
hoặc
Mã:
T0CS=0;
*khi sử dụng bộ chia tần phải gắn với chế độ định thời hoặc đếm bằng cách xóa bit PSA của thanh ghi OPTION_REG
Mã:
PSA=0;
giá trị của bộ chia tần được đặt bằng cách sử dụng các bit PS2-PS0
* khi dùng ngắt thì các bit GIE và TMR0IE phải được đặt
Mã:
GIE=1;
TMR0IE=1;
Định thời và đếm:
- để định thời:
* khởi tạo thanhh ghi TMR0 bằng 1 giá tri nào đó
Mã:
TMR0=x;
* kiểm tra bằng cách đọc giá trị thanh ghi TMR0 (mỗi giá trị là 1us với thạch anh 4MHz)
Mã:
x=TMR0;//lấy giá trị từ TMR0
* cờ TMR0IF sẽ tự động được đặt mỗi khi TMR0 xảy ra tràn, nếu được cho phép thì 1 ngắt sẽ xuất hiện
- Để đếm xung:
* Xung vào tại chân RA4, sườn xung được chọn thông qua T0SE (0 sườn dương, 1 sườn âm)
Mã:
T0SE=x;//x=0 hoặc 1
* Số lượng xung được đọc từ giá trị của thanh ghi TMR0
bộ chia tần và ngắt tương tự chế độ định thời
code demo
PHP:
#include <htc.h>
 
__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBUG_OFF);
__CONFIG(BOR4V_BOR40V&WRT_OFF);
 
#ifndef _XTAL_FREQ
    #define _XTAL_FREQ 4000000
#endif
 
void delay();//delay su dung timer0
 
void main() {
    TRISB=0;
    T0CS=0;//chon xung noi
    PSA=0;//su dung bo chia tan
    PS0=PS1=PS2=1;//1:256
 
    while(1) {
        PORTB=0xff;
        delay();
        PORTB=0;
        delay();
    }
}
void delay() {
    unsigned char c;
    for(c=0;c<5;++c) {
        TMR0=0;
        TMR0IF=0;
        while(!TMR0IF);
    }
}
 

The Kid

Kỹ sư
#17
các bạn ơi, cho mình hỏi là : khi điều khiển LCD 20x2 (loại lm032l) mà mình không muốn cho con trỏ hiện thị tự động thay đổi giá trị hiện thị của nó như thế nào nhỉ?. Ý mình muốn thực hiện hiển thị các giá trị phải đúng vị trí mình yêu cầu trên lcd. kiến thức ve lcd của mình còn hạn hẹp mong các bạn giúp đỡ mình nha.
 

NgoHungCuong

http://ngohungcuong.com
#18
các bạn ơi, cho mình hỏi là : khi điều khiển LCD 20x2 (loại lm032l) mà mình không muốn cho con trỏ hiện thị tự động thay đổi giá trị hiện thị của nó như thế nào nhỉ?. Ý mình muốn thực hiện hiển thị các giá trị phải đúng vị trí mình yêu cầu trên lcd. kiến thức ve lcd của mình còn hạn hẹp mong các bạn giúp đỡ mình nha.
cái này chỉ là IO của PIC, vấn đề còn lại thuộc về LCD, không liên quan đến PIC
 

NgoHungCuong

http://ngohungcuong.com
#19
COMPARATOR
PIC16F887 có 2 bộ so sánh tín hiệu analog và được đặt ở PORTA, ngõ vào là các chân RA3-RA0, ngõ ra RA4, RA5
mỗi bộ so sánh có 1 thanh ghi điều khiển riêng
CM1CON0 và CM2CON0
ngoài ra bộ so sánh C2 còn có thêm thanh ghi điều khiển thứ 2 CM2CON1
các thanh ghi CM1CON0 và CM2CON0 chứa các bit điều khiển và các bit trạng thái:
- Cho phép hoạt động
- Chọn ngõ vào
- Chọn điện áp tham chiếu
- Chọn ngõ ra
- Đảo ngược kết quả
cụ thể hơn các bạn tham khảo datasheet của pic :D
PHP:
#include <htc.h>
void init();
void main() {
    init();
    while(1);
}
void init() {
    //khoi tao cho cm
    ANSEL=ANSELH=0xff;
    TRISA0=TRISA3=1;
    TRISA4=0;
    C1ON=1;//cho phep cm chay
    C1OE=1;//cho phep xuat ket qua ra chan ngoai
    C1OUT=0;//ko dao
    C1R=0;//chan chuan
    C1CH0=C1CH1=0;//kenh vao 0
}
 

BuiBachTuanAnh

Quản trị viên
Thành viên BQT
#20
các bạn ơi, cho mình hỏi là : khi điều khiển LCD 20x2 (loại lm032l) mà mình không muốn cho con trỏ hiện thị tự động thay đổi giá trị hiện thị của nó như thế nào nhỉ?. Ý mình muốn thực hiện hiển thị các giá trị phải đúng vị trí mình yêu cầu trên lcd. kiến thức ve lcd của mình còn hạn hẹp mong các bạn giúp đỡ mình nha.
Bạn hãy làm quen với việc đọc datasheet của từng linh kiện trước khi muôn sử dụng nó, trong đó gần như đã có đầy đủ. Mình chỉ giải thích thêm như sau:
  • LCD có bộ nhớ tạm thời DDRAM, trong đó chứa các ký tự cần hiển thị lên LCD. Bộ nhớ này có 80 ô được chia thành hai hàng, mỗi ô có độ rộng 8bit và được đánh số từ 0 đến 39 cho dòng 1, 64 đến 103 cho dòng 2. Mỗi ô nhớ tương ứng với một ô trên màn hình LCD. Loại LM032L là loại 20x2 có thẻ hiển thị tối đa 40 ký tự. vì vậy các ô nhớ trên DDRAM khi bạn ghi vào có thể hiển thị được là 00 đến 20 cho dòng 1 và 40 đến 60 cho dòng 2. Vì vậy muốn hiển thị một ký tự nào đó vào vị trí mong muốn trên LCD chúng ta phải ghi ký tự đó vào đúng địa chỉ ô nhớ trên LCD và đừng quên rằng ghi vào những ô nhớ có thể hiển thị được.
20x2.PNG
  • Để bạn rõ hơn về loại LCD này và bạn sử dụng hợp ngữ bạn có thể tham khảo: LCD module ở file đính kèm
  • Nếu bạn muốn dùng C thì có hẳn một project mẫu cho bạn tham khảo. Download LM032L.zip
----------------
Chúc vui!
 

Đính kèm

Quảng cáo Google