PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 11-03-2009, 12:49 AM   #151
lexuantien
Đệ tử 2 túi
 
Tham gia ngày: Feb 2009
Nơi Cư Ngụ: Qui Nhon - Binh Dinh
Bài gửi: 37
:
Send a message via Yahoo to lexuantien
Em có đoạn Code , cho led sáng tuần tự trên PORTB .Em không hiểu RTCC_DIV_
2 (chia prescaler 1:2) là gì ? Nó có tác dụng như thế nào trong Time0 , cũng như trong quá trình ngắt của đoạn Code trên.



Code:
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(2);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(2);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;

while(true)
{
PORTB = a;
}
}

thay đổi nội dung bởi: lexuantien, 11-03-2009 lúc 01:09 AM.
lexuantien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-03-2009, 02:26 AM   #152
mocdailam
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 18
:
Send a message via ICQ to mocdailam
Mình nhớ không nhầm thì RTCC_DIV_2 để xác định tần số sử dụng của cái TIMER0 so với tần số gốc. có thể dùng thêm RTCC_DIV_4, ..RTCC_DIV_256
mọi việc thực hiên ngắt như bình thường
với việc cho LED sáng tuần tự ở port B bạn nên dùng cái delay, rotate_right (address, bytes) ... còn nhiều cách đơn giản mà, không cần dùng TIMER
mocdailam vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-03-2009, 01:57 AM   #153
lexuantien
Đệ tử 2 túi
 
Tham gia ngày: Feb 2009
Nơi Cư Ngụ: Qui Nhon - Binh Dinh
Bài gửi: 37
:
Send a message via Yahoo to lexuantien
Mình đựợc biết là RTCC_DIV_2 cứ hai chu kì xung thì nó đếm một lần không biết phải không ? Mình cũng đã cho chạy thử với RTCC_DIV_4 thì thấy khi tới LED thứ 8 thì đợi thời gian lâu hơn gấp đôi rồi với quay trở lại LED đầu tiên (so với RTCC_DIV_2) . Như bạn nói là để xác định tần số sử dụng của TIMER0 so với tần số gốc bạn có thể nói rõ hơn không?

cảm ơn!
lexuantien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-04-2009, 03:32 PM   #154
hathuc
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 4
:
chương trình thay đổi trễ

xin chào mọi người. mình có một đoạn chương trình viết cho PIC6F877a thực hiện quá trình thay đổi thời gian trễ dựa vào các phím MENU,TANG,GIAM,OK trên các chân RB0,RB1,RB2,RB3,RB4 nhưng viết chương trình và dịch ra file .hex nhưng khi nạp vào thì chương trình lại không chạy các lệnh thủ tục bên trong nó mà chỉ chạy được duy nhất một lệnh bên ngoài. Nếu ai đã từng làm về chương trình loại này thì giúp đỡ mình với. Cảm ơn nhiều. sau đây là toàn bộ chương trình
File Kèm Theo
File Type: rar chuong trinh doc tre.rar (19.2 KB, 55 lần tải)

thay đổi nội dung bởi: hathuc, 12-04-2009 lúc 07:09 PM. Lý do: chưa gửi file
hathuc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2009, 11:31 PM   #155
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
Câu lệnh #use fast_io(b) mang ý nghĩa gì vậy ?
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-04-2009, 03:06 PM   #156
hathuc
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 4
:
Câu lệnh #use fast_io(b) để dùng cho việc thực thi các lệnh vào ra trên PortB
Ví dụ như câu lệnh set_tris_b(0b11110000); muốn thực thi được thì phải khai báo như trên trước.
hathuc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-04-2009, 12:25 AM   #157
ga_dientu
Nhập môn đệ tử
 
Tham gia ngày: Dec 2008
Bài gửi: 7
:
giúp em cái này

em có đoạn code chương trình dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ sô1 nhu sau:

Code:
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\
						0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};
                  // ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_ext
void ngat_RB0()
{
int i;
   if(i<9)
      {
      portd=digital[i];
      ++i;
      }
   if(i==9)
      {
      i=0;
      }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
   {
}
cho em hoi khai báo portd=0b00111111 để làm gì ,

thay đổi nội dung bởi: namqn, 10-04-2009 lúc 12:29 AM. Lý do: định dạng code
ga_dientu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-04-2009, 12:31 AM   #158
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi ga_dientu View Post
em có đoạn code chương trình dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ sô1 nhu sau:

Code:
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\
						0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};
                  // ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_ext
void ngat_RB0()
{
int i;
   if(i<9)
      {
      portd=digital[i];
      ++i;
      }
   if(i==9)
      {
      i=0;
      }
}
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
   {
}
cho em hoi khai báo portd=0b00111111 để làm gì ,
portd = 00b00111111 là một phép gán chứ không phải khai báo. Không có sơ đồ mạch thì khó mà phân tích được phép gán này dùng để làm gì trong chương trình trên.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-04-2009, 10:19 PM   #159
ga_dientu
Nhập môn đệ tử
 
Tham gia ngày: Dec 2008
Bài gửi: 7
:
Smile

mấy bác giải thích dùm
Hình Kèm Theo
File Type: gif dem1_9dungngatngoai.gif (10.8 KB, 365 lần tải)
ga_dientu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-04-2009, 10:56 PM   #160
ga_dientu
Nhập môn đệ tử
 
Tham gia ngày: Dec 2008
Bài gửi: 7
:
hehe, em hieu vi sao roi,thank các bác nhiu
ga_dientu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-04-2009, 11:22 AM   #161
vietanh
Đệ tử 1 túi
 
Tham gia ngày: Dec 2005
Bài gửi: 20
:
minh up lại hai phiên bản cho css 74 va 84 bạn nào không tải được pm vn2005_00@yahoo.com mình send cho ok mọi người lưu y trình bẻ khóa tụi nó toan gắn mã đôc trước khi cài đặt nên tắt kết nôi với mạng ,sau khi bẻ khóa ok quét virut 1 lần ok rui mới cho kết nối nhé

http://rapidshare.com/files/12706092...WHD_v4.074.rar

http://rapidshare.com/files/222279847/CCS4.083.rar
vietanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 07:00 PM   #162
tinhgiac_vp
Đệ tử 2 túi
 
Tham gia ngày: Oct 2007
Bài gửi: 42
:
các bác cho em hỏi làm cách nào để biết được chiều dài của một chuỗi số nguyên 16bit, em khai bao int16 dist[] = {675,786,789,567].nhưng hàm strlen() chỉ trả về giá trị 1, do nó làm việc với chuỗi 8 bit.Mong các bác chỉ giúp em.
tinhgiac_vp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 07:18 PM   #163
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tinhgiac_vp View Post
các bác cho em hỏi làm cách nào để biết được chiều dài của một chuỗi số nguyên 16bit, em khai bao int16 dist[] = {675,786,789,567].nhưng hàm strlen() chỉ trả về giá trị 1, do nó làm việc với chuỗi 8 bit.Mong các bác chỉ giúp em.
Hàm strlen() được dùng cho chuỗi (là kiểu tương đương với mảng char), làm sao áp dụng cho mảng int16 của bạn được.

Bạn nên cho biết mục đích cụ thể, từ đó người khác sẽ có thể góp ý cho bạn cách xây dựng kiểu dữ liệu phù hợp với mục đích cụ thể đó.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 08:24 PM   #164
tinhgiac_vp
Đệ tử 2 túi
 
Tham gia ngày: Oct 2007
Bài gửi: 42
:
em muốn gửi 10 giá trị int16 lên PC. Muốn đưa 10 giá trị đó vào 1 chuoi đê viết chương trình cho gọn, không phải viết từng dòng để gửi lên PC mà chỉ cần dùng vòng lặp. Rõ ràng vấn đề không có gì khi em biết mảng đó có 10 giá trị, nhưng trong trường hợp chúng ta không biết mảng đó có bao nhiêu giá trị thì làm thế nào? Em cũng biết là hàm strlen() không trả về giá trị chiều dài trong trường hợp này. Không biết có cách nào xác định chiều dài mảng này không?
tinhgiac_vp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 09:16 PM   #165
mabubeo22
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 3
:
Trích:
Nguyên văn bởi lexuantien View Post
Em có đoạn Code , cho led sáng tuần tự trên PORTB .Em không hiểu RTCC_DIV_
2 (chia prescaler 1:2) là gì ? Nó có tác dụng như thế nào trong Time0 , cũng như trong quá trình ngắt của đoạn Code trên.



Code:
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(2);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(2);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;

while(true)
{
PORTB = a;
}
}

mình cũng mới tìm hiểu về PIC và có xem qua đoạn mắc này giống bạn, đây là câu trả lời đầy đủ của anh ntc, bạn xem xong sẽ hiểu:

rtcc_state là một trong những constant sau:

RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
Mỗi Timer đều có 2 tác dụng:

Tác dụng định thời: Timer sẽ dựa vào các xung tạo ra bởi bộ dao động (thạch anh, dao động RC, ...) cung cấp cho vi điều khiển để đếm. Và dựa vào tần số bộ dao động, giá trị các bộ chia tần số và giá trị của Timer, ta có thể xác định được thời gian thực. Như vậy trong trường hợp muốn Timer hoạt động ở chế độ định thời, ta phải khai báo rtcc_state là "RTCC_INTERNAL" (xử dụng tần số dao động nội).

Tác dụng đếm: Timer sẽ dựa vào các xung lấy từ môi trường bên ngoài để đếm. Tùy theo Timer mà ta sử dụng chân lấy xung tương ứng (Timer 0 là chân RA4, Timer1 là chân RC0). Các xung này có tác dụng phản ánh các hiện tượng trong thực tế, và việc đếm các xung cũng đồng nghĩa với việc đếm các hiện tượng đó. Và để linh động hơn trong quá trình xử lí, Timer còn cho phép chọn cạnh tác động lên bộ đếm (chế độ này chỉ có ở Timer 0). Như vậy muốn Timer hoạt động ở chế độ đếm, ta phải khai báo rtcc_state là một trong 2 trường hợp còn lại (sử dụng dao động ngoài).


Trích:
ps_state là một trong những constant sau:

RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS
Ở đây có đến 2 hàm dùng để ấn định tỉ số chia của prescaler, một hàm là "RTCC_DIV_...", một hàm là "WDT_ ...". Đó là bởi vì Timer 0 và WDT dùng chung bộ chia tần số. Khi bộ chia được Timer 0 sử dụng thì WDT không đựoc hỗ trợ với bộ chia này nữa. Như vậy sự khác biệt về thao tác giữa 2 hàm này có thể là như sau:

Hàm "RTCC_DIV_..." : cho phép Timer 0 sử dụng bộ chia tần số, không cho phép WDT sử dụng và ấn định tỉ số chia của nó.

Hàm "WDT_ ..." : cho phép WDT 0 sử dụng bộ chia tần số, không cho phép Timer 0 sử dụng và ấn định tỉ số chia của nó.
mabubeo22 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 09:25 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam