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 TỪ DỄ TỚi KhÓ (http://www.picvietnam.com/forum/showthread.php?t=238)

phandinh 17-02-2009 04:37 PM

bác namqn ơi
 
Em đang định làm đề tài truyền thông nối tiếp F877 với PC.
8 kênh ADC ( dùng 1 sensor nhiệt độ, còn lại chỉ dùng biến trở) --> RS232--->f877---> màn hình máy tính(dùng VB để viết).
bác cho em hỏi tí:
.Nguồn cho pic em có thể dùng chính nguồn (biến đổi) của cổng COM được không?
.Giao tiếp cổng COM thì vẫn dùng Max 232 như gt với 8051 hả bác?
BÁc chỉ dùm em đường link có liên quan với.
Em đang chuẩn bị thi nên mấy hôm nay ko học được
thanks!

namqn 17-02-2009 05:59 PM

Trích:

Nguyên văn bởi phandinh (Post 22667)
Em đang định làm đề tài truyền thông nối tiếp F877 với PC.
8 kênh ADC ( dùng 1 sensor nhiệt độ, còn lại chỉ dùng biến trở) --> RS232--->f877---> màn hình máy tính(dùng VB để viết).
bác cho em hỏi tí:
.Nguồn cho pic em có thể dùng chính nguồn (biến đổi) của cổng COM được không?
.Giao tiếp cổng COM thì vẫn dùng Max 232 như gt với 8051 hả bác?
BÁc chỉ dùm em đường link có liên quan với.
Em đang chuẩn bị thi nên mấy hôm nay ko học được
thanks!

- Đa số các cổng COM hiện đại có khả năng cấp nguồn rất hạn chế (các cổng này được thiết kế cho mục đích truyền thông, chứ không phải cho mục đích cấp nguồn). Do đó, bạn không nên dùng nguồn từ cổng COM để cấp cho PIC.

- Giao tiếp một vi điều khiển bất kỳ với máy tính đều có thể dùng MAX232 (hoặc một vi mạch tương thích), do đó với PIC bạn vẫn dùng như vậy. Sơ đồ cụ thể còn tùy thuộc vào việc bạn dùng module USART của PIC hay hiện thực bằng phần mềm (bit-banging). Nếu dùng USART của PIC thì nối như sau:
+ Chân TX (PIC) -> T1IN/T2IN (MAX232) -> T1OUT/T2OUT (MAX232) -> chân RD (chân 2) của cổng COM
+ Chân RX (PIC) <- R1OUT/R2OUT (MAX232) <- R1IN/R2IN (MAX232) <- chân TD (chân 3) của cổng COM.

Những chân còn lại của MAX232 được nối như trong datasheet.

Thân,

phandinh 19-02-2009 02:39 AM

bác cho em hỏi:
địa chỉ ngắt f877 là 004h. Nếu mình sử dụng 1 ngắt thì ko vấn đề gì.
Nhưng khi em sử dụng nhiều ngắt , Vậy thì mình phải làm gì
để nó phân biệt được đâu là ngắt ngoài , ngắt timer , counter.... hả bác

xuanhiendk2 19-02-2009 01:50 PM

Các bác ơi sao ko viết bằng C đi!! Em thấy viết bằng C dễ hiểu hơn.

phanhuuhoan 19-02-2009 02:40 PM

chào mọi người !theo em nhận thấy tại sao chúng ta không một dự án nhỏ từ a đến z giống như tụi nước ngoài luôn !Em thấy các cứ post kiểu em thấy xưa cũ quá rồi !nhai đi nhai lại hoài chán lắm !phải có cái gì mới lạ hơn và khó hơn để cùng nhau mổ xẻ !..........

phandinh 19-02-2009 08:25 PM

uh mình cũng thấy viết C thì đơn giản hơn nhiều.
mình đang học cả 2. mình muốn trước tiên phải hiểu
về cấu trúc PIC thật rõ ràng đã nên học ASM.
Muốn học lắm mà ko có nhiều thời gian.

phandinh 19-02-2009 08:29 PM

Trích:

Nguyên văn bởi phanhuuhoan (Post 22740)
chào mọi người !theo em nhận thấy tại sao chúng ta không một dự án nhỏ từ a đến z giống như tụi nước ngoài luôn !Em thấy các cứ post kiểu em thấy xưa cũ quá rồi !nhai đi nhai lại hoài chán lắm !phải có cái gì mới lạ hơn và khó hơn để cùng nhau mổ xẻ !..........

Đây là luồng căn bản về PIC mà bạn. Bạn có thể mở luồng PIC nâng cao .
Quyết định vậy đi. Hẹn bạn ở luồng nâng cao

robinson4u 23-02-2009 06:32 PM

các anh cho em hỏi với.Nếu muốn thêm bộ nhớ ram cho vi điều khiển PIC 16F877A thì làm thế nào nhỉ.em chưa biết sao,các anh giúp em với nhé.

namqn 24-02-2009 12:30 AM

Trích:

Nguyên văn bởi robinson4u (Post 22899)
các anh cho em hỏi với.Nếu muốn thêm bộ nhớ ram cho vi điều khiển PIC 16F877A thì làm thế nào nhỉ.em chưa biết sao,các anh giúp em với nhé.

PIC16F877A (và các vi điều khiển PIC nói chung) không được thiết kế để sử dụng RAM ngoài. Bạn vẫn có thể nối PIC16F877A với RAM ngoài thông qua các port I/O của PIC, nhưng tốc độ truy xuất RAM sẽ không cao hơn tốc độ vào ra dữ liệu của các port I/O này.

Bạn nên cho biết cần thêm bao nhiêu RAM, và tốt hơn nữa thì cho biết vì sao bạn cần bổ sung thêm RAM.

Thân,

lexuantien 24-02-2009 09:05 AM

anh ntc sao a không post bài tiếp đi . E đang theo dõi luồng này , nó rất hay với lại e cũng mới tiềm hiểu con 16f877A thôi. Nên rất cần tài liệu về con này mong a giúp đỡ.

tung_bk02 26-02-2009 03:35 PM

cho em hỏi vấn đề dùng 16f877A để giao tiếp pc qua ethernet, từ đó có thể nối ứng dụng điều khiển đo, hiển thị nhiệt độ, điều khiển tốc độ động cơ...

vtuan274 26-02-2009 04:00 PM

anh nào có thể cho tư liệu về hình ảnh encoder va nguyên lí hoạt động của nó vớ

thienthan611 27-02-2009 07:06 AM

anh ơi anh có thể giúp em thiết kế mạch sử dụng pic 16f877a (tính năng là dùng đề chạy chữ)giúp em lam zoi nha anh ntc,hoac ai làm được chỉ mình với nha.thanks nhiu

electronic 28-02-2009 12:31 AM

Mình mới bắt đầu học Pic. Cũng đọc qua một số tài liệu. Viết xuất I/O cho 1 Led bằng cách khác thì chạy, còn cách này thì không. Mong các anh em chỉ giáo. Biết sai để hiểu hơn. Cảm ơn anh em.

Code:

#include <16F877A.h>
#use delay (clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
int1 x;
void main()
{  while(1)
  {output_bit(pin_B1,!x);
    delay_ms(250);
  }
}


namqn 28-02-2009 01:35 AM

Trích:

Nguyên văn bởi electronic (Post 23082)
Mình mới bắt đầu học Pic. Cũng đọc qua một số tài liệu. Viết xuất I/O cho 1 Led bằng cách khác thì chạy, còn cách này thì không. Mong các anh em chỉ giáo. Biết sai để hiểu hơn. Cảm ơn anh em.

Code:

#include <16F877A.h>
#use delay (clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
int1 x;
void main()
{  while(1)
  {output_bit(pin_B1,!x);
    delay_ms(250);
  }
}


Theo tài liệu hướng dẫn của CCS C, cú pháp của hàm output_bit() như sau: output_bit(pin, value). Tham số pin có thể là biến, nhưng tham số value là hằng số (0 hay 1). Bạn đã dùng một biểu thức có chứa biến cho tham số thứ hai của hàm trong đoạn code của bạn.

Nếu bạn muốn lật trạng thái của chân B1, bạn có thể dùng hàm output_toggle() đã được CCS C cung cấp.

Thân,

electronic 28-02-2009 02:31 AM

Cảm ơn anh namqn nhé. Anh cho em hỏi. Em muốn xoay bit ở 8 led đơn. Code em viết như sau:

#include <16F877A.h>
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=4000000)
void main()
{ int16 i,count;

while(1)
{
count=1;
for (i=0;i<=8;i++)
{
output_A(count);
delay_ms(100);
count=count>>1;
}
}

}
Không hiểu sao chỉ chạy 6 led. Mong anh em chỉ dùm. Có cách nào để lưu 1 giá trị vào 1 thanh ghi rồi cho xoay k anh? Chẳng hạn lưu: b10000000 vào rồi cho rotate sang phải để dịch?

