Собрал контроллер на МК atmega48 схема внизу.
Прошил программу эту:
- Код: Выделить всё • Развернуть
- #include <mega48.h>
 unsigned long int timen = 0;//повышаю разрешение таймера
 // Timer 2 output compare interrupt service routine
 interrupt [TIM2_COMPA] void timer2_compa_isr(void)
 {
 timen++;
 }
 main() {
 unsigned char sw = 0;
 // Crystal Oscillator division factor: 1
 #pragma optsize-
 CLKPR=0x80;
 CLKPR=0x00;
 #ifdef _OPTIMIZE_SIZE_
 #pragma optsize+
 #endif
 DDRC=0b111000;//
 PORTC.2 = 1;//
 DDRD=0b11111100;//
 // Timer/Counter 2 initialization
 // Clock source: System Clock
 // Clock value: 31,250 kHz
 // Mode: CTC top=OCR0A
 // OC2A output: Disconnected
 // OC2B output: Disconnected
 ASSR=0x00;
 TCCR2A=0x02;
 TCCR2B=0x05;
 TCNT2=0x00;
 OCR2A = 15;//1000 Гц
 OCR2B=0x00;
 // Timer/Counter 2 Interrupt(s) initialization
 TIMSK2=0x02;
 // Global enable interrupts
 #asm("sei")
 while(1)
 {
 if(timen > 20000) {PORTC.5++; timen = 0;}
 if(PINC.2 == 0 && timen > 50) {PORTC.4++; timen = 0;}
 }
Внизу фотка Фусе битов.
Считал делители по формуле ДШ на мега48
Формула: Ф = Фклк/2*N*(1+OCR2A)
Ф - нужная частота, Фклк тактирование таймера.
Поставил отчёт времени по 20 сек и переключение светодиода.
В результате замеров вышло следующее:
1 отчёт) 25 сек
2 отчёт) 42 сек
3 отчёт) 33 сек
Конечно я фиксировал с точностью 1 +-1 сек, но разброс заметно больше.
Подскажите пожалуйста, что не так ?


