Trích:
Nguyên văn bởi dark_electron
Hi bác,
Bác có thể cho em một cái ví dụ về quét LED bằng ngắt timer ko? Bác nói sơ sơ về giải thuật cũng được ko cần phải post nguyên chương trình đâu. Em mới tập tễnh vào nghề lập trình PIC nên cũng noob. Cám ơn bác trước.
|
Code cho PIC tôi hay dùng C (CCS Compiler). Quét kiểu timer nó như sau:
main:
- KHởi tạo cho các Port IN/OUT tương ứng
- Khởi tạo Timer(chọn chế độ chạy clock) + ngắt Timer, thời gian timer chạy đến lúc ngắt chính là thời gian Led sáng. ví dụ 2ms
- Khởi tạo các biến
- Cho phép ngắt timer chạy
- main loop: thực hiện các công việc khác theo yêu cầu lập trình
Ngắt timer:
- tắt Led
- Gửi Data của Led kế tiếp
- Cho Led sáng
- Reset timer
- Thoát
Về cơ bản như vậy, còn đây là sample code:
Code:
#int_RTCC
void RTCC_isr()
{
Num_Timer0_INT++;
// Printf("\nINT %d",Num_Timer0_INT);
if (Num_Timer0_INT == 13) // 10*13.1ms ~ 500ms. Update Led
{
disable_interrupts(INT_RTCC);
ClearLed(); // Tat Led
Send_595(led7[DispBuffer[NextLed]]); // Gui data
SelectLed(NextLed);// Cho Led sang
Num_Timer0_INT = 0;
set_timer0(0); // Reset timer
enable_interrupts(INT_RTCC);
}
}
Code:
void main()
{
// Khoi tao In/Out
delay_ms(100);
output_a(0xff);
set_tris_a(0b011110001);
set_tris_b(0x03);
output_low(PIN_B7);
// Setup Analog
setup_adc_ports(sAN0);
setup_adc(ADC_CLOCK_INTERNAL); // ADC_CLOCK_INTERNAL
// Setup Timer
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); // Timer 0, overflow 204uS @ 20MHz
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
// Cho phép ngắt
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while (TRUE)
{
// Chương trình xử lý chính
} // End of While
}// En dof Main