PDA

View Full Version : Từ PIC16F877A đến PIC16F887


LeDuc
18-06-2007, 06:10 PM
Chiều nay em định mua vài con 16f877A ve thực hành, em được chị Thủy tư vấn nên dùng con 16f887, nó vừa rẻ hơn mà các chức năng ko thua gì 16f877A . Em kiến thức nông cạn xem datasheet 2 con chỉ thấy khác nhau chút ít thôi, ko biết các bác thấy thế nào?
Các bác có thể so sánh 2 con này ko? có thể thay thế 16f877A = 16f887 ko? em cần làm mạch điều khiển robot nên cần tốc dộ xử lý cao.
Giúp em với.
Thanks các bác!

falleaf
18-06-2007, 06:29 PM
Hoàn toàn có thể thay thế 877A.

Sự khác biệt chính là 887 có thêm 3 chân I/O, và 887 là dùng standard flash, trong khi 877A dùng enhanced flash. Cái này ở mức độ ứng dụng thì không có gì thay đổi cả, hầu hết các chip của Microchip đều sử dụng standard flash.

Còn 887 hoàn toàn tương thích với 877A, chương trình viết cho 877A có thể đem qua 887 để chạy.

Còn các chi tiết đặc điểm về điện, bạn phải đọc thêm trong datasheet. Hoàn toàn có thể thay thể để dành cho học tập vì giá của 887 rẻ hơn 877A.

Chúc vui.

Tôi đã so sánh 2 chip này trong luồng sau:

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

Chú F, con PIC16F887 cũng dùng enhanced flash đó (100000 chu kỳ ghi/xóa điển hình). Mấy con mới ra sau này thường dùng enhanced flash hơn, vì công nghệ đã ổn định.

Tôi vừa thử nghiệm một số mạch nạp và phần mềm cho PIC16F886 và PIC16F887. Kết quả: có thể dùng PICPgm để nạp bằng mạch nạp JDM (qua cổng COM, các mạch như PIC1, PG1C, PG5v2 đều tương thích), có thể dùng PICPgm và melabsProg để nạp bằng mạch nạp Schear+ (qua cổng LPT, các mạch như PG3B, Propic2, EPIC đều tương thích).

Chú ý: mạch JDM tôi đã dùng là JDM Mod do tôi sửa đổi (dựa trên SI-Prog và JDM), mạch Schear+ tôi đã dùng là Schear+ Mod cũng do tôi sửa đổi (dựa trên Schaer+). Sơ đồ nguyên lý của các mạch nạp này được cung cấp ở đây:

http://www2.hcmut.edu.vn/~nqnam/uC.php



Download file: MSVCR71D.dll tại đây: http://www.dll-files.com/dllindex/dll-files.shtml?msvcr71d

Download phần mềm WinPICPgm phiên bản 1.001 tại đây: http://www.members.aon.at/electronics/pic/picpgm/download/winpicpgm_v1001.zip

Khi unzip và cài đặt cái WinPICPgm, có thể nó dòi file MSVCR71D.dll, các bạn download từ cái link ở trên, copy ra bỏ vào cùng thư mục với WinPICPgm là xong.

Bây giờ các bạn thử WinPICPgm với việc sử dụng JDM Programmer (mạch nạp PIC1).

PIC 16F88x bỏ các chân PSP (Parallel Slave Port) dùng cho slave của I2C. Thêm 4 chân enhance PWM hỗ trợ điều khiển động cơ (P1A >>P1D) . Một số bộ comparator (positive C1IN+,C2IN+ và negative C12IN0- >>C12IN3-).

namqn
18-06-2007, 08:34 PM
Tôi đã so sánh 2 chip này trong luồng sau:

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

Chú F, con PIC16F887 cũng dùng enhanced flash đó (100000 chu kỳ ghi/xóa điển hình). Mấy con mới ra sau này thường dùng enhanced flash hơn, vì công nghệ đã ổn định.

Thân,

huybo02
19-06-2007, 01:00 AM
PIC 16F88x bỏ các chân PSP (Parallel Slave Port) dùng cho slave của I2C. Thêm 4 chân enhance PWM hỗ trợ điều khiển động cơ (P1A >>P1D) . Một số bộ comparator (positive C1IN+,C2IN+ và negative C12IN0- >>C12IN3-).

Trích datasheet F88x: Một số điểm khác:
• Enhanced Timer1:
- 16-bit timer/counter with prescaler
- External Gate Input mode
- Dedicated low-power 32 kHz oscillator

• Enhanced Capture, Compare, PWM+ module:
- 16-bit Capture, max. resolution 12.5 ns
- Compare, max. resolution 200 ns
- 10-bit PWM with 1, 2 or 4 output channels,
programmable “dead time”, max. frequency
20 kHz
- PWM output steering control

• Enhanced USART module:
- Supports RS-485, RS-232, and LIN 2.0
- Auto-Baud Detect
- Auto-Wake-Up on Start bit

Cái enhance timer 1 nó khác với Timer 1 thế nào??? Thấy vãn giống nhau mà?

moihocpic1985
20-06-2007, 09:34 PM
Minh moi mua 2 con PIC 16f887 nhung khong cach nao nap duoc!
minh su dung mach nap propic2 va PG5v2. Ban nao da lam viec voi 16f887 roi xin giup minh voi!

namqn
20-06-2007, 09:42 PM
Minh moi mua 2 con PIC 16f887 nhung khong cach nao nap duoc!
minh su dung mach nap propic2 va PG5v2. Ban nao da lam viec voi 16f887 roi xin giup minh voi!
Bạn cho biết thêm bạn tự làm hay mua mạch nạp của ai, bạn đang dùng phần mềm nào. Propic2 tương thích với mạch nạp Tait-classic qua qua cổng song song, giống như những mạch nạp khác. Tôi đã dùng mạch nạp Brenner8 và phần mềm US-Burn của sprut và nạp được cho PIC16F887. Bạn xem thêm ở đây:

http://namqn.byethost7.com/uC.php#pic

Thân,

zero
22-06-2007, 06:29 AM
Cho tôi hỏi chút nhé
1.Có thể mua được con 16F887 ở HN ko ? nếu có thì giá khoảng bao nhiêu?
2.Có thể dùng mạch nạp PC1 và PC3 để nạp cho con này ko? nếu ko thì dùng mạch nạp j?

Thank!

falleaf
23-06-2007, 12:34 AM
Download file: MSVCR71D.dll tại đây: http://www.dll-files.com/dllindex/dll-files.shtml?msvcr71d

Download phần mềm WinPICPgm phiên bản 1.001 tại đây: http://www.members.aon.at/electronics/pic/picpgm/download/winpicpgm_v1001.zip

Khi unzip và cài đặt cái WinPICPgm, có thể nó dòi file MSVCR71D.dll, các bạn download từ cái link ở trên, copy ra bỏ vào cùng thư mục với WinPICPgm là xong.

Bây giờ các bạn thử WinPICPgm với việc sử dụng JDM Programmer (mạch nạp PIC1).

Một điểm đáng lưu ý là con 887 nó chỉ cho phép VPP max đạt 12V. Cho nên có thể mạch PIC1 cần phải sửa lại mấy chú diode thì có thể chơi được.

Cho tới nay F không có mạch, và cũng không có cổng COM để thử cho nên tạm thời bó tay.

Hiện này còn có ICD2 là trong dòng miễn phí có thể nạp được. Còn dùng với WinPICPgm thì bây giờ các bạn thử xem được không. Nếu xài được thì coi như thông qua.

Chúc vui.

moihocpic1985
23-06-2007, 10:25 AM
Minh da nap duoc pic6f887 bang mach PG5v2 dung phan mem picpgm phien ban 0996! con voi winpic800 chi moi detect chu chua nap duoc! ban nao co CCSC phien ban moi co the post len giup minh voi vi may phien ban cu ko ho tro bien dich cho 887!

namqn
23-06-2007, 08:04 PM
Tôi vừa thử nghiệm một số mạch nạp và phần mềm cho PIC16F886 và PIC16F887. Kết quả: có thể dùng PICPgm để nạp bằng mạch nạp JDM (qua cổng COM, các mạch như PIC1, PG1C, PG5v2 đều tương thích), có thể dùng PICPgm và melabsProg để nạp bằng mạch nạp Schaer+ (qua cổng LPT, các mạch như PG3B, Propic2, EPIC đều tương thích).

Chú ý: mạch JDM tôi đã dùng là JDM Mod do tôi sửa đổi (dựa trên SI-Prog và JDM), mạch Schaer+ tôi đã dùng là Schaer+ Mod cũng do tôi sửa đổi (dựa trên Schaer+). Sơ đồ nguyên lý của các mạch nạp này được cung cấp ở đây:

http://namqn.byethost7.com/uC.php

Có 2 phần mềm khác cũng có khả năng nạp được cho PIC16F88x, đó là Parallel Port PIC Programmer (của Oshonsoft) và WinPIC (của DL4YHF), tuy nhiên người dùng cần phải bổ sung chip vào danh sách. Vào thời điểm này tôi cho rằng hai phần mềm nêu trên đã đáp ứng được yêu cầu, nên tôi chưa thử nghiệm với WinPIC và Parallel Port PIC Programmer.

Trang web trên cũng có link đến các phần mềm đã được đề cập ở trên.

Thân,