electronic 28-02-2009 02:47 AM

Ah. Mình hiểu rồi. Port A chi có I/O từ RA0-RA5 thôi. Cám ơn anh em.

phandinh 28-02-2009 05:38 PM

bác namqn chỉ cho em cách dùng timer được không?
.khởi tạo
.thiết lập giá trị ban đầu.

electronic 01-03-2009 12:01 AM

Các anh trong dien đàn chỉ em phần này với. Em lập code cho chương trình led sáng dồn, nếu dùng xuất ra portB 0x01,0x02... thì dài quá nên em viết theo 1 kiểu khác. Không hiểu sai chỗ nào mà lại chạy sai, nhờ mấy anh chỉ giúp.

Code:

#include <16F877A.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT, NOWRT
#use delay(clock=20000000)

void main()
{ byte i,led;
  led=0x00;
  while(1)
  { for(i=0; i<=8; i++)
        { led=led+2^i;
          output_B(led);
          delay_ms(200);
        } 
  }
}

Xin cảm ơn.

namqn 01-03-2009 01:24 AM

Trích:

Nguyên văn bởi phandinh (Post 23091)
bác namqn chỉ cho em cách dùng timer được không?
.khởi tạo
.thiết lập giá trị ban đầu.

PIC16F877A có nhiều loại timer, tôi chỉ lấy ví dụ về Timer 1 ở đây. Giả sử tần số xung clock là 4 MHz, có nghĩa là mỗi chu kỳ máy (bao gồm 4 chu kỳ xung clock) sẽ kéo dài 1 us. Lại giả sử cần định thời 100 ms.

