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

SED1335,PIC18F4550 и LCD320x240

теперь я нифига не понимаю, что я должен с ПЛИСки в ПИК гнать?

такими должны быть импульсы?

Вот, что я имел ввиду:

post-11630-1208701581_thumb.jpg

В данный момент одновременно нажаты клавишы: 2,5,12,16

 

Т.е. за одну посылку передается все состояние клавиатуры.

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


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

Вот, что я имел ввиду:

я так и подозревал, но боялся об этом подумать.

теперь рассказывайте мне , как мне ПЛИСину перерисовать для такого случая. :wacko:

 

зы.попробовал перезагрузить код с обновлённым прерыванием, так вот проц запускается только , если закомментировать строчку // while(bit_test(PIR1,T2IF));//Ждем флага переполнения.

на обоих входах- TASTE_EN и Code_Out лог.0

 

а если при этом нажать любую кнопку, то картинка оживает.

На входе TASTE_EN появляется лог.1, а Code_Out лог.0( я его временно заземлил)

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


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

теперь рассказывайте мне , как мне ПЛИСину перерисовать для такого случая. :wacko:

Тут навеное вам виднее...

 

зы.попробовал перезагрузить код с обновлённым прерыванием, так вот проц запускается только , если закомментировать строчку // while(bit_test(PIR1,T2IF));//Ждем флага переполнения.

на обоих входах- TASTE_EN и Code_Out лог.0

 

а если при этом нажать любую кнопку, то картинка оживает.

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

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


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

Ок, вот такой кнопочник мне предложили запихнуть в ПЛИСку. Я его собрал и проверил.Сигналы соответствуют тому графику , который вы нарисовали.На входе счётчика 156кГц(если надо, то можно выбрать от 80ти МГц и далее делением на 2).

На ножке Taste_EN меандр активная часть 100мкс,пауза тоже 100мкс, а на CODE_OUT короткие импульсы прим. 8мкс. Если одновременно нажать все 16 кнопок, то они как раз умещаются в активную часть Taste_EN, то есть тут , как я полагаю всё правильно.

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

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


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

Ок, вот такой кнопочник мне предложили запихнуть в ПЛИСку. Я его собрал и проверил.Сигналы соответствуют тому графику , который вы нарисовали.На входе счётчика 156кГц(если надо, то можно выбрать от 80ти МГц и далее делением на 2).

На ножке Taste_EN меандр активная часть 100мкс,пауза тоже 100мкс, а на CODE_OUT короткие импульсы прим. 8мкс. Если одновременно нажать все 16 кнопок, то они как раз умещаются в активную часть Taste_EN, то есть тут , как я полагаю всё правильно.

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

Замечательно! Теперь немного посчитаем:

 

Точная длительность одного импульса равна:

 

1/(80000000/512)=6,4 мкс

 

Это означает 64 такта процессора, работающего на частоте 10 Мгц.

 

Для получения такого периода нужно следующим образом настроить таймер2:

#define PR     63
setup_timer_2(0, PR, 0);// Настроим таймер

т.е. Прескалер и постскалер должны быть нулевыми.

 

Насколько я понял, таймер 0 у вас настроен так:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);

Если он в 16-ти битном режиме то получится период примерно в 50 мс. Т.е. в прерывание вы будете заходить 20 раз в секунду. С этой же частотой будет обновляться состояние клавиатуры.

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


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

тут компилятор выдаёт ошибку так как значение(выделено красным ) может быть от 1 до 16

Для получения такого периода нужно следующим образом настроить таймер2:

#define PR 63

setup_timer_2(0, PR, 0);// Настроим таймер

но и это ещё не всё . Как я писал ранее , при наличии в прерывании строки(выделено красным)

for(i=0;i<16;i++){

while(bit_test(PIR1,T2IF));//Ждем флага переполнения

bit_clear(PIR1,T2IF);// Очистим флаг переполнения

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

Key<<=1;//Сдвигаем

}

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

 

Кстати вопрос имею- почему нужно использовать таймер2, а не таймер1 ?

 

И ещё вот это можно откоментировать, для ясности :05:

#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     63

 

Это означает 64 такта процессора, работающего на частоте 10 Мгц.

дык у меня ж 40 МГц

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


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

тут компилятор выдаёт ошибку так как значение(выделено красным ) может быть от 1 до 16

Ясно, значит он хочет значение делителя.

 

Напишите за место этой строчки так:

T2CON=0x00;
PR2=PR;

