Вот все необходимое для повторения девайса.
Архив содержит:
1. Прошивка девайса в виде hex файла
2. Схема и плата в формате PCad2006
3. Приложение для конфигурирования
4. Моя текущая конфигурация как пример использования

Назначение элементов интерфейса программы:
1. Кнопки прочитать/сохранить/сравнить в описании не нуждаются )
2. Слева снизу три радиокнопки - ADC, Voltage, Resistance. Они переключают варианты отображения данных в таблице. Рядом с ними три текущих значения, которые раппортует нам устройство.
3. Кнопка "Установить значение" записывает текущее значение из одного из значений слева от нее в активную строку. Записывает только в случае если вся строка выделена. Таким образом можно быстро записать сопротивления всех подключенных кнопок в таблицу.
4. Таблица содержит значения сопротивлений кнопок, и реакцию на нажатие каждой кнопки. Одна строка - одна аналоговая кнопка. Все варианты реакций независимы и могут работать параллельно. Исключение - параллельно не могут работать клавиши стандартной и мультимедийной клавиатур.
Поля таблицы:
- Bank - номер банка кнопок. Есть возможность записывать до трех банков кнопок в устройство. Всего не более 22х кнопок. Переключение между банками - при помощи кнопки, которая назначена как Standard: Switch. Переключение происходит по кольцу.
- ADC_Val/Voltage/Resistance - один из вариантов отображения значения сопротивления кнопки.
- ADC_Diff/Volt Diff/Res_Diff - размер корридора значений. Кнопка считается нажатой, если значение укладывается в диапазон (Resistence - Res_Diff)...(Resistence + Res_Diff).
- Left Ctrl/Left Shift/Left Alt/Left Win/Right Ctrl/Right Shift/Right Alt/Right Win - Данные события будут посланы в комп при нажатии на кнопку.
- Key - Клавиша стандартной клавиатуры, которая будет нажата при нажатии соответствующую аналоговую кнопку.
- mmKey - клавиша мультимедийной клавиатуры, которая будет нажата при нажатии на соответствующую аналоговую кнопку.
- MM Key Repeat - пока не реализовано. В будущем возможно будет автоповтор для мультимедийных клавиш.
- Dac Out1/Dac Volt1/Dac Res1 - управляют первым аналоговым выходом. Принцип такой: по-умолчанию на выходе максимальное напряжение. При нажатии на кнопку на выходе будет выставлено напряжение соответственно таблице. Пересчет в сопротивление идет из расчета, что на приемном конце сопротивление на плюс 4.7к. Рекомендую смотреть на напряжение, а не на сопротивление.
Примечание: т.к. устройство питается от USB через диод шоттки - то максимальное напряжение на выходе будет меньше 5В (примерно 4.85В). Остальные напряжения уменьшатся так же пропорционально. Если не предусматривается питание от внешнего источника питания - рекомендую диод шоттки на входе закоротить.
- Dac Out2/Dac Volt2/Dac Res2 - то же самое, только для второго аналогового канала.
- rcAddr, rcCmd - задает команду для цифрового выхода управления магнитолами Clarion/Alpine. Подробное описание формата
тут, системы команд -
тут.
- PortData/PortInit/PortTrig - управление 8ю бинарными цифровыми выходами. PortInit задает начальное значение на выходах. Так же он задает полярность реакции на PortData. Иными словами - PortData показывает - на какие каналы действует данная кнопка. PortTrig - задает триггерную реакцию на кнопку вместо обычной.
Данный механизм временный, ищу лучшие решения.
Пока сделано так:
Код:
void controlPortKeyPressed( UInt8 portData, UInt8 portInit, UInt8 portTrig )
{
UInt8 port = getPortState();
portInit &= portData; // mask only necessary pins
portTrig &= portData; // mask only necessary pins
releasedPortValue = port ^ portTrig; // this value will be applied when the key will be released
UInt8 set = ( portData ^ portInit ) & ~portTrig;
UInt8 reset = ~( portData & portInit ) | portTrig;
port |= set;
port &= reset;
port ^= portTrig;
setOutputsState( port );
}
Если что-то не понятно - на вопросы постараюсь ответить ).