LeDuc
20-10-2007, 11:20 PM
HIc.. máy cùa em vừa bị virus nó gặm , mầy cái phần mềm die hết.
Mấy anh cho em xin cái phầm mềm winpicpgm nha , cai link cua anh F die roi ... hic.
A cho em xin luon cai filmware của con 16f887 nha.. em đang rất cần..
Rất cảm ơn..
Thanks all !

PIC_Phan
21-10-2007, 06:53 PM
mạch GTP-USB nạp được hết tất cả tụi 16Fxxx,ICD2 cũng vậy....

ti500
22-10-2007, 12:41 AM
mạch GTP-USB nạp được hết tất cả tụi 16Fxxx,ICD2 cũng vậy....

Bác nói sao ấy chứ, mạch nạp GTP_USB phiên bản 3.55 của mình đâu có nạp được PIC 16F887

PIC_Phan
23-10-2007, 09:23 AM
Quên ! Mạch Nạp GTP của mình mua là GTP-USB +, sử dụng winpic800 v3.61.

popeye_ts22
20-11-2008, 01:51 AM
Em không hiểu các chế độ auto restart và auto shutdown trong chip 16F887 có nhiệm vụ gì thế ạ,cả thời gian "Dead-band" nghĩa là như nào ạ.Timer 1 làm khối thời gian cơ sở cho capture và compare ,hiểu như nào ạ.
Tks các bác nhìu nhìu..

namqn
20-11-2008, 03:22 AM
Em không hiểu các chế độ auto restart và auto shutdown trong chip 16F887 có nhiệm vụ gì thế ạ,cả thời gian "Dead-band" nghĩa là như nào ạ.Timer 1 làm khối thời gian cơ sở cho capture và compare ,hiểu như nào ạ.
Tks các bác nhìu nhìu..
Bạn đang nói về module ECCP của PIC16F887. Khi có một sự kiện thể hiện yêu cầu shut-down (tắt) module ECCP, trạng thái của các ngõ ra của module ECCP cần được xác định trước một cách rõ ràng, để tránh gây hư hại đến mạch ứng dụng. Chức năng này được gọi là auto-shutdown.

Nếu chế độ auto-restart của module ECCP được cho phép (enabled), sau khi điều kiện shut-down được gỡ bỏ, module ECCP sẽ tự động restart lại bằng điểm khởi đầu của một chu kỳ PWM. Nếu chế độ auto-restart không được cho phép (disabled), bạn sẽ phải xóa bit ECCPASE trong thanh ghi ECCPAS để cho phép module ECCP hoạt động trở lại.

Khi các ngõ ra của module ECCP được dùng để kích các nửa cầu, các linh kiện đóng/ngắt nằm cùng một nửa cầu cần tránh được kích cùng một lúc, vì sẽ dẫn đến hiện tượng ngắn mạch nguồn. Do bản chất vật lý của các linh kiện dùng làm khóa (van) chuyển mạch, cần có một thời gian trễ giữa sự kiện tắt một khóa (van) và bật khóa (van) kia thuộc cùng một nửa cầu. Thời gian trễ này gọi là dead-time hay dead-band.

Timer1 được gọi là khối thời gian cơ sở cho các sự kiện capture và compare vì nó được dùng để xác định các thời điểm mà các sự kiện được phát hiện hay thay đổi.

Thân,

popeye_ts22
22-11-2008, 01:21 PM
Cám ơn bác.Bác cho em hỏi.Em muốn nạp ICSP qua mạch mnp1,dùng phần mềm Pgm.Em phải cấu hình cho nó như nào ạ.Phần các pin và hardware test là như nào hả bác.Trên mạch của em chỉ cần đưa các chân ICSP rùi cắm vào 6 chân của mnpic1 phải không ạ.

namqn
24-11-2008, 02:42 AM
Cám ơn bác.Bác cho em hỏi.Em muốn nạp ICSP qua mạch mnp1,dùng phần mềm Pgm.Em phải cấu hình cho nó như nào ạ.Phần các pin và hardware test là như nào hả bác.Trên mạch của em chỉ cần đưa các chân ICSP rùi cắm vào 6 chân của mnpic1 phải không ạ.
Đọc bài viết của bạn rồi tôi cũng không rõ bạn đang dùng mạch nạp nào. Với các mạch nạp qua cổng COM như JDM và tương thích (PG2C của Olimex chẳng hạn), bạn chỉ cần chọn JDM Programmer trong PICPgm. Nếu bạn dùng JDM Mod của tôi thì cần chỉnh lại cấu hình: chọn Invert cho chân Data Out.

Trên mạch ứng dụng thì bạn cần cách ly các chân của PIC được sử dụng cho ICSP với các mạch ngoại vi khác, vấn đề này đã được nói nhiều lần trên diễn đàn, bạn hãy tìm kiếm trong diễn đàn với Google bằng từ khóa ICSP. Post #17 của luồng sau là một trong những bài viết của tôi đề cập đến việc hiện thực mạch đích cho ICSP: http://www.picvietnam.com/forum/showthread.php?t=429&page=2

