Перейти к содержанию
    

SED1335,PIC18F4550 и LCD320x240

Насколько я понял, если теперь применить обратное преобразование Фурье, то можно восстановить и вывести на экран первоначальную форму сигнала?

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

Если это так , то можно считать, что верхняя частота осциллографа поднимается до 40 МГц ?

А вот этого вывода я совсем не понял.... :wacko:

 

 

Насчет предыдущих вопросов: мне пока совсем некогда, даже видео еще не скачал... так что как освобожусь посмотрю поподробнее...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

ну дык никто же не мешает сделать это сразу, хотя бы из любопытства

 

А вот этого вывода я совсем не понял.... :wacko:

Ну как же? Если мы с помощью прямого преобразования сигнала можем нарисовать палку аж до 40 Мгц, то разве после обратного мы не можем нарисовать исходный сигнал этой же частоты, да ещё так, чтобы его можно было разглядеть? :07:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вввиду явной нехватки памяти решил я заменить PIC18F4550 на PIC18F4680. Он тоже 44ногий , но имеет в два раза больше памяти.

А что скажет купечество ? или 8BIT FLASH MCU,18F4685,TQFP44

 

http://www.ixbt.com/staticnews/06/56/99.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вввиду явной нехватки памяти решил я заменить PIC18F4550 на PIC18F4680. Он тоже 44ногий , но имеет в два раза больше памяти.

А что скажет купечество ? или 8BIT FLASH MCU,18F4685,TQFP44

 

http://www.ixbt.com/staticnews/06/56/99.html

Тогда уж лучше на 24 серию переходить. Тот же 24FJ64GA004 - 64 кило флеша, 8 кило оперативы, 16 мипсов, да и разрядность больше, вычисления соответственно значительно быстрее будут производится. Опять же периферия побогаче, ну и цена - тут 18я серия в пролете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

даташит бы на него почитать

если это они, то мне это не подходит

http://www.mercateo.com/kw/pic24fj64ga004/...4fj64ga004.html

1. кол-во ног не соответствует старой печатке

2.тактовая частота у них всего 32 МГц

Не, нихацу ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык а как же, семейство то другое, а развести печатку на те же 44 ноги(ну или больше) ИМХО не проблема.

Насчет частоты - а чем мало 32 Мгц? Мало 16 мипсов, возьмите 24H серию, там 40, только периферия победнее будет,зато DMA есть.

З.Ы. все даташиты обычно берутся у производителя

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну как же? Если мы с помощью прямого преобразования сигнала можем нарисовать палку аж до 40 Мгц, то разве после обратного мы не можем нарисовать исходный сигнал этой же частоты, да ещё так, чтобы его можно было разглядеть?

И что у вас поменялось? Вы можете его нарисовать и так, без всяких преобразований туда обратно....

Вот чем может быть действительно полезно обратное преобразование, так это тем, что можно после прямого сделать цифровую фильтрацию сигнала, а затем уже преобразовывать обратно!

 

Вввиду явной нехватки памяти решил я заменить PIC18F4550 на PIC18F4680. Он тоже 44ногий , но имеет в два раза больше памяти.

А что скажет купечество ? или 8BIT FLASH MCU,18F4685,TQFP44

Под вашу задачу я бы однозначно взял: dsPIC33FJ128GP206. Вот на нем можно реально замутить качественную и скоростную цифровую обработку сигнала! Да и цена подходящая - на trt.ru в розницу за 129 р. отдают: http://trt.ru/Stock.php?Part=300

 

если это они, то мне это не подходит

http://www.mercateo.com/kw/pic24fj64ga004/...4fj64ga004.html

1. кол-во ног не соответствует старой печатке

Если же хотите Pin to Pin совместимость, тогда берите лучше: PIC18F4515 у него RAM почти 4К а цена в 1,5 раза дешевле. (ROM 48K)

 

Если же хотите еще побольше ROM тогда PIC18F4610, у него 64K. Цена тоже ниже вашего.

 

Если еще необходимо наличие EEPROM, тогда PIC18F4620

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Проц имеет 3.5 кб ОЗУ и 96 кб ROM. Появилось много свободного места для дальшейших эксперементов. Я думаю, что этот ПИК вполне подходит для такого любительского проекта, а более совершенные процессоры оставим для будущих поколений.Пока достаточно того, что уже несколько пользователей И-нета изьявили желание повторить и развивать этот проект.Лично я считаю это своей маленькой победой над злобными и жадными буржуями.

Теперь по делу, как вы считаете,эти самые оконные функции нужны или в принципе можно обойтись без них?

Если нет, то настало время вернуться к нашим баранам, то есть кнопкам.Всвязи с увелечением кол-ва последних, было замечено, что работать они стали с заметными тормозами,это в первую очередь касается тех кнопок, которые посылают хитрый код в ПИК.