Nếu chọn xung clock thực thi lệnh là nguồn xung clock cho Timer 1, thì chúng ta cần đếm đủ 100000 chu kỳ máy (= 100000 us) để định khoảng thời gian 100 ms. Vì bộ đếm của Timer 1 chỉ có độ dài 16-bit, giá trị lớn nhất mà Timer 1 có thể đếm được mà không bị tràn là 65535. Do đó, chúng ta cần giảm tần số xung đi vào Timer 1 để có thể đạt được mục đích. Điều này có thể thực hiện bằng cách sử dụng bộ chia (tần) trước (prescaler). Bộ chia trước của Timer 1 trong PIC16F877A có thể chia 1, 2, 4, hay 8 tần số clock trước khi đưa vào Timer 1. Ở ví dụ này, tôi chọn hệ số chia là 8. Như vậy, số đếm mà Timer 1 sẽ đếm được ứng với 100 ms sẽ là 100000/8 = 12500. Vì Timer 1 chỉ tràn từ 0xFFFF về 0x0000, cần thiết lập trước giá trị của các thanh ghi TMR1H và TMR1L để sẽ tràn trong 12500 lần đếm, tức là giá trị TMR1 = 65536 - 12500 = 53026 = 0xCF2C. Xem thêm hình 6-2 trong datasheet của PIC16F877A để hiểu rõ hơn phần trình bày trên.

Code để thiết lập Timer 1 như sau:
Code:

  T1CON = 0x30;                // Prescale = 1:8, dung clock thuc thi lenh
  TMR1H = 0xCF                // TMR1 = 0xCF2C
  TMR1L = 0x2C
  T1CON = T1CON | 0x01;        // Bat Timer 1

Trong chương trình chính, người dùng có thể xét trạng thái của bit TMR1IF (bit 0 của thanh ghi PIR1) để kiểm tra xem đã hết thời gian cần chờ hay chưa. Người dùng cần xóa bit TMR1IF này sau khi đã sử dụng xong để dùng cho lần định thời tiếp theo.

Một nhắc nhở nhỏ: Bạn nên tránh nêu đích danh người được hỏi, và chú ý là những câu hỏi loại này không phải chỉ có một vài người có thể trả lời.

Thân,

namqn 01-03-2009 10:03 PM

Trích:

Nguyên văn bởi electronic (Post 23096)
Các anh trong dien đàn chỉ em phần này với. Em lập code cho chương trình led sáng dồn, nếu dùng xuất ra portB 0x01,0x02... thì dài quá nên em viết theo 1 kiểu khác. Không hiểu sai chỗ nào mà lại chạy sai, nhờ mấy anh chỉ giúp.

Code:

#include <16F877A.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT, NOWRT
#use delay(clock=20000000)

void main()
{ byte i,led;
  led=0x00;
  while(1)
  { for(i=0; i<=8; i++)
        { led=led+2^i;
          output_B(led);
          delay_ms(200);
        } 
  }
}

Xin cảm ơn.

Bạn thử lại với code sau xem:
Code:

#include <16F877A.h>
#fuses HS,NOWDT,NOPUT,NOPROTECT, NOWRT
#use delay(clock=20000000)

void main()
{ byte i,led;
  led=0x00;
  while(1)
  { for(i=0; i<=8; i++)
        { led = (led << 1) + 1;
          output_B(led);
          delay_ms(200);
        } 
  }
}

Thân,

135246357 02-03-2009 10:30 AM

chào các bác em mới bắt đầu học về vi điều khiển pic nên rất mong bác ntc sớm post bài lên kèm thêm giải thích câu lệnh thì hay quá

135246357 02-03-2009 10:37 AM

ở đây có bác nào biết viết lập trình cho pic bằng ngôn ngữ ccs không?bảo em với có ví dụ minh họa thì tốt quá

lexuantien 02-03-2009 11:42 PM

Bạn vào luồng này :
http://www.picvietnam.com/forum/show...=2113#post2113.
Link download trình biên dịch CCS C ở đây: http://www.tailieuvietnam.net/downlo...CCSC_3.249.rar
Hiện nay đã có phiên bản mới hơn 4.0 rùi đó.
mình cũng mới học về nó thôi , chủ yếu là học trong phần Help của nó đó , có ví dụ rõ ràng lắm.

dhbk3i 03-03-2009 12:09 AM

chào các bạn, mình đang làm đề tài về đo khoảng cách 5-10m kết hợp với vi xử lý, mình đang băn khoăn không biết trọn con cảm biến nào cho phù hợp, mong được sự góp ý từ các bạn, mình xin cảm ơn trước

kiwi 03-03-2009 02:19 AM

Điều khiển tốc độ động cơ từ máy tính?
 
Tôi đã làm được mạch điều khiển tốc độ động cơ DC, sử dụng pwm của 16f877a, tốc độ được điều khiển bằng biến trở thay đổi điện áp đưa vào chân RA1 (dùng chức năng ADC). Bây tôi giờ muốn khi nhập giá trị tốc độ trên máy tính thì tốc độ động cơ sẽ thay đổi theo, vậy phần mạch và phần chương trình phải cần có những gì, mong các bạn giúp đỡ.
(Trình độ diễn đạt hơi kém, các bạn thông cảm nhé)

phandinh 06-03-2009 04:12 PM

anh em cho mình hỏi khi sử dụng Port B để xuất dữ liệu thì có chú ý gì đặc biệt
tới chân RB3 ko? hay chỉ cần thiết lập nó thành chân Output là đủ.( ASM)

phandinh 06-03-2009 04:16 PM

Trích:

Nguyên văn bởi kiwi (Post 23167)
Tôi đã làm được mạch điều khiển tốc độ động cơ DC, sử dụng pwm của 16f877a, tốc độ được điều khiển bằng biến trở thay đổi điện áp đưa vào chân RA1 (dùng chức năng ADC). Bây tôi giờ muốn khi nhập giá trị tốc độ trên máy tính thì tốc độ động cơ sẽ thay đổi theo, vậy phần mạch và phần chương trình phải cần có những gì, mong các bạn giúp đỡ.
(Trình độ diễn đạt hơi kém, các bạn thông cảm nhé)

Bạn xem luồng giao tiếp cổng COM,LPT của pác Ngohoaibac ấy

trananhpro 22-03-2009 09:55 PM

Thắc mắc về PIC16f877 và PIC16F887
 
Mình mới tìm đc một mạch nguyên lý điều khiển 3 động cơ bước dùng PIC16F877 nhưng mình có nhờ một người chuyên điện tử thiết kế lại thì anh đó lại dùng PIC16F887. Mình không biết 2 con đó có giống nhau không. Và xin được hỏi mọi người, trong 2 con đó thì con nào mới hơn, nhiều chức năng hơn. Cảm ơn