Thân,

popeye_ts22
25-11-2008, 12:47 AM
Em ko tìm kĩ nên ko thấy đã có vấn đề ICSP kia rùi.Cám ơn bác.Mạch của em là mạch mnpic1 bác ạ.Có gì em sẽ hỏi thêm bác sau.Hihi.

minh_luandt
21-02-2009, 12:57 PM
em cũng mới mua vài con PIC16F887 về để làm DATN
Nghe nói giống 877a nhưng mà em ko biết "configuration bit" để sử dụng portB
vì lấy chương trình của 877a bỏ vào thì chỉ có bít 6 và bit 7 hoạt động còn lại thì ko thể set đcj

minh_luandt
21-02-2009, 05:17 PM
à em tìm ra roài
BANKSEL ANSELH
MOVLW 0X00
MOVWF ANSELH
Nhưng config bits thì vẫn còn mù lắm

nguyenk38
21-02-2009, 06:02 PM
Chào bạn MINH_LUANDT!
Có thể bỏ ra chút thời gian giúp mình được không? Mình đang có vấn đề về đề tài đang thực hiện, đề tài có liên quan đến Pic và giao tiếp với máy tính. Vấn đề của mình mắc phải là: Làm thế nào để tạo trên máy tính một bảng điều khiển, trên đó có các icons mà khi ta nhấn chuột vào icons đó nó sẽ thực hiện lệnh điều khiển thông qua Pic 16F877A. Có thể dùng VB6 để tạo ra cái Form đó không? Chương trình up cho Pic thì mình đã viết xong nhưng để tạo ra bảng điều khiển như mình nói ở trên thì mình phải làm những gì?
Cố gắng giúp mình nha. Xin chân thành cảm ơn.
Mình đang ở GV-TPHCM, giúp mình nha. Thanks kèm theo một bữa nhậu...Hi!

minh_luandt
21-02-2009, 09:11 PM
Mình cũng đang nghiên cứu đó
bạn có thể dùng Giao tiếp USART bất động bộ giao tiếp giữa máy tính và PIC
để vài bữa nữa mình up lên cho bạn 1 đồ án nhé

minh_luandt
21-02-2009, 09:13 PM
báo cáo đồ án

copxongpaste
27-03-2009, 11:17 PM
em mới mày mò cái này , sao mà khó quá các bác ơi

dinh tien
30-03-2009, 04:17 PM
em Le Duc co datasheet bang tieng viet cua pic 16f877a khong cho anh nhe.
em goi file vao mail nay cho anh nhe: dinhtien04d1808@yahoo.com
anh cam on em
Chiều nay em định mua vài con 16f877A ve thực hành, em được chị Thủy tư vấn nên dùng con 16f887, nó vừa rẻ hơn mà các chức năng ko thua gì 16f877A . Em kiến thức nông cạn xem datasheet 2 con chỉ thấy khác nhau chút ít thôi, ko biết các bác thấy thế nào?
Các bác có thể so sánh 2 con này ko? có thể thay thế 16f877A = 16f887 ko? em cần làm mạch điều khiển robot nên cần tốc dộ xử lý cao.
Giúp em với.
Thanks các bác!

huuducel
29-06-2010, 06:01 PM
Mấy pro ơi, mình đang làm đề tài dùng input capture của con Pic6f887 để đọc tín hiệu của cái remote. Mày mò lập trình mãi mà nó không chạy. Hôm nay post lên để anh em cùng mổ xẻ xem nó bị sai chỗ nào.
Đoạn code của em như sau:

#include<stdlib.h>
#include<htc.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);
__CONFIG(BORV21);
#define _XTAL_FREQ 4000000

