Luồng này sao ế quá vậy! mình xui quá!
|
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).
|
Cảm ơn bạn Hanspkt! mình cũng là dân spkt
|
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 ạ?
|
Trích:
Thân, |
Trích:
Code:
setup_timer_0(CC_INTERNAL|RTCC_DIV_2); |
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 |
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. |
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. |
Đợ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ả. |
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. |
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? |
Cảm ơn bạn hungnp rất nhiều.
Giải pháp của bạn rất hay, và thực ra sau khi mình tìm hiểu điều này trên chuyên trang của CCSC mình cũng có ý tưởng na ná như vậy. Nhưng nó vẫn có những hạn chế nhất định. Mình sẽ phân tích cho bạn như sau: Giả sử chương trình viết theo cách của bạn, khi nó kiểm tra đến lệnh 'if(bit_timer0_status)' mà chưa xảy ra ngắt thì nó sẽ không thực hiện hàm 'isr_timer0()', qua đó rồi ngắt mới xảy ra thì chương trình lại không test 'if(bit_timer0_status)' và không thực hiện hàm 'isr_timer0()', tức là không có ngắt. Còn nếu trong chương trình mà luôn kiểm tra 'if(bit_timer0_status)' thì đang từ việc sử dụng phương pháp ngắt lại thành ra phương pháp thăm dò ??? Mong bạn có những góp ý thêm. |
À mình cũng muốn nói thêm vấn đề vừa rồi trong CCSC nó cũng chỉ là 'warning' chứ không phải 'error'
|
Kbd
Trích:
Có lẽ tại công lực của em còn non kém nên em đọc cái driver này mãi mà chẳng hiểu nó là cái gì, dùng vào đâu, tác dụng ra sao...??? Mong bác rọi đèn pin khai sáng cho em với. Cảm ơn bác rất nhiều...nhiều!!! |
Múi giờ GMT. Hiện tại là 12:33 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam