با سلام من یه ساعت با atmega32 ساختم ولی 60 ثانیه به جای اینکه 60 ثانیه باشه در حقیقت 58 ثانیه است و در هر ثانیه 2 ثانیه جلو می افته
فرکانسم و 4 مگا هرتز داخلی گذاشتم تو مد ctc کار می کنه و رجیستر ocr1a=3d08 و با ضریب تقسیم 256.
اولا می خواستم بدونم ممکنه که فرکانس داخلی کم یا زیاد باشه یا نه اگه نه مشکل از کجا می تونه باشه. این هم برنامه
فرکانسم و 4 مگا هرتز داخلی گذاشتم تو مد ctc کار می کنه و رجیستر ocr1a=3d08 و با ضریب تقسیم 256.
اولا می خواستم بدونم ممکنه که فرکانس داخلی کم یا زیاد باشه یا نه اگه نه مشکل از کجا می تونه باشه. این هم برنامه
#include <mega32.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B;
#endasm
unsigned char sec,min,hour;
unsigned char hos[13];
void dis (void){
sprintf(hos,"time=%d:%d:%d",hour,min,sec );
lcd_clear();
lcd_puts(hos);
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
sec++;
if(sec==60){
sec=0;
min++;
if(min==60){
min=0;
hour++;
if(hour==24)hour=0;
}
}
dis();
}
void main (void){
lcd_init(16);
DDRB=0;
PORTB=255;
TCCR1B=0;
OCR1AH=0x3d;
OCR1AL=0x08;
TIMSK=0x10;
TCCR1B=0;
#asm ("sei"
dis();
while(1){
while(PINB.0==0){
delay_ms(200);
TCCR1B=0x0;
min++;
sec=0;
if(min==60)min=0;
dis();
}
while(PINB.1==0){
delay_ms(200);
TCCR1B=0x0;
hour++;
sec=0;
if(hour==24)hour=0;
dis();
}
if((PINB.0&PINB.1)==1){
TCCR1B=0xc;
}
}
}
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B;
#endasm
unsigned char sec,min,hour;
unsigned char hos[13];
void dis (void){
sprintf(hos,"time=%d:%d:%d",hour,min,sec );
lcd_clear();
lcd_puts(hos);
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
sec++;
if(sec==60){
sec=0;
min++;
if(min==60){
min=0;
hour++;
if(hour==24)hour=0;
}
}
dis();
}
void main (void){
lcd_init(16);
DDRB=0;
PORTB=255;
TCCR1B=0;
OCR1AH=0x3d;
OCR1AL=0x08;
TIMSK=0x10;
TCCR1B=0;
#asm ("sei"

dis();
while(1){
while(PINB.0==0){
delay_ms(200);
TCCR1B=0x0;
min++;
sec=0;
if(min==60)min=0;
dis();
}
while(PINB.1==0){
delay_ms(200);
TCCR1B=0x0;
hour++;
sec=0;
if(hour==24)hour=0;
dis();
}
if((PINB.0&PINB.1)==1){
TCCR1B=0xc;
}
}
}
دیدگاه