Engin писал(а):
1. линия 502 SUBLW .7 - почему от 7 отнимаем Volume? т.е. почему 7 и почему отнимаем? Т.е., если 7 или больше - задаём 5?
Значит ли это, что звук имеет позиции от 0 до 7?
Volume - громкость, имеет значение от 0 до 7 (что видно при работе с прибором). Значение хранится в EEPROM, при считывании проверяем, находится ли считанное значение в диапазоне 0..7, если нет - присваиваем значение 5 ("стандартная" громкость). Т.е., вычитание 7 - часть проверки. Меньше 0 число и так быть не может.
Engin писал(а):
2. линия 521 ADDLW .255 -.15
линия 522 ADDLW .15 - .1 + .1 - значит прибавляем 240, а потом отнимаем 15? (дело в том, что я с такой инструкцией встречаюсь впервые)Нельзя ли объяснить? Пожалуйста. И тоже с мощностью импульса.
Это тоже проверки попадания в диапазон.
Если для Ada-подобных языков (например, Paskal) это выглядит так:
Код:
if x in [xmin..xmax] then ...
а для С так:
Код:
if ((x >= xmin) && (x <= xmax)) ...
то в ASM'е можно записать
Код:
movfw x
addlw .255 - xmax
addlw xmax - xmin + 1
btfsc STATUS, C
goto in_range
Engin писал(а):
3. линия 2694 CalcOnInterval: и далее до RETURN - если математически, какая тут формула?
Мощность импульса прямо пропорциональна "площади" импульса. Формула самая примитивная - время накачки обратно пропорционально напряжению питания. Т.е., было у нас время 100 uS и питание 12 вольт, стало питание 10 вольт - время должно быть увеличено до 120 uS. В версиях по 1.6 включительно результат ещё умножается на уровень "желаемой" мощности от 0,4 до 2 (т.е., от 40% до 200%). В версиях 1.7x это убрано, т.к. мощность можно увеличить скачком в 2 раза за счёт частоты импульсов, а не времени накачки. Там эта функция выглядит так:
Код:
//****************************************************
// Вычисление длительности импульса "накачки"
//****************************************************
unsigned char CalcOnInterval(void)
{
return(12000 / Upow);
}
//****************************************************