bit Overflow;
unsigned char Pulse_cycle;
bit CaptureRise;
bit CaptureFall;
bit CaptureComplete;
unsigned int PulseCycle;
unsigned int temp;
unsigned int val;
const char ErrorCycle = 8;
char i;
char buf[10];
void Interrupts_isr() // handler for TMR1 and CCP1
{
if(CCP1IF = 1) CCP1IF = 0;
if(CaptureRise = 1)
{
TMR1ON = 1;
CCP1IE = 0;
CCP1CON = 0x04; // Capture mode Falling
CCP1IF = 0;
CCP1IE = 1;
CaptureRise = 0;
CaptureFall = 1;
}
else if(CaptureFall = 1)
{
TMR1ON = 0;
CaptureComplete = 1;
PulseCycle = CCPR1L;
PulseCycle = ((PulseCycle|(CCPR1H<<8)) - ErrorCycle);
}

else if(TMR1IF = 1)
{
TMR1IF = 0;
Overflow = 1;
}
}
void Timer1_init() // Cau hinh Timer1
{
TMR1ON = 0;
TMR1CS = 0; // Clock internal Fosc/4
T1CKPS1 = 0;
T1CKPS0 = 0;
TMR1IE = 1;
}
void CapturePulse()
{
CaptureRise = 1;
CaptureFall = 0;
CaptureComplete = 0;
Overflow = 0;
CCP1IE = 0;// Cam ngat khi chuyen doi
CCP1CON = 0x05; // Captute mode rising
TMR1H = 0;
TMR1L = 0;
TMR1IE = 1;
CCP1IE = 1;
}
void PulseFinish()
{
CCP1IE = 0;
CCP1IF = 1;
TMR1ON = 0;
TMR1IE = 0;
TMR1IF = 0;
}

void Uart_init()
{
BRG16 = 0;
BAUDCTL = BAUDCTL & 0xF7;
TXSTA = 0x24; //Che do high-speed, cho phep phat du lieu
RCSTA = 0x90; //Nhan du lieu lien tuc, dung cac chan TX/RX
//baud rate = Fosc / (16*(n+1))
//n = Fosc/((baud rate)*16) - 1
SPBRG = 25; //Gia tri ung voi baud rate = 9600, xtal 4 MHz
//SPBRGH khong can dung den
while (CaptureComplete = 1);
val = PulseCycle;
for (i = 0; i < 10; i++) buf[i] = 0;
//Chuyen doi tu unsigned char sang ky tu ASCII
utoa(buf, val, 10);

i = 0;
while (buf[i] != 0) {
TXREG = buf[i];
i++;
while (TRMT == 0);
}
TXREG = '\n';
while (TRMT == 0);
TXREG = '\r';
for (i = 0; i < 10; i++) __delay_ms(100);
}

void main (void)
{
Uart_init();
Timer1_init();
TRISC2 = 1; // Input CCP1
CapturePulse();
while(CaptureComplete ==0 & Overflow ==0)
PulseFinish ();
if(Overflow == 1) // If co tran len 1 thi xuat gia tri ra man hinh
Uart_init();
}

hoangvinhlong
09-11-2010, 09:32 PM
có bác nào có mạch điều khiển tốc độ động cơ thuận nghịch, nhanh chậm dùng pic 16f887 không cho em xin với để tham khảo
email: nguyenbatrung2688@gmail.com
em xin cám ơn!

quocthaitn
26-11-2010, 01:47 PM
em đang làm về điêu khiển thuận nghịch động cơ 1 chiều sử dùng 2 mạch vòng phản hồi âm tốc độ và âm dòng điện sử dụng các bộ pid số.ai có mạch phần này cho em xin để tham khao với
email của em la :nguyenquocthai1804@gmail.com
mọi người ai làm rồi hoặc có tài liều thì cho em vơi nhé!em xin chân thành cảm ơn

ham hoc
16-01-2011, 10:05 PM
chào các bác!em mới bắt đầu làm quen với con PIC 16F877 này. em có bài tập: thiết kế mạch 16 đầu vào và 16 đầu ra số sử dụng con PIC này, mà em chưa biết phải làm thế nào cả. Bác nào biết thì hướng dẫn giúp em với.
gmail của em là :lemung.07@gmail.com
cảm ơn rất nhiều !

ham hoc
16-01-2011, 10:22 PM
sao không thấy ai giúp đỡ vậy.hic
em đang cần gấp sự hướng dẫn của các bác.hic
email của em là : lemung_07@yahoo.com
gmail : lemung.07@gmail.com

hoc_picpicpic
17-01-2011, 03:50 PM
chào các bác!em mới bắt đầu làm quen với con PIC 16F877 này. em có bài tập: thiết kế mạch 16 đầu vào và 16 đầu ra số sử dụng con PIC này, mà em chưa biết phải làm thế nào cả. Bác nào biết thì hướng dẫn giúp em với.
gmail của em là :lemung.07@gmail.com
cảm ơn rất nhiều !

đề tài của bạn như thế này thì ko biết giúp kiểu gì nữa. Bạn nên đặt câu hỏi cụ thể và rõ ràng hơn thì mới có người giúp bạn đc.

ham hoc
17-01-2011, 09:55 PM
vâng.
bài tập của em là: sử dụng pic 16F877 thiết kế PLC 16 đầu vào số và 16 đầu ra số.
các bác biết thì hướng dẫn tóm tắt giúp em xem em phải làm gì với.
thank các bác!

NTL22
18-03-2011, 12:18 PM
đề tài này khoai quá.hi

