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)

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


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