Говнокод по пятницам. Эпизод 5. Блинк на 9-ом пине

Как-то так:

// Блинк на 9-ом пине (Uno/Nano и т.п.)
%:define	_ *(unsigned*)
void setup(void) { 
	_  36 = _"Vb";
	_ 128 = _"D-";
	_ 136 = _"D+";
}
void loop(void) {}

Скетч родился случайно в процессе разговора с @BABOS, за что ему большое спасибо!

Это даже компилируется.
Будем посмотреть.

Это даже работает, как и всё, что я выкладываю. Киньте светодиод на 9-ый пин и убедитесь. Можно, кстати, в протеусе – без разницы.

Как ни странно, но и по вторникам работает.

А чего странного, если семь пятниц на неделе?

2 лайка

Для вас то ничего. Но для меня в этом коде понятны всего две строки - 3 и 8 ))

Ладно хоть без триграфов, про диграфы то я хоть что то слышал :slight_smile:

Первая загадка разгадана

3 лайка

Осталось разгадать что есть сие:


#define	_ *(unsigned*)
void setup(void) { 
	*(unsigned*)  36 =*(unsigned*)"Vb";
	*(unsigned*) 128 = *(unsigned*)"D-";
*(unsigned*) 136 = *(unsigned*)"D+";
}
void loop(void) {}

Для этого придется в даташит лезть, адреса регистров похоже, осталось понять каких

Зная ЕП, можно предположить, что он первому таймеру в конфиг-регистры напихал напрямую через отображаемую область памяти…

1 лайк

Да а вторую там и гадать нечего, подставляйте
*(36) = оопкоды “Vb” и т.д.
Как это запускается, вот для меня загадка🙄

Точно, вот откуда 9 пин))

Это надо посмотреть, адресами каких регистров являются 36,128 и 136

Сдается мне что это будут DDRx, TCCRx и TIMSKx

Я пробовал :blush:, но IDE “изкаропки” говорит, что триграфы отключены опцией, а менять опции – неспортивно, должно всё работать искаропки!

1 лайк

Так они запрещены “женевской конвенцией”

Только в С’23 а у нас более ранние версии.

Итак:
36(0х24)=DDRB
128(0x80)=TCCR1A
136(0x88)=OCR1AL
Осталось понять, что за хрень скрывается в кавычках.
Но это уже завтра, спать хочется сильней чем разбираться в этих ребусах

Такие: TCCR1A, TCCR1B, OCR1A
Хрень - это битовые последовательности. Причём, в TCCR1A пишется 16 бит, что покрывает и TCCR1B.
D- => 442D => 0100010000101101

Маэстро решил только с младшим байтом поиграться

А ты прям уверен, что он пишет сразу 16 бит туда ?
Я вот нет, по синтаксису не вижу.

uinsigned int - 16 бит, пишется в указатель, приведенный к uint16_t приведённая к нему же “D-” => 442D => 0100010000101101

1 лайк