Софтовые способы установки флагов таймера TC0 ATmega48PA

Відповісти
nix
Site Admin
Повідомлень: 541
З нами з: 05 червня 2019 12:36

Софтовые способы установки флагов таймера TC0 ATmega48PA

Повідомлення nix »

Мне они неизвестны.
Т.е. способа, который позволял бы из программы командой установить флаги регистра 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)
{ }
}
TIFR0_clear.zip
(10.01 Кіб) Завантажено 293 разів
Питайте свої відповіді
Відповісти

Повернутись до “Електронні компоненти”