Изменение настроек Т0 (таймер0)

Monster
Offline
Зарегистрирован: 18.06.2012
Попытался перепрограммить Т0 с нужным делителем, и написать (или переопределить) свой обработчик переполнения Т0.
В результате компилятор обрыгал ошибками как только в теле обработчика по переполнению появляется какой-то оператор.
ИДЕ - Ардуино 1.0.3. МК - Мега2560 от Ардуино.
Родные настройки таймера0 (в виде micros() и подобного) даром не нужны, но есть острая необходимость в полноценном использовании Т0, если это возможно.
Просьба не предлагать использовать другие таймеры, т.к. они все использованы.
Подскажите, как быть?
maksim
Offline
Зарегистрирован: 12.02.2012

В файле arduino-1.0\hardware\arduino\cores\arduino\wiring.с закомментируйте строки относящиеся к настройке таймера0 ,а именно вот это: 

#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
SIGNAL(TIM0_OVF_vect)
#else
SIGNAL(TIMER0_OVF_vect)
#endif
{
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
		m += 1;
	}

	timer0_fract = f;
	timer0_millis = m;
	timer0_overflow_count++;
}

и в функции void init() это:

	// this needs to be called before setup() or some functions won't
	// work there
	sei();
	
	// on the ATmega168, timer 0 is also used for fast hardware pwm
	// (using phase-correct PWM would mean that timer 0 overflowed half as often
	// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
	sbi(TCCR0A, WGM01);
	sbi(TCCR0A, WGM00);
#endif  

	// set timer 0 prescale factor to 64
#if defined(__AVR_ATmega128__)
	// CPU specific: different values for the ATmega128
	sbi(TCCR0, CS02);
#elif defined(TCCR0) && defined(CS01) && defined(CS00)
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
	sbi(TCCR0B, CS00);
#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
	// this combination is for the __AVR_ATmega645__ series
	sbi(TCCR0A, CS01);
	sbi(TCCR0A, CS00);
#else
	#error Timer 0 prescale factor 64 not set correctly
#endif

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
#else
	#error	Timer 0 overflow interrupt not set correctly
#endif

 

step962
Offline
Зарегистрирован: 23.05.2011

Monster пишет:

Попытался [...]
Родные настройки таймера0 (в виде micros() и подобного) даром не нужны, но есть острая необходимость в полноценном использовании Т0, если это возможно.
[...]
Подскажите, как быть?

Первый вариант:

Переписать wiring.c/wiring.h, выбросив функцию обработки прерывания TIMER0_OVF и все так или иначе связанные с ней функции.

Потом, когда начнут глючить функции из других библиотек, переписать/адаптировать и их.

 

Второй вариант:

Изменить логику своих функций так, чтобы можно было воспользоваться обработчиками прерываний TIMER0_COMPA/TIMER0_COMPB и соответствующим(и) режимом(ами) работы таймера0. В сетвапе переключиться в один из этих режимов.

 

Третий вариант:

Перейти на AVR Studio или иной другой пакет, позволяющий программировать микроконтроллеры AVR и не навязывающий свои представления о прекрасном.

Четвертый и последующие варианты:

х.з.