Софтовые способы установки флагов таймера TC0 ATmega48PA
Додано: 20 лютого 2020 12:51
Мне они неизвестны.
Т.е. способа, который позволял бы из программы командой установить флаги регистра TIFR0, не найдено.
Программный сброс флагов - сколько угодно, несколькими способами.
Ниже приведены способы сброса флагов TIFR0, которые работают в Simulator2 AVR Studio 4.18 Build 716. Установка флагов тыканьем в соответствующие биты регистра перед выполнением команды.
В Simulator (без двойки) все команды из перечисленных ниже (даже те, которые не должны иметь эффекта) сбрасывают все биты регистра. Такой вот невинный баг системы, да.
Т.е. способа, который позволял бы из программы командой установить флаги регистра TIFR0, не найдено.
Программный сброс флагов - сколько угодно, несколькими способами.
Ниже приведены способы сброса флагов TIFR0, которые работают в Simulator2 AVR Studio 4.18 Build 716. Установка флагов тыканьем в соответствующие биты регистра перед выполнением команды.
В Simulator (без двойки) все команды из перечисленных ниже (даже те, которые не должны иметь эффекта) сбрасывают все биты регистра. Такой вот невинный баг системы, да.
Код: Виділити все
#include <avr/io.h>
//! Macro that SUPPOSEDLY SHOULD SET all Timer/counter0 interrupt flags (but it doesn't)
#define SET_ALL_TIMER0_INT_FLAGS_BAD_TRY_1 (TIFR0=0x00)
#define SET_ALL_TIMER0_INT_FLAGS_BAD_TRY_2 (TIFR0=(0<<OCF0B)|(0<<OCF0A)|(0<<TOV0))
#define SET_ALL_TIMER0_INT_FLAGS_BAD_TRY_3 (TIFR0&=~(1<<OCF0B)|(1<<OCF0A)|(1<<TOV0))
//! Macro that CLEARS all Timer/counter0 interrupt flags.
#define CLEAR_ALL_TIMER0_INT_FLAGS_WAY_1 (TIFR0=TIFR0)
//is cleared by writing a logic one to the flag (right way)
#define CLEAR_ALL_TIMER0_INT_FLAGS_WAY_2 (TIFR0=(1<<OCF0B)|(1<<OCF0A)|(1<<TOV0))
#define CLEAR_ALL_TIMER0_INT_FLAGS_WAY_3 (TIFR0|=(1<<OCF0B)|(1<<OCF0A)|(1<<TOV0))
#define CLEAR_ALL_TIMER0_INT_FLAGS_WAY_4 (TIFR0=0xFF)
#define CLEAR_OCF0B_TIMER0_INT_FLAG_TRY_1 (TIFR0|=(1<<OCF0B))
#define CLEAR_OCF0B_TIMER0_INT_FLAG_TRY_2 (TIFR0=(1<<OCF0B))
int main (void)
{
SET_ALL_TIMER0_INT_FLAGS_BAD_TRY_1;//(TIFR0=0x00), no effect
SET_ALL_TIMER0_INT_FLAGS_BAD_TRY_2;//(TIFR0=(0<<OCF0B)|(0<<OCF0A)|(0<<TOV0)), no effect
SET_ALL_TIMER0_INT_FLAGS_BAD_TRY_3;//(TIFR0&=~(1<<OCF0B)|(1<<OCF0A)|(1<<TOV0)), no effect
CLEAR_ALL_TIMER0_INT_FLAGS_WAY_1;//(TIFR0=TIFR0), for perverts, but it works!!!
CLEAR_ALL_TIMER0_INT_FLAGS_WAY_2;//(TIFR0=(1<<OCF0B)|(1<<OCF0A)|(1<<TOV0)), ok (right way)
CLEAR_ALL_TIMER0_INT_FLAGS_WAY_3;//(TIFR0|=(1<<OCF0B)|(1<<OCF0A)|(1<<TOV0)), ok
CLEAR_ALL_TIMER0_INT_FLAGS_WAY_4;//(TIFR0=0xFF), ок (right way)
CLEAR_OCF0B_TIMER0_INT_FLAG_TRY_1;//(TIFR0|=(1<<OCF0B)), ok
CLEAR_OCF0B_TIMER0_INT_FLAG_TRY_2;//(TIFR0=(1<<OCF0B)), ok
CLEAR_OCF0B_TIMER0_INT_FLAG_TRY_2;
while(1)
{ }
}