![]() |
![]() |
#151 |
Đệ tử 2 túi
|
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. |
![]() |
![]() |
![]() |
#152 |
Đệ tử 1 túi
|
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 |
![]() |
![]() |
![]() |
#153 |
Đệ tử 2 túi
|
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! |
![]() |
![]() |
![]() |
#154 |
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
thay đổi nội dung bởi: hathuc, 12-04-2009 lúc 07:09 PM. Lý do: chưa gửi file |
![]() |
![]() |
![]() |
#155 |
Đệ 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 ?
|
![]() |
![]() |
![]() |
#156 |
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. |
![]() |
![]() |
![]() |
#157 |
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) { } thay đổi nội dung bởi: namqn, 10-04-2009 lúc 12:29 AM. Lý do: định dạng code |
![]() |
![]() |
![]() |
#158 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
#159 |
Nhập môn đệ tử
Tham gia ngày: Dec 2008
Bài gửi: 7
: |
![]() mấy bác giải thích dùm
|
![]() |
![]() |
![]() |
#160 |
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
|
![]() |
![]() |
![]() |
#161 |
Đệ 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 |
![]() |
![]() |
![]() |
#162 |
Đệ 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.
|
![]() |
![]() |
![]() |
#163 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
#164 |
Đệ 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?
|
![]() |
![]() |
![]() |
#165 | |
Nhập môn đệ tử
Tham gia ngày: Mar 2009
Bài gửi: 3
: |
Trích:
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ó. |
|
![]() |
![]() |
![]() |
|
|