lexuantien
23-03-2011, 03:28 PM
Các bác cho em hỏi . Em dùng CCS C để lập trình cho con 16F887 , trong chân 1 của 16F887 có ghi ( RE3/MCLR/VPP ) . Mạch reset thì em làm đúng như datasheet hướng dẫn , nạp test thì ổn định chỉ có điều khi reset thì không được dù chân MCLR khi nhấn nút reset có trở về mức 0 . Em muốn hỏi mình phải khai báo trong CCS C như thế nào để cho chế độ reset của 16F887 hoạt động . (Em dùng reset qua chân MCLR )

hangocminh1989
18-04-2011, 05:09 PM
Các bác cho em hỏi . Em dùng CCS C để lập trình cho con 16F887 , trong chân 1 của 16F887 có ghi ( RE3/MCLR/VPP ) . Mạch reset thì em làm đúng như datasheet hướng dẫn , nạp test thì ổn định chỉ có điều khi reset thì không được dù chân MCLR khi nhấn nút reset có trở về mức 0 . Em muốn hỏi mình phải khai báo trong CCS C như thế nào để cho chế độ reset của 16F887 hoạt động . (Em dùng reset qua chân MCLR )

em không biết cái hình này có đủ trả lời cho bác không, nhưng bác cứ coi thử nhé, cái chỗ : master clear is enable

dongduong_spkt
15-05-2011, 10:20 AM
cho mình hỏi với.mình có code viết cho 16f887a không biết liệu có dùng được cho 16f877a không nhỉ? để chuyển sang dùng 16f877a phải chỉnh sử gì trong code hok nhỉ?
đây là code mong mọi người sủa giúp để có thể dùng cho 16f877a


//ccsc pcwhd v8.088
#include <16F887.h>
#define INT_RB 0xFF0B08 //sua o day de cho int co the chay
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device ADC=8
#use delay(clock=20000000)
#use fast_io(B)
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)



//!#include <input.c>

int8 dem_x, dem_y, dem_z;
int8 vi_tri_x, vi_tri_y, vi_tri_z;
int8 du_lieu_b;
int8 gia_tri_adc; // gia_tri_adc
int1 step_x, step_y, step_z;
int1 dir_x, dir_y, dir_z;


BYTE const POSITIONS[4] = {0b0101,
0b1001,
0b1010,
0b0110};

//!BYTE const POSITIONS[8] = {0b0101,
//! 0b0001,
//! 0b1001,
//! 0b1000,
//! 0b1010,
//! 0b0010,
//! 0b0110,
//! 0b0100};
void quay_thuan_x(){
vi_tri_x=(vi_tri_x+1)&(sizeof(POSITIONS)-1);
dem_x = POSITIONS[ vi_tri_x ];
output_bit (PIN_D0, (bit_test (dem_x, 0)));
output_bit (PIN_D1, (bit_test (dem_x, 1)));
output_bit (PIN_D2, (bit_test (dem_x, 2)));
output_bit (PIN_D3, (bit_test (dem_x, 3)));
}
void quay_nguoc_x(){
vi_tri_x=(vi_tri_x-1)&(sizeof(POSITIONS)-1);
dem_x = POSITIONS[ vi_tri_x ];
output_bit (PIN_D0, (bit_test (dem_x, 0)));
output_bit (PIN_D1, (bit_test (dem_x, 1)));
output_bit (PIN_D2, (bit_test (dem_x, 2)));
output_bit (PIN_D3, (bit_test (dem_x, 3)));
}
void quay_thuan_y(){
vi_tri_y=(vi_tri_y+1)&(sizeof(POSITIONS)-1);
dem_y = POSITIONS[ vi_tri_y ];
output_bit (PIN_D4, (bit_test (dem_y, 0)));
output_bit (PIN_D5, (bit_test (dem_y, 1)));
output_bit (PIN_D6, (bit_test (dem_y, 2)));
output_bit (PIN_D7, (bit_test (dem_y, 3)));
}
void quay_nguoc_y(){
vi_tri_y=(vi_tri_y-1)&(sizeof(POSITIONS)-1);
dem_y = POSITIONS[ vi_tri_y ];
output_bit (PIN_D4, (bit_test (dem_y, 0)));
output_bit (PIN_D5, (bit_test (dem_y, 1)));
output_bit (PIN_D6, (bit_test (dem_y, 2)));
output_bit (PIN_D7, (bit_test (dem_y, 3)));
}
void quay_thuan_z(){
vi_tri_z=(vi_tri_z+1)&(sizeof(POSITIONS)-1);
dem_z = POSITIONS[ vi_tri_z ];
output_bit (PIN_A0, (bit_test (dem_z, 0)));
output_bit (PIN_A1, (bit_test (dem_z, 1)));
output_bit (PIN_A2, (bit_test (dem_z, 2)));
output_bit (PIN_A3, (bit_test (dem_z, 3)));
}
void quay_nguoc_z(){
vi_tri_z=(vi_tri_z-1)&(sizeof(POSITIONS)-1);
dem_z = POSITIONS[ vi_tri_z ];
output_bit (PIN_A0, (bit_test (dem_z, 0)));
output_bit (PIN_A1, (bit_test (dem_z, 1)));
output_bit (PIN_A2, (bit_test (dem_z, 2)));
output_bit (PIN_A3, (bit_test (dem_z, 3)));
}


