Вообще, повыпиливал из прошивки сиплюсплюснутость. После изучения этой прошивки, я больше никогда не буду тем, кем был. Теперь я видел все
Угадайте что это?
- Код: Выделить всё
// Readings have been collected into all three of nearData, farData, and offData.
// We are looking for a pullup resistor of no more than 75K on the output to indicate that we should use a digital output.
digitalOutput = offData_sum + nearData_sum + farData_sum >= (3600UL * cyclesAveragedIR * 1024UL * 3)/(75000UL + 3600UL);
Да, это тест пина, есть подтяжка или нет
Т.е. подключены 3 (ТРИ) фильтра скользящего среднего для определения резистора на входе пина, при этом в прерываниях делается постоянный опрос бита разрешения (только ради этого прикола). Потом данные сравниваются с эпичным числом "(3600UL * cyclesAveragedIR * 1024UL * 3)/(75000UL + 3600UL)" и после этого принимается решение - а есть ли резистор на входе пина?
Само прерывание - в лучших традициях c++ со структурами и методами, что приводит вот к такому сохранению контекста:
- Код: Выделить всё
40: 1f 92 push r1
42: 0f 92 push r0
44: 0f b6 in r0, 0x3f ; 63
46: 0f 92 push r0
48: 11 24 eor r1, r1
4a: 2f 93 push r18
4c: 3f 93 push r19
4e: 4f 93 push r20
50: 5f 93 push r21
52: 6f 93 push r22
54: 7f 93 push r23
56: 8f 93 push r24
58: 9f 93 push r25
5a: af 93 push r26
5c: bf 93 push r27
5e: ef 93 push r30
60: ff 93 push r31
И соотв. к такому же восстановлению контекста. Т.е. если в таком прерывании больше ничего не делать то это 117кгц. А еще в прерывании есть ожидалка
- Код: Выделить всё
while (TCNT0 < 3 * 8) {} // delay a little until the ADC s/h has taken effect. 3 ADC clocks should be enough, and 1 ADC clock is 8 timer 0 clocks.
Которая, кста, не делает того что подумал автор.
А еще, и еще, а потом, и к этому, а после, и в конце
Все, я спать...