Свежие обсуждения
Микроконтроллеры

Корректный запуск/остановка таймера

Вот, к примеру, запустить/остановить таймер0 avr-ки можно так (изначально пусть TCCR0=0x00):

TCCR0|=0b00000 001;
TCCR0&=0b00000 000;

или так:

TCCR0=0b00000 001;
TCCR0=0b00000 000;

А вот что корректнее, маскИрование или прямая запись в этом случае и почему?

 

На асме будет, видимо, так:

1. LDS или IN, ORI, STS или OUT
2. LDI, OUT

Думаю, именно для данного примера второй вариант предпочтительнее, поскольку никаких "левых" битов регистр TCCR0 не содержит. Это не TIMSK, к примеру, где в кучу свалены биты от нескольких разных устройств.

 

Да, действительно, скомпилировал в cvavr оба варианта:

1)
IN R30,0x33
ORI R30,1
OUT 0x33,R30

2)
LDI R30,LOW(1)
OUT 0x33,R30

Для других таймеров видимо тоже прямая запись предпочтительней. Вот нет привычки в .asm-листинг смотреть. Думал сначала, что перезаписать весь регистр "длиннее", чем выборочно по битам.

 

Для некоторых регистров это так. Если бы Вы вели речь о регистре порта, я порекомендовал бы в точности наоборот, потому что до них "дотягиваются" команды SBI и CBI, и код, действительно, будет короче.