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