void chuyen_dong_step(){
step_x = bit_test(du_lieu_b,4);
step_y = bit_test(du_lieu_b,5);
step_z = bit_test(du_lieu_b,6);
////////////////////////////////////////
dir_x = bit_test(du_lieu_b,0);
dir_y = bit_test(du_lieu_b,1);
dir_z = bit_test(du_lieu_b,2);
/////////////////////////////////////////
if (step_x ){
// motor x
if(dir_x ){ // neu quay thuan
quay_thuan_x();
}
else{ //quay nguoc
quay_nguoc_x();
}
}
////////////////////////////////////////
if (step_y ){
// motor y
if(dir_y ){ // neu quay thuan
quay_thuan_y();
}
else{ //quay nguoc
quay_nguoc_y();
}
}
////////////////////////////////////////
if (step_z ){
// motor z
if(dir_z ){ // neu quay thuan
quay_thuan_z();
}
else{ //quay nguoc
quay_nguoc_z();
}
}
////////////////////////////////////////
}
#INT_RB
void ngat_RB() { // doc du lieu nhap vao
du_lieu_b = input_b();
chuyen_dong_step();
}

void main() {

enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);// turn on interrupts

set_tris_B (0xff);

// su dung PWM de dieu khien dong vao motor
// han che trong khoang 9A cho 3 motor step ma thoi
setup_adc_ports(sAN5);
setup_adc(ADC_CLOCK_INTERNAL);

setup_timer_2 ( T2_DIV_BY_16, 255, 1);
setup_ccp1 (CCP_PWM);

set_adc_channel(5);



output_low (PIN_D0);
output_high (PIN_D1);
output_low (PIN_D2);
output_high (PIN_D3);

output_low (PIN_D4);
output_high (PIN_D5);
output_low (PIN_D6);
output_high (PIN_D7);

output_low (PIN_A0);
output_high (PIN_A1);
output_low (PIN_A2);
output_high (PIN_A3);

while (TRUE) {
delay_us(40);
gia_tri_adc = read_adc();
//printf("%u",gia_tri_adc);
//delay_us(20);
set_pwm1_duty(gia_tri_adc);
}

}

minhtuando
31-05-2011, 05:39 PM
bạn không cần thay đổi gì nhiều, khai báo lại con pic bạn xài .
thực tế 16f877 và 16f887 không khác nhau nhiều

ToanZ8
07-06-2011, 10:41 AM
code của mình đơn giản chỉ là nhấp nháy con led B0. Chạy trên mô phỏng thì OK, nhưng xuống mạch thì lại không được. Mình đã nối chân PGM của nó qua trở xuống đất rồi. Dùng osscillo đo thì đã thấy dao động trên chân thạch anh. Chẳng hiểu sao lại không được.

Mình dùng con 18f4550 thì OK hết ko hiểu sao làm với con 16f877a này lại ko được. Các cao thủ giúp hộ mình với nhé!

#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=12000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)


void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!
while(true)
{
output_high(PIN_B0);
delay_ms(200);
output_low(PIN_B0);
delay_ms(200);
}

}

tree
08-06-2011, 06:54 PM
các huynh cho đệ hỏi pic 16f877a dùng phần mềm nào để nạp và mạch nạp nào thì hiệu quả nhât.

fly_1304
16-07-2011, 09:06 PM
void chuyen_doi_adc()
{
set_adc_chanel(0);
delay_us(10);
value[0]=read_adc();//doc gia tri dua va chuyen doi gia tri adc do cam bien dua vao
set_adc_chanel(1);
delay_us(10);
value[1]=read_adc();
set_adc_chanel(2);
delay_us(10);
value[2]=read_adc()
set_adc_chanel(3);
delay_us(10);
value[0]=read_adc();
set_adc_chanel(4);
delay_us(10);
value[1]=read_adc();
set_adc_chanel(5);
delay_us(10);
value[2]=read_adc()

for(i=0;i<=5;i++)
{
if(value[i]<580) cb[i]=1;
else if(value[i]>620) cb[i]=0;
}
}
ai giải thích hộ em đoạn code này với

