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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
X-HUNTER
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср янв 23, 2019 20:18:44

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

Сообщение 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 байт.


Раньше думал, компилятор оптимизирует код и разницы быть не должно. А оно вон как…
Контроллер прошил, все работает. Нет ли тут подводных камней?
Реклама
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

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

Сообщение otest »

на АСМе ещё можеш сократить.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18637
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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);
возможно, мой пример не подходит под ваши цели, но он показывает направление движения в правильную сторону
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

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

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

Вернуться в «Разные вопросы по МК»