Mình cần sử dụng 2 timer 8 bit là timer0 và timer2 trong atmega8 để thực hiện băm xung. Với at89 thì có 1 đoạn code rất hay dùng 2 timer:
..
Tức là 1 timer cho xuất mức logic 0, timer kia xuất mức 1. Khi ngắt tràn timer này chính là lúc bắt đầu khởi tạo timer kia...cứ thế sẽ điều được xung để xuất ra. Cái này dùng cho led sáng dần, mờ dần rất hay.
_ Tuy nhiên khi mình áp dụng với ATMEGA8 thì chưa biết cách biến đổi như thế nào.
Đây là code mình định làm cho con led mờ mờ (thời gian xuất 1 =1/3 thời gian xuất 0)
......
Khi building thì không có lỗi nhưng lắp mạch thì không thực hiện được.
Mọi người xem giúp mình nhé.
p/s: Mục đích là muốn điều xung trên tất cả các PORT dùng 2 timer0 và timer2
Code:
#include <regx51.h>
unsigned int code mang_t0[]={0,2000,4000,6000,8000,10000,12000,14000,16000,18000,20000};
unsigned int code mang_t1[]={20000,18000,16000,14000,12000,10000,8000,6000,4000,2000,0};
unsigned char count_s;
unsigned char count;
void T0_ISR();
void T1_ISR();
void init();
void main() {
init();
while(1);
}
void init() {
count=0;//10 cap do
count_s=0;
TMOD=0x11;//timer 0, 1 che do 1 16 bit
P1=0xff;
TR0=1;
TF0=1;//ngat luon
EA=1;
ET0=1;
ET1=1;
}
void T0_ISR() interrupt TF0_VECTOR {
TR0=0;
TH1=(0xffff-mang_t1[count])>>8;
TL1=(0xffff-mang_t1[count])&0xff;
//P1=mp[count];
P1=0xff;
TR1=1;
}
void T1_ISR() interrupt TF1_VECTOR {
TR1=0;
TH0=(0xffff-mang_t0[count])>>8;
TL0=(0xffff-mang_t0[count])&0xff;
++count_s;
if(count_s==5) {
count_s=0;
++count;
if(count==11) {
count=0;
}
}
P1=0x00;
TR0=1;
}
Tức là 1 timer cho xuất mức logic 0, timer kia xuất mức 1. Khi ngắt tràn timer này chính là lúc bắt đầu khởi tạo timer kia...cứ thế sẽ điều được xung để xuất ra. Cái này dùng cho led sáng dần, mờ dần rất hay.
_ Tuy nhiên khi mình áp dụng với ATMEGA8 thì chưa biết cách biến đổi như thế nào.
Đây là code mình định làm cho con led mờ mờ (thời gian xuất 1 =1/3 thời gian xuất 0)
Code:
#include <mega8.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCCR2 = 0x05;
TCNT2 = 0X10;
PORTD = 0Xff;
}
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{ TCNT0 = 0XAA;
PORTD = 0X00;
}
// Declare your global variables here
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x05; // thực hiện chia tần cho 1024
TCNT0=0x01;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x41; // cho phép ngắt trên timer0 và timer2
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
}
}
Khi building thì không có lỗi nhưng lắp mạch thì không thực hiện được.
Mọi người xem giúp mình nhé.
p/s: Mục đích là muốn điều xung trên tất cả các PORT dùng 2 timer0 và timer2
