Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пн фев 04, 2019 20:22:59

Приветствую.
Сейчас заметил что если в регистры писать прямые значения то код занимает меньше места.

Переписал таким образом:
Код:
 // 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

на АСМе ещё можеш сократить.

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

Вт фев 05, 2019 06:48:24

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

Код:
//TIMSK0 &= ~(1<<TOIE0);

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

но операции не идентичные. Первая строка сбрасывает бит TOIE0, оставляя остальные биты без изменения, а вторая строка обнуляет весь регистр.
Ответить