All streams
Search
Write a publication
Pull to refresh
21
0

Программист

Send message
Спасибо за заметку, для себя я так не комментирую, все сделано для легкой адаптации кода в проектах тех, кто нуждается в подобных алгоритмах и хочет не просто использовать, а разобраться в методе и быть может, переписать код более компактно или более быстро, ведь оптимизация — как звездное небо: сегодня звезда кода горит, а завтра потухла и вместо нее зажглась новая — более яркая.
Насколько я понимаю, здесь:

  TCCR0A = 1 << WGM01; // compare mode
  TCCR0B = 1 << CS00; // prescaler 1
  OCR0A = 75; //115200 baudrate at prescaler 1

говорится следующее:
Таймер настроен на совпадение со значением в регистре OCR0A, на частоте 9.6 МГц.
Тогда если выбрать предделитель на 8:
TCCR0B = 1 << CS01; // prescaler 8

Получим частоту 14400.
Теперь чтобы добиться меньшей частоты, необходимо увеличить задержку, через увеличение регистра сравнения:
OCR0A = 75, тогда 14400/75=192, 14400-9600=4800, 4800/192=25.
Получается такой код:
  TCCR0A = 1 << WGM01 ;// compare mode
  TCCR0B = 1 << CS01; // prescaler 8
  OCR0A = 100; //9600 baudrate at prescaler 8

Это отлично, но судя по этому:
	if(StartTime > EndTime)	{
		CalcTime = (86400 - StartTime) + EndTime;
	}

И Вашим словам:
Включает бойлер на 2 часа в 5 часов вечера и 5 утра.

Где из этого:
	int StartTime= (StartH*3600)+(StartM*60)+StartS;
	int EndTime= (EndH*3600)+(EndM*60)+EndS;

Следует, что 17*3600=61200 = (int)-28443, а 86400 = (int) -20865
После чего Вы полученные значения преобразуете в отрицательные часы, минуты и секунды,
а потом вызываете вывод их на дисплей, честно говоря — не знаю как себя поведет весь остальной код.
ЗЫ: возможно в переводе на единицу ошибся, тем не менее, попробуйте проверить тут.
сплю почти, не успел: INT — знаковый -32767...+32767
То есть ошибка, скорей всего — погрешности Ваших вычислений времени.
Используйте другие типы для этих переменных.
Ну и советы выше — не навредят.
А теперь прикиньте, какая разрядность у Ваших операций, где Вы используете int (16bit max=65535)
Месяцами не обязательно, у автора включен делитель таймера на 1024, можно ускорить.
Не нравится мне вот этот момент:
	int CalcTime;
	if(StartTime > EndTime)
	{
		CalcTime = (86400 - StartTime) + EndTime;
	}
	else
	{
		CalcTime = EndTime - StartTime;
	}

Ради интереса написал, отличается от стандартного, как я и говорил ниже, на пару слов, и как Вы сказали — cli и sei
Максимум для первого и третьего режима получилось 85666 Гц, с учетом сдвига маски через перенос (3 слова). Но и это — уже перебор.
Нападки? Да Ви пг'осто себя пе'геоцениваете :)
Бесспорно, но это не мигать светодиодами :)
Сказанное в статье на эту тему, было попыткой не отталкивать новичков.
Прироста производительности — тоже.
Давайте обойдемся без подобных заявлений, Вы только что обозначились как не читавший статью.
При отрицательном сдвиг не выполняется, да читайте Вы код в конце концов:
00000023  LSL     R24		        Logical Shift Left 
00000024  ROL     R25		        Rotate Left Through Carry 
00000025  DEC     R18		        Decrement 
00000026  BRPL    PC-0x03	        Branch if plus 
00000027  MOV     R14,R24	        Copy register
Это код не из проекта, это пример.
Про линейку вкурсе :)
эээм, опять запутался, но сдвиг не выполняется тогда :)
Так вот же доказательство:
0000001B  LDI     R16,0x00		Load immediate 
0000001C  MOV     R18,R16    		Copy register 
0000001D  LDI     R24,0x01		Load immediate 
0000001E  ADD     R24,R16		Add without carry 
0000001F  MOV     R16,R24	        Copy register 
в первом варианте:
ISR (TIM0_COMPA_vect, ISR_NOBLOCK)
+2 байта кода,
во втором:
ISR (TIM0_COMPA_vect, ISR_NAKED)
-4
Вот пример:

volatile uint8_t* current_mask; 
current_mask = (uint8_t *)0x0A; current_mask[0]=0; // R10 
current_mask[1]=0b001;current_mask[2]=0b011;current_mask[3]=0b010;current_mask[4]=0b110;current_mask[5]=0b100;current_mask[6]=0b101;


Массив в регистрах с R10 по R16
1. У тини нет CTC, таймер сбрасывается в начале и в конце каждой фазы.
2. Доступ к ПЗУ медленнее чем к регистрам и к SRAM, а чтение из массива раздувает код.

Information

Rating
Does not participate
Location
Россия
Registered
Activity