phandinh 22-03-2009 11:43 PM

bạn search trên google là ra thôi. như mình thấy thì 2 con chức năng như nhau.
Thường thì xài F877 không à

nhanndt 23-03-2009 10:35 AM

Mình có vấn đề muốn hỏi. khi mình viết xong chương trình trong MPLAB và build nó thì có 1 lỗi liên quan tới _config là "Error[126] E:\DOCUMENTS\HOC KY 8\DA THUC NGHIEM\TEST.ASM 3 : Argument out of range (not a valid config register address)"
Một vấn đề nữa là.Cũng file.asm đó trước đây mình build thì SUCCEEDED. Mà giờ build lại thì bị lỗi trên.Mình thử bỏ phần khai báo config thì build được mà file.hex đó thì lại chạy mô phỏng không được.Mong được chỉ dẫn!

phandinh 23-03-2009 03:50 PM

bạn post bài lên đi

nhanndt 23-03-2009 11:48 PM

cảm ơn! Mình đã chỉnh lại được rồi.Lý do là trong MPLAB mình chưa select device đúng loại PIC.

phudu1088 03-04-2009 11:22 PM

anh ơi anh có mạch lịch vạn niên không anh giúp em với. anh post cho em được không

phudu1088 03-04-2009 11:25 PM

ai có mạch lịch vạn niên không cho mình đi, mình đang làm đồ án.

thanhctdt07 08-04-2009 12:34 PM

help me vói hjx hjx rối quá
 
1 Attachment(s)
các bác ơi xin giúp đở cho em với em mới vào luống này và cảm nhận được sự nhiệt tình của các bác ở đây nhiều lắm !

Em có một vấn đề ở đây rất cần sự giúp đở của các bác!
em mới học môn vxl về viết chương trình cho pic
em tìm được một đề tài về con pic là dùng pic để điều khiển cái CD_ROM
có được đoạn chương trình để chạy no nhưng em muốn viết lại theo ý của mình là dùng các key nút nhấn để điếu khiển nó
trước tiên là dùng các lệnh kiểm tra trục tiếp xem nút nào ở trạng thái được nhấn và xuất dử liệu ra cổng IDE của CD_ROM
VD: kiểm tra thấy trạng thái của nút nhấn play đang ở mưc thấp (đang nhấn) thì phải xuất dữ liệu ra chân số mấy ở cổng IDE của CD_ROM là mức cao hay mức thấp (chẳng hạn như lệnh để cho CD_ROM play thì cần cáu trúc lệnh xuất ra cổng IDE là: IDE1=0,IDE0=1,IDE2=1,IDE3=1,IDE4=0.......)nói chung là cấu trúc ngỏ ra của nó là dạng số nhị phân (xuất ra các port của pic)
đây là các tài liệu mà em tìm được nhưng khi ngâm cứu thì gặp phải quá nhiều khó khăn vì trình độ em còn quá thấp ko thể hiểu hết được cấu trúc lệnh của chương trình mong các bác chỉ bảo thêm cho.vị trí các chân của pic nối với cổng IDE em lấy giống như trong hình vẽ cho dể kiểm tra còn phần chương trình của LCD thì em ko dám đụng tới chỉ làm phấn điều khiển thôi (gà mà hjx hjx)mong các bác tận tình giúp đở cảm ơn rất nhiều!!!!!!!

thanhctdt07 14-04-2009 10:34 AM

hix hix anh em trên diễn đàn đâu hết rùi!!!!!!!!!!!
hix có người tải mà ko có người trả lời kỳ zậy ta??????????

luongnhut 14-04-2009 12:15 PM

cho e hỏi về thạch anh
 
e đang xài thạch anh 20Mhz,2 tụ 33p cho con 16f877a, mạch chay tốt mà không hiểu tại sao khi e lấy tay chạm vào 1 chân thạch anh nối vào chân OSC1/CLK(13) thi mạch bị đứng lại, thả tay ra lại hoạt động binh thường, mấy pác giúp e khắc phục lỗi này của e với

phandinh 14-04-2009 01:23 PM

không chạm vào nữa

laka 16-04-2009 11:40 AM

help me!
 
có bạn nào chỉ giúp mình cách thiết lập interrupt serial port của pic16f877a được không?
cảm ơn nhiều...!


Múi giờ GMT. Hiện tại là 06:12 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam