![]() |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Jan 2007
Bài gửi: 12
: |
![]() Trong Pic16f877a có 3 timer :
+ Timer0 : 8 bit + Timer1 : 16 bit + Timer2 : 8 bit Timer dùng cho nhiều ứng dụng : định thời, capture, pwm, ... 1.Timer0 Thanh ghi tác động: Các lệnh: Code: setup_TIMER_0(mode); setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT() set_TIMER0(value); // hay set_RTCC(value) :xác định giá trị ban đầu (8bit) cho Timer0 get_TIMER0(); // hay get_RTCC() :trả về số nguyên (8bit) của Timer0 Trong đó mode là một hoặc hai constant (nếu dùng hai thì chèn dấu "|"ở giữa) được định nghĩa trong file 16F877A.h gồm : RTCC_INTERNAL : chọn xung clock nội RTCC_EXT_L_TO_H : chọn bit cạnh lên trên chân RA4 RTCC_EXT_H_TO_L : chọn bit cạnh xuống trên chân RA4 RTCC_DIV_2 :chia prescaler 1:2 RTCC_DIV_4 1:4 RTCC_DIV_8 1:8 RTCC_DIV_16 1:16 RTCC_DIV_32 1:32 RTCC_DIV_64 1:64 RTCC_DIV_128 1:128 RTCC_DIV_256 1:256 rtcc_state là một trong những constant sau: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L 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 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx Em thật sự không hiểu câu này:" (nếu dùng hai thì chèn dấu "|"ở giữa) " anh NHH có thể minh họa cho em được không? em mới tìm hiểu về Pic được một tuần, nhưng chắc chắn là anh chỉ rõ hơn thì em sẽ hiểu! cảm ơn anh và chúc anh vui! |
![]() |
![]() |
#2 | |
Đệ tử 9 túi
|
Trích:
Code:
setup_timer_0(CC_INTERNAL|RTCC_DIV_2);
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
![]() |
![]() |
#3 |
Đệ tử 1 túi
Tham gia ngày: Jan 2007
Bài gửi: 12
: |
![]() xin lỗi vì Em không biết cách trích dẫn bài viết vào câu hỏi của em nên "copy" từ bài của anh NHH qua, nếu rãnh anh chỉ em luôn cách trích dẫn luôn nha!
|
![]() |
![]() |
#4 |
Đệ tử 1 túi
Tham gia ngày: Jan 2007
Bài gửi: 12
: |
Các Anh có thể giúp Thắng tải được trình biên dịch CCSC 3.242 không? Thắng tải hoài không được! chúc Các Anh vui khỏe!
|
![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: Jan 2007
Bài gửi: 12
: |
Luồng này sao ế quá vậy! mình xui quá!
|
![]() |
![]() |
#6 |
Đệ tử 3 túi
Tham gia ngày: Aug 2006
Bài gửi: 55
: |
Bạn vào đây http://kho.tailieuvietnam.net (hoặc click chuột vào góc phải phía trên đấy).
|
![]() |
![]() |
#7 |
Đệ tử 1 túi
Tham gia ngày: Jan 2007
Bài gửi: 12
: |
Cảm ơn bạn Hanspkt! mình cũng là dân spkt
|
![]() |
![]() |
#8 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 7
: |
Các bác ơi cho em hỏi, vậy em muốn nhúng một đoạn ASM vào trong 1 function của CCS thì em phải nhúng như thế nào ạ?
thay đổi nội dung bởi: namqn, 09-02-2007 lúc 06:43 PM. |
![]() |
![]() |
#9 | |
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 |
|
![]() |
![]() |
#10 |
Đệ tử 2 túi
Tham gia ngày: Nov 2006
Bài gửi: 27
: |
Chào các anh em trong trang diễn đàn CCSC.
Mình cũng đang rất quan tâm đến mảng này. Thấy mọi người bàn luận khá sôi nổi về các phần ngắt, timer hay giao tiếp LCD... Nhưng sao không thấy ai đề cập về EEPROM vậy? Theo quan điểm của mình thì EEPROM chính là cải tiến đáng kể nhất của PIC (hay AVR) đối với các bậc MC tiền bối như kiểu 8051. Tiện thể cũng xin nêu thêm 1 quan điểm nữa. (Nói chung hơi nhiều quan điểm!!!). Bác NHH nói một số ví dụ về các Timer theo kiểu 'định thời' có tác dụng như tạo một khoảng thời gian (thời gian trễ). Tất nhiên điều đó đúng và có thể đó chỉ là những ví dụ để anh em học hỏi, nhưng "tui" thì hay dùng nó như một "đồng hồ bấm giờ". Tức là nó sẽ bấm giờ cho thằng CPU. Thằng CPU đang làm gì mặc kệ, nhưng khi đến giờ của nó thì CPU phải làm việc của nó... Kiến thức còn nông cạn, mong anh em chỉ giáo thêm!!! À nếu anh em nào hứng thú với món EEPROM thì chúng ta cùng bàn luận nhé. Nếu có thời gian rảnh hơn mình cũng sẽ cố gắng 'Pót' bài về vấn đề này. (Cũng tỏ vẻ bận rộn một tẹo!!!). Thanks to everyone. ____________________ PS: Maybe contact with me at Email: khangcodt@yahoo.com |
![]() |
![]() |
#11 |
PIC Bang chủ
|
Những vấn đề này đã được thảo luận rất nhiều và từ rất lâu rồi bạn ạ.
Tuy vậy, hoạt động của diễn đàn luôn là trao đổi liên tục, để những người mới có thể tham gia thảo luận, các bạn muốn thảo luận chuyên mục, sẽ có thể mở ra mục mới. Đừng viết lẫn lộn trong các luồng. Chúc vui.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
#12 |
Đệ tử 2 túi
Tham gia ngày: Nov 2006
Bài gửi: 27
: |
Hỏi bác NHH (hoặc có cao thủ nào biết thì chỉ bảo giùm):
Khi dùng hàm delay_ms() trong chương trình con ngắt của các Timer (VD như #INT_TIMER1) hình như có vấn đề gì đó. Khi dịch chương trình thì có cảnh báo " Interrupts disabled..." (Theo mình hiểu thì là mọi ngắt khác điều bị cấm) Khi chạy, nếu chương trình chính có chạy thì thời gian gây ngắt (của Timer1) lại khác so với khi không chạy gì. Đây là toàn bộ chương trình: #include<16F877A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=20000000) int i; int16 count; #INT_TIMER1 void lapngat() { count++; if (count==200) while(true) { output_high(PIN_C1); delay_ms(1000); if(!input(PIN_B3)) break; output_low(PIN_C1); delay_ms(1000); } else set_timer1(0); } void main(void) { enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); set_timer1(0); count=0; while(true) if(!input(PIN_B0)) break; while(true) { if(!input(PIN_B1)) while(true) { output_high(PIN_C0); for (i=1;i<=3;i++) delay_ms(1000); output_low(PIN_C0); delay_ms(1000); if(!input(PIN_B2)) break; } } } Thanks to everyone who is interested in. |
![]() |
![]() |
#13 |
Đệ tử 2 túi
Tham gia ngày: Nov 2006
Bài gửi: 27
: |
Đợi lâu quá không thấy ai trả lời ... Đành tự giải đáp vậy (Để nếu anh em nào mắc phải thì lờ mờ cũng có hướng giải quyết).
Sau khi vào trang Web của CCSC để tìm hiểu về vấn đề này mình lĩnh hội được một vài điều như sau: - Thứ nhất, một thiết kế sẽ là không tối ưu nếu trong CTC ngắt lại gọi đến một hàm khác đã được sử dụng trong Main hay hàm khác, đặc biệt là khi bản thân hàm này lại gọi đến hàm khác nữa...(những hàm chứa trong các header thường gọi lẫn nhau như vậy). - Thứ hai nếu sử dụng hàm như nêu trên thì chương trình chạy sẽ không theo đúng ý đồ lập trình (chẳng hạn như trong chương trình mà mình vừa Pót). Điều này xảy ra là do bộ nhớ Stack bị tràn (stack của PIC chỉ có 8 mức) khi gọi hàm chồng chéo (cả hàm Main và CTC ngắt đều gọi...). - Thứ ba bên CCSC khuyên nếu buộc phải gọi hàm như vậy (chẳng hạn như hàm delay_ms như trên) thì hãy khai báo ở cà hàm Main và hàm ngắt ???. Điều này thì mình không rõ vì đã thử nhưng không có hiệu quả. |
![]() |
![]() |
#14 |
Đệ tử 1 túi
Tham gia ngày: May 2006
Bài gửi: 15
: |
Vấn đề của bạn như có thể giải thích một cách dễ hiểu như sau:
Nếu cả 2 hàm đều được gọi trong cả hàm ngắt và hàm main thì sẽ phát sinh ra lỗi. Tại sao lại thế. Các bạn thử suy nghĩ mà xem. khi hàm main đang chạy đến hàm mà nó và hàm ngắt cùng gọi. Nếu không có ngắt xẩy ra cùng thời điểm đó thì không có vấn đề gì cả. nhưng nếu có ngắt thì nó phải lưu các thông số hiện tại và nhảy vào ngắt, và khi nó nhảy ra khỏi ngắt thì các dữ liệu đã lưu sẽ bị chồng lên trong khi thực hiện hàm đó trong ngắt. vậy chương trình sẽ không đúng nữa. Trong Keil C của 89 thì nó chỉ là warning nhưng trong css c thì nó là error. và theo quan điểm của tôi nó phải là một error. |
![]() |
![]() |
#15 |
Đệ tử 1 túi
Tham gia ngày: May 2006
Bài gửi: 15
: |
Nếu bạn muốn dùng 2 cái delay_ms() trong cả ngắt và main thì mình nghĩ không có cách nào đâu. nếu bạn cứ muốn dùng nó thì hãy tạo ra 2 hàm delay_ms1() và delay_ms2() và trong ngắt gọi một hàm và trong main gọi hàm còn lại.
Còn có một cách nữa mình nghĩ nó sẽ pro hơn đấy là. mình xin viết lại một đoạn chương trình của bạn trong: bạn khai báo một biến toàn cục như thế này nhé. //======= int1 bit_timer0_status; #INT_TIMER1 void lapngat() { bit_timer0_status =1; } //=========== // và đưa công việc của bạn muốn thực hiện khi có ngắt vào đây. //=========== void isr_timer0(void) { count++; if (count==200) while(true) { output_high(PIN_C1); delay_ms(1000); if(!input(PIN_B3)) break; output_low(PIN_C1); delay_ms(1000); } //=========== //và trong hàm main bạn phải làm thế này //=========== void main(void) { if(bit_timer0_status) { //có thể cấm ngắt timer0. //gọi hàm thực hiện công việc. isr_timer0(); bit_timer0_status=0; //bật ngắt trở lại } } //ok? |
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |