Собрал контроллер на МК 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 сек, но разброс заметно больше.
Подскажите пожалуйста, что не так ?