![]() |
|
|
|
|
#1 |
|
Đệ tử 9 túi
|
Ngắt Timer0
Đây là chương trình dùng ngắt Timer0 định thì 1s.
Đầu tiên led ở chân RB0 sáng, sau 1s sẽ dịch sang trái, nghĩa là led 1 trên chân RB1 sáng , lần lượt như vậy cho các led trên portB và lặp lại mãi mãi. 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(6);
++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(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;
while(true)
{
PORTB = a;
}
}
__________________
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 thay đổi nội dung bởi: nhh, 22-09-2007 lúc 10:37 AM. Lý do: Update |
|
|
|
|
#2 | |
|
Đệ tử 1 túi
Tham gia ngày: Apr 2006
Bài gửi: 16
: |
Một cách viết khác để tham khảo với hy vọng viết C sao cho dễ hiểu :-)
#include <16F877A.h> #fuses NOWDT, PUT, XT, NOPROTECT #use delay(clock=4000000) #define INITIAL_VALUE 6 byte count; byte led; void change_led(void); #int_timer0 void interrupt_timer0() { set_timer0(INITIAL_VALUE); count++; if (count == 2000) { count = 0; change_led(); } } void main() { set_tris_b(0); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER0); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2); // set mod set_timer0(INITIAL_VALUE); // set initial value count = 0; led = 1; while (true) output_b(led); } void change_led() { led = led << 1; if (led == 0) led = 1; } Trích:
|
|
|
|
|
|
#3 |
|
Đệ tử 2 túi
Tham gia ngày: Feb 2006
Bài gửi: 32
: |
Cho hỏi tí
Em mới vô thôi, huynh giải thích mấy dòng code sau cho em được ko ? " set_timer0(6) " ; " ++count; " ; "if (count==2000) " Nó nằm trong ct nháy led dùng interrup và timer0. biến count và a có tác dụng gì ? tại sao phải lùi a "a=a<<1" ? |
|
|
|
|
#4 |
|
Nhập môn đệ tử
Tham gia ngày: Sep 2006
Bài gửi: 7
: |
Ban lam on cho biet cho tim may thu vien cua CCS C, vi du nhu lcd_lib_4bit.h hay def_877a.h. Cam on!
|
|
|
|
|
#5 |
|
Nhập môn đệ tử
|
#include<18F4450.h>
#fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=20000000) #use fast_io(b) #byte portb=0x6 #define led pin_B0 int8 a; void ngat() { delay_ms(1000); a=a<<1; // dich trai a 1bit if(a==256) a=1; } main() { a=1; set_tris_b(0); while(true) { ngat(); output_b(a); } } Cách này thì PIC18F4550 cũng dịch leds vô tư. Nhưng mà muốn dùng TIMER0 như của bác nhh . Khi mình làm không hiểu tại sao lại không thể chạy. Nhờ bác chỉ giáo giùm nhé! #include <18F4550.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=20000000) . Mình đã sửa lại code của nhh như vậy để phù hợp với PIC18F4550, nhưng không hiểu sao vẫn không chạy đơợc. Bạn có thể hướng dẫn kỹ hơn về Interrup và Timer không, cảm on bạn nhiều.
__________________
Già vẫn học. Chọc thì cười. |
|
|
|
|
#6 |
|
Đệ tử 7 túi
|
Úi code của bạn sai rồi nếu muốn sử dụng được ngắt thì trong hàm main bạn phải thực hiện cho phép ngắt timer_0 và ngắt toàn cục (global) hoạt động, định xung nhịp cho timer, và hàm ngắt() phải được đặt ngay bên dưới chỉ thị #int_timer0 để trình dịch có thể hiểu được đây là hàm phục vụ ngắt, hàm ngắt() này bạn không thể gọi đến giống như một hàm thông thường đuợc mà nó chỉ được máy gọi đến khi có xuất hiện cờ tràn timer_0, mà khi đã sử dụng ngắt timer (tức ngắt định thời) thì bạn không nên dùng delay trong nó (rất dở),vì ngắt timer được tạo ra để thay thế hoàn hảo cho delay, code của bạn mình sửa như sau :
#include<18F4450.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) int16 count=0; int8 a=1; #int_timer0 void ngat(){ ++count; if(count==2000) {count=0;a=a<<1;} // dich trai a 1bit if(a==256) {a=1;count=0; }} void main(){ enable_interrupts(global); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //xung timer = xung máy/2 while(true) { output_b(a); }} như vậy ở hàm trên ta sẽ thấy sau mỗi lần tràn ngắt timer_0 (sau hai xung máy) biến đếm count sẽ tăng lên 1 đơn vị và cứ thế cho đến khi đạt giá trị 2000 (đây là giá trị mà bạn cần phải tính để chọn đúng thời gian cần làm làm trễ) khi đó biến a sẽ đuợc dịch bit sang trái,....rồi tiếp tục... chắc khúc này bạn hiểu rồi há.
__________________
_____________________________Tri nhân tri tự bất tri tâm_____________________________ _ _ _ _ _ _ _ _ Yêu mến tất cả anh em Picvietnam.com _ _ _ _ _ _ _ _ . . . . . . . . . . . . . . . . Để post đuợc một câu hỏi rõ ràng xin tham khảo link sau : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . http://www.picvietnam.com/forum/showthread.php?t=1263. . . . . . . . . . . . . . . . |
|
|
|
|
#7 | |
|
Nhập môn đệ tử
|
Pic18f4450
Trích:
__________________
Già vẫn học. Chọc thì cười. |
|
|
|
|
|
#8 | |
|
Đệ tử 2 túi
Tham gia ngày: Jun 2007
Bài gửi: 43
: |
Trích:
Tiếp theo ,về vấn đề thanh ghi pres_scaler ,mình không hiểu chế độ div _2,div_ 4 ảnh hưởng thề nào tới thời gian thực thi mỗi dòng lệnh,timer làm việc ra sao???Mình cũng có đọc chế độ hoạt động và xem block diagram mà chả hiểu gì cả.Mong các bạn giúp đỡ.Chúc vui thay đổi nội dung bởi: cuopbienquin, 22-08-2007 lúc 06:24 PM. |
|
|
|
|
|
#9 |
|
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 1
: |
hỏi về counter
chào các Bác, Em là thành viên mới , rất mong được chào đón. mong các bác chỉ cho Em về cuonter (Em đang làm đề tài mạch đếm sản phẩm ma chưa hiểu gì về cuonter) mong các bác chỉ dùm em .cám ơn các bác nhiều!
__________________
ngoctuan |
|
|
![]() |
|
|
Similar Threads
|
||||
| Ðề 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 |