Мне тут на дружественном форуме предлагали на простеньком ПИКе типа 16Ф84 смастерить кнопочный шифратор и по ISP гнать с него код в главный ПИК.Как вам такая идея? Мне не очень, я всё ж таки хочу ПЛИСку использовать для этого дела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вери Гуд )

Проц имеет 3.5 кб ОЗУ и 96 кб ROM. Появилось много свободного места для дальшейших эксперементов. Я думаю, что этот ПИК вполне подходит для такого любительского проекта, а более совершенные процессоры оставим для будущих поколений.Пока достаточно того, что уже несколько пользователей И-нета изьявили желание повторить и развивать этот проект.Лично я считаю это своей маленькой победой над злобными и жадными буржуями.

Поздравляю :beer:

Теперь по делу, как вы считаете,эти самые оконные функции нужны или в принципе можно обойтись без них?

Эффект частокола- Если синусоидальный сигнал имеет целое число периодов во временной области, спектр мощности такого сигнала, полученный с прямоугольным окном, будет иметь острый пик, в точности соответствующий исходной синусоидальной волне по амплитуде и частоте. В остальных случаях спектральный пик, полученный с прямоугольным окном, будет ниже и шире.

 

Наивысшая точка спектра может оказаться на 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
....
}
...

Все просто!

 

При таком алгоритме, за один раз у вас передастся все состояние клавиатуры. Код будет работать очень быстро

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не уверен, что это правильное оформление кода прерывания, но это всё, что мне удалось вычитать и понять из справки по CSS :05: :crying: :help:

 

setup_timer_1(T1_INTERNAL | T1_DIV_BY_8 );//инициализация таймера1

unsigned int16 Keyy,PR,Data;

#int_timer1
void timer1_isr(void){
char x;
         set_timer1(0xFFFF-PR/2);  //записываем значение в таймер
   for(x=0;x<16;x++){
               
while (get_timer1()==0);//while(TMR1IF==0);//ждём флаг переполнения таймера        
     set_timer1(0xFFFF-PR); //записываем новое значение в таймер
        clear_interrupt(int_timer1);//clears the timer1 interrupt flag//TMR1IF=0;//очищаем флаг            
   if (Data) Keyy|=1;
                 Keyy<<=1;
                }
                 set_timer1(0xFFFF-PR/2);//записываем значение в таймер
}//--------------------------??
//##############################################

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то вы опять немного намудрили.... второе прерывание по таймеру не нужно

 

Блин, я совсем забыл, что у вас порт B уже занят другим, следовательно прерывания по фронту TASTE_EN оргнизовать неудастся, ну ничего, сделаем по другому.

Долго мучался как научить ваш CCS иметь прямой доступ к регистрам, и наконец-то у меня получилось!!!!

Вот бы я этим писателям компилятора :smile3009: !!!! Все приходиться делать через задний проход... :maniac: :twak:

 

Ну да ладно, теперь к делу.

 

Для начала нужно сделать следующие объявления:

unsigned int16 Keyy=0;

#define PR2    (*(unsigned char *) 0x0FCB)
#define T2CON  (*(unsigned char *) 0x0FCA)
#define TMR2   (*(unsigned char *) 0x0FCC)
#define PIR1   (*(unsigned char *) 0x0F9E)
#define T2IF   1
#define T2ON   2
#define PR     100

 

Теперь изменим вашу функцию обработчика прерываний:

 

//Непосредственно обработчик прерываний
#int_timer0
void timer0_isr(void){
  char i;
  set_timer0(0); // TMR0IF=0;// Очистим флаг прерывания
  //...... Этими кнопками изменяем показания SEC/DIV Канал А ....   
  if (input(OUT_A_UP)){
     while(input(OUT_A_UP));div_A++;
  }else if (input(OUT_A_DOWN)){
     while(input(OUT_A_DOWN));div_A--;
  }
  if(div_A>8) div_A=1; 
  if(div_A<1) div_A=8;//ограничиваем div_A от 1 до 8
  //-------Этими кнопками изменяем показания SEC/DIV Канал B ....-------                
  if (input(OUT_B_UP)){
     while(input(OUT_B_UP));div_B++;
  }else if (input(OUT_B_DOWN)){
     while(input(OUT_B_DOWN));div_B--;
  }
  if(div_B>8) div_B=1; 
  if(div_B<1) div_B=8;//ограничиваем div_B от 1 до 8                      
  // Теперь ждем начала передачи и принимаем код клавиши
  if(input(TASTE_EN)){
     while(input(TASTE_EN));//если зашли уже в момент передачи кода кнопки то дождаться окончания передачи
  }
  while(!input(TASTE_EN));//Ждем начала передачи
  bit_set(T2CON,T2ON); //Включим таймер
  Keyy=0;//Занулим перед считыванием
  for(i=0;i<16;i++){
    while(bit_test(PIR1,T2IF));//Ждем флага переполнения
    bit_clear(PIR1,T2IF);// Очистим флаг переполнения
    if (input(Code_Out)) Keyy|=1; //Если клавиши нажата
    Keyy<<=1;//Сдвигаем
  }
  bit_clear(T2CON,T2ON); //Отключим таймер
  set_timer2(PR/2); //Установим начальное значение 
  bit_clear(PIR1,T2IF);// Очистим флаг переполнения
}//--------------------------OK

 

