سلام
این ساعتی که با تایمر 1 و مد ctc و تقسیم فرکانسی 256 (فرکانس میکرو 8 میگ هستش) نوشتم احساس میکنم 1 ثانیه ای که تولید میکنه از 1 ثانیه واقعی کمتره :angry:
نظرتون چیه کجاش مشکل داره؟
(هر کلاک تایمر 32 میکرو ثانیه طول میکشه.....لذا برا تولید 1 ثانیه نیاز به 31250 کلاک داریم لذا من OCR1A رو برابر 31249 قرار دادم که این ریجستر تو مد CTC تاپ_TOP_ رو تعیین میکنه)
[code=c]#include <mega16.h>
#include <stdlib.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
int Second=0, Minute=59, Hour=23;
char Str_Second[1],Str_Minute[1],Str_Hour[1];
interrupt[TIM1_COMPA] void Timer_Counter1_compa()
{
Second++;
if(Second==60){Second=0; Minute++;}
if(Minute==60){Minute=0; Hour++;}
if(Hour==24){Hour=0;}
itoa(Hour,Str_Hour);
lcd_gotoxy(4,1);
if(Hour<10)lcd_puts("0"
;
lcd_puts(Str_Hour);
lcd_gotoxy(6,1); lcd_putchar(':'
;
//////////////////////////////////
itoa(Minute,Str_Minute);
lcd_gotoxy(7,1);
if(Minute<10)lcd_puts("0"
;
lcd_puts(Str_Minute);
lcd_gotoxy(9,1); lcd_putchar(':'
;
//////////////////////////////////
itoa(Second,Str_Second);
lcd_gotoxy(10,1);
if(Second<10)lcd_puts("0"
;
lcd_puts(Str_Second);
}
void main(void)
{
// TIMER1
// Clock Timer1 = CLK/256 >>>>> CS10 = 0, CS11 = 0, CS12 = 1
// Mode = CTC >>>>> WGM10 = 0, WGM11 = 0, WGM12 = 1, WGM13 = 0
// Timer/Counter Output Compare A Match Interrupt Enable >>>>> OCIE1A = 1
TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10);
TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
//TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0 );
//TCNT1L = 0X00; TCNT1H = 0X00;
//OCR1AL = 0X00; OCR1AH = 0X00;
//OCR1BL = 0X00; OCR1BH = 0X00;
TCNT1 = 0;
OCR1A = 31249;
lcd_init(16);
#asm("sei"
lcd_gotoxy(0,0);lcd_puts("DMF313.IR Timer"
;
while(1){};
}[/code]
این ساعتی که با تایمر 1 و مد ctc و تقسیم فرکانسی 256 (فرکانس میکرو 8 میگ هستش) نوشتم احساس میکنم 1 ثانیه ای که تولید میکنه از 1 ثانیه واقعی کمتره :angry:
نظرتون چیه کجاش مشکل داره؟
(هر کلاک تایمر 32 میکرو ثانیه طول میکشه.....لذا برا تولید 1 ثانیه نیاز به 31250 کلاک داریم لذا من OCR1A رو برابر 31249 قرار دادم که این ریجستر تو مد CTC تاپ_TOP_ رو تعیین میکنه)
[code=c]#include <mega16.h>
#include <stdlib.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
int Second=0, Minute=59, Hour=23;
char Str_Second[1],Str_Minute[1],Str_Hour[1];
interrupt[TIM1_COMPA] void Timer_Counter1_compa()
{
Second++;
if(Second==60){Second=0; Minute++;}
if(Minute==60){Minute=0; Hour++;}
if(Hour==24){Hour=0;}
itoa(Hour,Str_Hour);
lcd_gotoxy(4,1);
if(Hour<10)lcd_puts("0"

lcd_puts(Str_Hour);
lcd_gotoxy(6,1); lcd_putchar(':'

//////////////////////////////////
itoa(Minute,Str_Minute);
lcd_gotoxy(7,1);
if(Minute<10)lcd_puts("0"

lcd_puts(Str_Minute);
lcd_gotoxy(9,1); lcd_putchar(':'

//////////////////////////////////
itoa(Second,Str_Second);
lcd_gotoxy(10,1);
if(Second<10)lcd_puts("0"

lcd_puts(Str_Second);
}
void main(void)
{
// TIMER1
// Clock Timer1 = CLK/256 >>>>> CS10 = 0, CS11 = 0, CS12 = 1
// Mode = CTC >>>>> WGM10 = 0, WGM11 = 0, WGM12 = 1, WGM13 = 0
// Timer/Counter Output Compare A Match Interrupt Enable >>>>> OCIE1A = 1
TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10);
TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
//TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1) | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0 );
//TCNT1L = 0X00; TCNT1H = 0X00;
//OCR1AL = 0X00; OCR1AH = 0X00;
//OCR1BL = 0X00; OCR1BH = 0X00;
TCNT1 = 0;
OCR1A = 31249;
lcd_init(16);
#asm("sei"

lcd_gotoxy(0,0);lcd_puts("DMF313.IR Timer"

while(1){};
}[/code]
دیدگاه