Страница 1 из 1

Программирование регистров Attiny 13

Добавлено: Пн фев 04, 2019 20:22:59
X-HUNTER
Приветствую.
Сейчас заметил что если в регистры писать прямые значения то код занимает меньше места.

Переписал таким образом:

Код: Выделить всё

 // WDTCR  = _BV(WDTIE); 
 // WDTCR |= (1<<WDP3 )|(0<<WDP2 )|(0<<WDP1)|(1<<WDP0); // prescale timer to 8s so we can measure current  
 // WDTCR |= (1<<WDTIE);                                // Enable watchdog timer interrupts

 
  WDTCR = 0x61; // так меньше код

//--------------------------

 //DDRB = 0xFF; // порт B на выход
 //DDRB &= ~_BV(zMISO); // на ввод
 //DDRB &= ~_BV(zTEMP); // на ввод
 //DDRB &= ~_BV(zBATT); // на ввод

  DDRB = 0xE6; // так меньше код

//--------------------------

 //ADCSRA  =  _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // Prescaler to 128 --> F_CPU / 128
 //ADCSRA |= _BV(ADSC);  

 ADCSRA = 0xC7; // так меньше код


//--------------------------
 //TIMSK0 &= ~(1<<TOIE0); 

 TIMSK0=0x00;  // так меньше код

Уже освободилось порядка 30 байт.


Раньше думал, компилятор оптимизирует код и разницы быть не должно. А оно вон как…
Контроллер прошил, все работает. Нет ли тут подводных камней?

Re: Программирование регистров Attiny 13

Добавлено: Пн фев 04, 2019 22:37:43
otest
на АСМе ещё можеш сократить.

Re: Программирование регистров Attiny 13

Добавлено: Вт фев 05, 2019 06:48:24
ARV
X-HUNTER писал(а):Раньше думал, компилятор оптимизирует код и разницы быть не должно. А оно вон как…
компилятор оптимизирует код, но регистры МК (в частности, ваши DDR и т.п.) описаны, как volatile-переменные, а volatile - это значит неоптимизируемые.
X-HUNTER писал(а): WDTCR = 0x61; // так меньше код
меньше, но, скажем так - не комильфо запись. более правильно записать как-то так:

Код: Выделить всё

WDTCR = _BV(WDTIE) | _BV(WDP3 ) | _BV(WDP0);
а совсем идеально - использовать модуль avr/wdt.h и применять готовые функции и макросы, например, так:

Код: Выделить всё

#include <avr/wdt.h>

wdt_enable(WDTO_30MS);
возможно, мой пример не подходит под ваши цели, но он показывает направление движения в правильную сторону

Re: Программирование регистров Attiny 13

Добавлено: Вт фев 05, 2019 08:06:17
pyzhman

Код: Выделить всё

//TIMSK0 &= ~(1<<TOIE0); 

 TIMSK0=0x00;  // так меньше код
но операции не идентичные. Первая строка сбрасывает бит TOIE0, оставляя остальные биты без изменения, а вторая строка обнуляет весь регистр.