Цитата(andreichk @ Apr 18 2008, 02:24)

Всё , выбор пал на ПИК18Ф4685, он уже впаян и загружен. Процедуры восстановлены до состояния , указанного сенсеем Ильёй. теперь спектр выглядит значительно красивее, так как имеет бОльшее кол-во отсчётов.

Вери Гуд )
Цитата
Проц имеет 3.5 кб ОЗУ и 96 кб ROM. Появилось много свободного места для дальшейших эксперементов. Я думаю, что этот ПИК вполне подходит для такого любительского проекта, а более совершенные процессоры оставим для будущих поколений.Пока достаточно того, что уже несколько пользователей И-нета изьявили желание повторить и развивать этот проект.Лично я считаю это своей маленькой победой над злобными и жадными буржуями.
Поздравляю
Цитата
Теперь по делу, как вы считаете,эти самые оконные функции нужны или в принципе можно обойтись без них?
Эффект частокола- Если синусоидальный сигнал имеет целое число периодов во временной области, спектр мощности такого сигнала, полученный с прямоугольным окном, будет иметь острый пик, в точности соответствующий исходной синусоидальной волне по амплитуде и частоте. В остальных случаях спектральный пик, полученный с прямоугольным окном, будет ниже и шире.
Наивысшая точка спектра может оказаться на 3,92 дБ (в 1,57 раз) ниже, если частота исходного сигнала находится посередине между двумя дискретными частотами. Эта вариация амплитуды спектральных составляющих носит название эффекта частокола (соответствующие потери на ослабление называются гребешковыми потерями).
Все оконные функции в той или иной мере компенсируют эти потери, но наилучшая компенсация достигается с плоским окном.
Цитата
настало время вернуться к нашим баранам, то есть кнопкам.В связи с увелечением кол-ва последних, было замечено, что работать они стали с заметными тормозами, это в первую очередь касается тех кнопок, которые посылают хитрый код в ПИК.
Мне тут на дружественном форуме предлагали на простеньком ПИКе типа 16Ф84 смастерить кнопочный шифратор и по ISP гнать с него код в главный ПИК.Как вам такая идея? Мне не очень, я всё ж таки хочу ПЛИСку использовать для этого дела.
Безусловно, раз уже есть ПЛИСка то нефиг сюда прикручивать никакие дополнительные пики...
Я бы вам все-таки предложил изменить алгоритм передачи кода нажатой клавиши.
Осатвляем те же 2 линии: линия Разрешения (будет функционировать также как и сейчас)
линия данных
А Код нажатых клавиш передавать в виде 16ти битов. каждый из которых будет означать:
0 - клавиша с номером этого бита не нажата
1 - клавиша с номером этого бита нажата в данный момент
Кодировать биты можно кучей разных способов. Т.к. нету дополнительной линии синхронизации то желательно конечно использовать самосинхронизирующийся код (модуляция с возвращением к нулю, или например манчестерская модуляция). Но т.к. передается всего 2 байта, а плиска и пик тактируются от одного генератора, то можно сделать гораздо проще.
Пусть PR будет означать период сигналаПусть Key будет хранить код состояния всех клавиш:unsigned int16 Key
Алгоритм следующий:
1. При переходе линии разрешение из 0 в единицу, происходит прерывание.
Вы заходите в прерывание и стартуете таймер (перед стартом в таймере уже должно лежать значение
0xFFFF-PR/2)
2. далее ждете флага переполнения таймера:
while(TMRxIF==0);, где x - номер таймера.
как только происходит переполнение ложите в таймер новое значение
TMRx=0xFFFF-PRочищаете флаг
TMRxIF=0;3. опрашиваете линию данных, сдвигаете влево код клавиши, что-то типа такого:
if (Data) Key|=1;
Key<<=1;4. повторяете пункты 2-3 16 раз.
5. останавливаете таймер. ложите в него значение
0xFFFF-PR/2 (для следующего вход в прерывание)
6. выходите из прерывания.
Таким образом у вас в переменной key будет храниться последнее состояние всех клавиш.
Для проверки нажата ли клавиши делаем просто:
Код
#define Key1 0x0001
#define Key2 0x0002
#define Key3 0x0004
................................
#define Key16 0x8000
if (Key&Key1){ // проверка нажата ли клавиша №1
....
}else if(Key&Key2){ // проверка нажата ли клавиша №2
....
}
...
Все просто!
При таком алгоритме, за один раз у вас передастся все состояние клавиатуры. Код будет работать очень быстро