Просто и, главное сразу все понятно.

 

но и это ещё не всё . Как я писал ранее , при наличии в прерывании строки(выделено красным)

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

Странно. Кстати я ошибочку нашел. Нужно так:

while(!bit_test(PIR1,T2IF));//Ждем флага переполнения.

Попробуйте и отпишитесь. Вообще, по хорошему, нужно поставить запрет прерываний в процедурах работающих с дисплеем.

Кстати вопрос имею- почему нужно использовать таймер2, а не таймер1 ?

Потому что у таймера 1 нету регистра, задающего период (у второго это регистр PR2). Следовательно нельзя на аппаратном уровне задать время его переполнения (только буквально несколько вариантов, зависящих от делителя). Поэтому пришлось бы после каждого переполнения заново задавать начальное значение таймера. Что не очень красиво.

И ещё вот это можно откоментировать, для ясности :05:

#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     63

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

Здесь я собственно прописал адреса нужных мне ригистров, и номера необходимых битов.

дык у меня ж 40 МГц

Я знаю что тактируете вы его сорока мегагерцами. Но при этом производительность будет 10 MIPS, т.к. на выполнение одной команды у пиков 18го семейства уходит 4 такта. (см. даташит)

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


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

Супер !!! :a14: Всё заработало.Кнопки отзываются и очень быстро,только команды не совпадают с нажатием, как-то всё перепутано.Попробую разобраться с этим сам

#int_timer0
  void timer0_isr(void){
  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); //Включим таймер
  Key=0;//Занулим перед считыванием
  for(i=0;i<16;i++){
    while(!bit_test(PIR1,T2IF));//Ждем флага переполнения.
    bit_clear(PIR1,T2IF);// Очистим флаг переполнения
   if (input(Code_Out)) Key|=1; //Если клавиши нажата
    Key<<=1;//Сдвигаем
  }
  bit_clear(T2CON,T2ON); //Отключим таймер
  set_timer2(PR/2); //Установим начальное значение 
  bit_clear(PIR1,T2IF);// Очистим флаг переполнения
}//--------------------------OK
//##########################################

 

Порядок выполнения команд у меня должен быть такой

 

//***************************************************************    
//setup_timer_2(0, PR, 1);//Настроим таймер
T2CON=0x00;
PR2=PR;
bit_clear(T2CON,T2ON);  //Отключим таймер
set_timer1(PR/2);       //Установим начальное значение
//***************************************************************
timer0_isr();//вызываем прерывание на себя
//***************************************************************
for(ever){
         if(Key&Key2)   zeichen(SB,250,sync_volume_B--);//уровень синхронизации В
  else if(Key&Key3)   zeichen(SB,250,sync_volume_B++);//
  else if(Key&Key4)   syncB=1;//синхронизация по фронту B
  else if(Key&Key5)   syncB=0;//синхронизация по спаду B 
  else if(Key&Key6)   zeichen(SA,2,sync_volume_A--);//уровень синхронизации А
  else if(Key&Key7)   zeichen(SA,2,sync_volume_A++);//
  else if(Key&Key8)   syncA=1;//синхронизация по фронту A
  else if(Key&Key9)   syncA=0;//синхронизация по спаду A 
  else if(Key&Key10)  wahl=1;//один луч, канал B
  else if(Key&Key11) { 
                      wahl=2;rect(2, 230,253,237,1,0);
                      text57(33,230,V,1,1);
                      text57(151,230,freqA,1,1);//один луч, канал A
                     }
  else if(Key&Key12)  wahl=3;//два луча
  else if(Key&Key13)  wahl=4;//уходим в спектроанализатор
  //else if(Key&Key14) free;
  //else if(Key&Key15) free;
  //else if(Key&Key16) free;
              
                     //Общий переключатель шкал и показаний
if(wahl==4) {
               S_DIV_A(div_A,271,150);//Показания SEC/DIV Канал А
              Spectr_DIV(div_A,2,230);//Шкала спектроанализатора Канал А
             }
      else  {
             S_DIV_B(div_B,271,90); //Показания SEC/DIV Канал B
             S_DIV_A(div_A,271,150);//Показания SEC/DIV Канал А
            } 
switch(wahl){//Выбираем тип прибора - скоп или спектр
     case 1: {scop_B(205);sbros();}break;// один луч, канал B
     case 2: {res=1;scop_A(205);sbros();}break;// один луч, канал A
     case 3: {//два луча одновременно
              res=0;scop_B(140);// канал B
              scop_A(235);// канал A
              sbros(); 
             } break;
      case 4: spectrum_analizator(); break;//гиперпрыжок в спектроанализатор
           } 
     }
}//--------------------------OK
//####################################################