В самом начале программы, перед бесконечным циклом for(;;) нужно сделать следующее:

 

setup_timer_2(T2_DIV_BY_4, PR, 2);// Настроим таймер
bit_clear(T2CON,T2ON); //Отключим таймер
set_timer2(PR/2); //Установим начальное значение

 

Все, что вам осталось сделать это подобрать прескалер, постскалер и регистр переполнения (PR) для таймера 2, чтобы период его переполнения, был равен времени передачи одного бита от плиски.

 

А правильнее всего не подобрать, а расчитать! ;)

 

ЗЫ: Думаю время одного бита <10 мкс вполне реально организовать

ЗЫ ЗЫ: Передача битов должна быть от старшего к младшему, если хотите чтобы Key1 была младшим битом переменной Keyy

или тогда перепешите считывание вот так:

if (input(Code_Out)) Keyy|=0x8000; //Если клавиши нажата

Keyy>>=1;//Сдвигаем

ЗЫ ЗЫ ЗЫ: В основной программе остается только опрашивать переменную Keyy и проверять ее значение, как описано выше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кодировака кнопок ,значит, вот так будет выглядеть?

 

#define Key1    0b0000000000000001//0x0001//1
#define Key2    0b0000000000000010//0x0002//2
#define Key3    0b0000000000000100//0x0004//4
#define Key4    0b0000000000001000//0x0008//8
#define Key5    0b0000000000010000//0x0010//16
#define Key6    0b0000000000100000//0x0020//32
#define Key7    0b0000000001000000//0x0040//64
#define Key8    0b0000000010000000//0x0080//128
#define Key9    0b0000000100000000//0x0100//256
#define Key10   0b0000001000000000//0x0200//512
#define Key11   0b0000010000000000//0x0400//1024
#define Key12   0b0000100000000000//0x0800//2048
#define Key13   0b0001000000000000//0x1000//4096
#define Key14   0b0010000000000000//0x2000//8192
#define Key15   0b0100000000000000//0x4000//16384
#define Key16   0b1000000000000000//0x8000//32768

то есть длительность каждого последующего импулься в два раза больше предыдущего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кодировака кнопок ,значит, вот так будет выглядеть?

 

#define Key1    0b0000000000000001//0x0001//1
#define Key2    0b0000000000000010//0x0002//2
#define Key3    0b0000000000000100//0x0004//4
#define Key4    0b0000000000001000//0x0008//8
#define Key5    0b0000000000010000//0x0010//16
#define Key6    0b0000000000100000//0x0020//32
#define Key7    0b0000000001000000//0x0040//64
#define Key8    0b0000000010000000//0x0080//128
#define Key9    0b0000000100000000//0x0100//256
#define Key10   0b0000001000000000//0x0200//512
#define Key11   0b0000010000000000//0x0400//1024
#define Key12   0b0000100000000000//0x0800//2048
#define Key13   0b0001000000000000//0x1000//4096
#define Key14   0b0010000000000000//0x2000//8192
#define Key15   0b0100000000000000//0x4000//16384
#define Key16   0b1000000000000000//0x8000//32768

Да, именно так

то есть длительность каждого последующего импулься в два раза больше предыдущего?

Нет, длительность каждого импульса одинкова и равна PR (с учетом прескалера и постскалера для TMR2). Иначе работать не будет. Если кнопка с номером текущего импульса нажата, то имульс заполняется +5В. Если не нажата то 0 В.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я тут наверное неправильно выразился- я имел ввиду, что длительность импульса каждой последующей кнопки в два раза больше предыдущей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я тут наверное неправильно выразился- я имел ввиду, что длительность импульса каждой последующей кнопки в два раза больше предыдущей

Нифига не понимаю ваших выводов :07:

 

С чего она в два раза больше предыдущей? если все длительности равны....

 

Сигнал следующий:

 

KEY1 | KEY2 | KEY3 | ... |KEYn |..... | KEY16 |

 

 

все временные интервалы для каждого импульса одинаковые и равны PR. Заполнение интервала либо 0 либо 1 в зависимости от того нажата ли клавиша....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...