NGUYEN24
26-10-2011, 06:12 PM
các huynh cho đệ hỏi pic 16f877a dùng phần mềm nào để nạp và mạch nạp nào thì hiệu quả nhât.
Bạn này có thể dùng PICKIT2 để nạp, phần mềm thì có thể dùng PICKIT2, hoặc có thể nạp trên MPLAB

holy_ghost
09-12-2011, 11:50 AM
Mình đang làm mạch điều khiển động cơ DC, nhưng khi mô phỏng với Proteus ko chạy. Ai bjt lỗi gì ko? HELP!

Mô phỏng Proteus: http://www.mediafire.com/?tkk2cghepz34vp5


CODE:

#include <16F877A.h>

#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use fast_io(b)
#define tocdo0 0 //toc do bang 0
#define td_macdinh 80 //toc do mac dinh
#define tocdo1 124 //1/5 toc do cuc dai
#define tocdo2 248 //2/5 toc do cuc dai
#define tocdo3 372 //3/5 toc do cuc dai
#define tocdo4 496 //4/5 toc do cuc dai
#define tocdo5 620 //toc do cuc dai
#byte portB =0x06
#bit B0 = portB.0
#bit B1 = portB.1
#bit B2 = portB.2
#bit B3 = portB.3
#bit B4 = portB.4
#bit B5 = portB.5
#bit B6 = portB.6
#bit B7 = portB.7
int16 duty1=0;
int16 duty2=0;
int8 bientocdo=0;
int1 bienthuan=0;
int1 biennghich=0;
void main() //bo PMW1 dk dong o quay thuan
{ //bo PMW2 dk dco quay nghich
set_tris_b(0x0ff); //khoi tao port B la port nhap
setup_ccp1(CCP_PWM); //khoi tao bo PWM1
setup_ccp2(CCP_PWM); //khoi tao bo PWM2
setup_timer_2(T2_div_by_16,154,1); //tao chu ky xung 1ms
//(1/clock)*4*t2div*(period+1)
//(1/10e6)*4*16*(154+1)=1e-3=1ms

set_pwm1_duty(duty1);
set_pwm2_duty(duty2);
//gia tri duty cua PWM duoc tinh theo cong thuc duty1*t2div/clock
//khoi tao duty=0 -> tat dong co
while(true)
{

if (B0 == 1)) //neu nhan phim FO : chay thuan
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
delay_ms(1000); //delay 1s de giam quan tinh dong co
bienthuan=1;
biennghich=0;
goto next;
}
if (!bit_test(portb,2)) //neu nhan phim RE : chay nghich
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
delay_ms(1000); //delay 1s de giam quan tinh dco
bienthuan=0;
biennghich=1;
goto next;
}
if (!bit_test(portb,3)) //nhan phim toc do 1
{
bientocdo=1;
goto next;
}
if (!bit_test(portb,4)) //nhan phim toc do 2
{
bientocdo=2;
goto next;
}
if (!bit_test(portb,5)) //nhan phim toc do 3
{
bientocdo=3;
goto next;
}
if (!bit_test(portb,6)) //nhan phim toc do 4
{
bientocdo=4;
goto next;
}
if (!bit_test(portb,7)) //nhan phim toc do 5

bientocdo=5;
next:

if (!bit_test(portb,0)) //neu nhan phim OFF
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
bienthuan=0;
biennghich=0;
bientocdo=0; //xoa bien toc do
}
if (bienthuan)
{
duty2 = tocdo0;
switch (bientocdo)
{
case 1: duty1= tocdo1;
break;
case 2: duty1= tocdo2;
break;
case 3: duty1= tocdo3;
break;
case 4: duty1= tocdo4;
break;
case 5: duty1= tocdo5;
break;
default : duty1 = td_macdinh;
break;
}
set_pwm1_duty(duty1); //cho dco chay thuan
set_pwm2_duty(duty2);
}

if (biennghich)
{
duty1 = tocdo0;
switch (bientocdo)
{
case 1: duty2= tocdo1;
break;
case 2: duty2= tocdo2;
break;
case 3: duty2= tocdo3;
break;
case 4: duty2= tocdo4;
break;
case 5: duty2= tocdo5;
break;
default : duty2 = td_macdinh;
break;
}
set_pwm1_duty(duty1); //cho dco chay nghich
set_pwm2_duty(duty2);
}
}
}

vuquanghoang
07-02-2012, 02:11 AM
Cho tôi hỏi chút nhé
1.Có thể mua được con 16F887 ở HN ko ? nếu có thì giá khoảng bao nhiêu?
2.Có thể dùng mạch nạp PC1 và PC3 để nạp cho con này ko? nếu ko thì dùng mạch nạp j?

Thank!

1. Bạn ra 17a Hàn thuyên có bán, giá khoảng 65k
2. tớ cũng ko rõ lắm, tớ thì dùng pickit2 giá 240k mua ở hoàng văn thái ý.