Но такое впечатление, что он как-будто вывернут наизнанку

 

Ура !!! Всё встало на свои места, после того как переопределил кнопки :a14:

 

//############## КОДИРОВКА КНОПОК #######
#define Key1    0b1000000000000000//
#define Key2    0b0100000000000000//
#define Key3    0b0010000000000000//
#define Key4    0b0001000000000000//
#define Key5    0b0000100000000000//
#define Key6    0b0000010000000000//
#define Key7    0b0000001000000000//
#define Key8    0b0000000100000000//
#define Key9    0b0000000010000000//
#define Key10   0b0000000001000000//
#define Key11   0b0000000000100000//
#define Key12   0b0000000000010000//
#define Key13   0b0000000000001000//
#define Key14   0b0000000000000100//
#define Key15   0b0000000000000010//
#define Key16   0b0000000000000001//

 

Илье очередной :a14: и уважуха :beer:

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


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

Супер !!! :a14: Всё заработало.Кнопки отзываются и очень быстро

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

Всё встало на свои места, после того как переопределил кнопки

Можно было и не переопределять, а сделать так, как я писал выше:

if (input(Code_Out)) Keyy|=0x8000; //Если клавиши нажата
Keyy>>=1;//Сдвигаем

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


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

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

Спасибо, и вас поздравляю :beer:

 

Можно было и не переопределять, а сделать так, как я писал выше:

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

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

не поверите, так я тоже пробовал, но почему-то не прокатило :(

У меня теперь другая проблема-ПЛИСка перестала перепрограмироваться, вернее почему-то не опознаётся кабель на паралельном порту, хотя ПИК, этим же кабелем прошивается нормально.Может там какое-то ограничение вступило в силу, пойду разбираться к плисоводам :wassat:

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


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

Вообще, по хорошему, нужно поставить запрет прерываний в процедурах работающих с дисплеем.

то есть при входе запрещать прерывание, а при выходе из неё опять разрешать?

 

Поскольку уже всё работает и даже лучше , чем я ожидал, выкладываю на всеобщее скачивание весь проект, исходники для ПИКа, ПЛИСки, чертежи печатной платы и схемы.Дальнейшие изменения и дополнения с целью улучшения и совершенствования только приветствуются :a14: безо всяких претензий и нареканий. Выражаю огромную благодарность всем принявшим участие в данной теме,а в особенности Илье за самое активное участие и неоценимую помошь в отладке данного прибора.

:a14: :a14: :a14: :beer: :beer: :beer:

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


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

то есть при входе запрещать прерывание, а при выходе из неё опять разрешать?

Да именно так. имеются в виду самые низкоуровневые типа write_data, read_data. Хотя если и так все работает, то можно оставить без изменения.... 8)

 

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

 

Огромная проcьба выложить на rapidshare.com :) а то предыдущее я так и не скачал (у нас сайт забанен)

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


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

Огромная проcьба выложить на rapidshare.com а то предыдущее я так и не скачал (у нас сайт забанен)

Ок , сделаю. Интересно, как можно забанить YouTube?

 

http://rapidshare.com/files/111559805/scop....part1.rar.html

http://rapidshare.com/files/111561849/scop....part2.rar.html

http://rapidshare.com/files/111563192/scop....part3.rar.html

http://rapidshare.com/files/111564554/scop....part4.rar.html

http://rapidshare.com/files/111565875/scop....part5.rar.html

http://rapidshare.com/files/111566939/scop....part6.rar.html

 

Сорри, но получилось 120МБ :05:

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


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

Ок , сделаю. Интересно, как можно забанить YouTube?

Забнить можно все)

Сорри, но получилось 120МБ :05:

Большое спасибо :) После праздников с работы качну.... Там проблем с объемом нету.

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


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

Принимаю индивидуальные и коллективные заказы на изготовление печатной платы для данного проекта- стоимость одной платы с почтовыми расходами составляет100 евро.

Плата двухстороняя, размер 215х110мм,по желанию заказчика может быть покрыта защитным зелёным лаком, при этом стоимость возрастает на 17 евро.

Срок изготовления 8 дней, скорость доставки зависит от расторопности вашей почтовой службы

заказывайте уже сегодня, завтра будет много дороже.......

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


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

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