реклама на сайте
подробности

 
 
30 страниц V  « < 12 13 14 15 16 > »   
Closed TopicStart new topic
> SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c
Ilya_A
сообщение Apr 20 2008, 14:27
Сообщение #196


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 20 2008, 20:43) *
теперь я нифига не понимаю, что я должен с ПЛИСки в ПИК гнать?
такими должны быть импульсы?

Вот, что я имел ввиду:
Прикрепленное изображение

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

Т.е. за одну посылку передается все состояние клавиатуры.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 20 2008, 14:43
Сообщение #197


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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

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

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

а если при этом нажать любую кнопку, то картинка оживает.
На входе TASTE_EN появляется лог.1, а Code_Out лог.0( я его временно заземлил)


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 21 2008, 10:29
Сообщение #198


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 20 2008, 23:43) *
теперь рассказывайте мне , как мне ПЛИСину перерисовать для такого случая. wacko.gif

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

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

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

Так и должно было получиться. Вам нужно отправлять состояние клавиатуры постоянно, независимо от того, нажата или нет хоть одна клавиша.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 21 2008, 17:06
Сообщение #199


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 22 2008, 01:15
Сообщение #200


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 22 2008, 02:06) *
Ок, вот такой кнопочник мне предложили запихнуть в ПЛИСку. Я его собрал и проверил.Сигналы соответствуют тому графику , который вы нарисовали.На входе счётчика 156кГц(если надо, то можно выбрать от 80ти МГц и далее делением на 2).
На ножке Taste_EN меандр активная часть 100мкс,пауза тоже 100мкс, а на CODE_OUT короткие импульсы прим. 8мкс. Если одновременно нажать все 16 кнопок, то они как раз умещаются в активную часть Taste_EN, то есть тут , как я полагаю всё правильно.
дальнейшей проверкой работы кнопок пока не занимался, уже поздно и спать хочу wassat.gif

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

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

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 раз в секунду. С этой же частотой будет обновляться состояние клавиатуры.
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 22 2008, 16:33
Сообщение #201


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



тут компилятор выдаёт ошибку так как значение(выделено красным ) может быть от 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.gif

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

И ещё вот это можно откоментировать, для ясности 05.gif
Код
#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 МГц


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 23 2008, 04:44
Сообщение #202


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 23 2008, 01:33) *
тут компилятор выдаёт ошибку так как значение(выделено красным ) может быть от 1 до 16

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

Напишите за место этой строчки так:
Код
T2CON=0x00;
PR2=PR;

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

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

Странно. Кстати я ошибочку нашел. Нужно так:
while(!bit_test(PIR1,T2IF));//Ждем флага переполнения.
Попробуйте и отпишитесь. Вообще, по хорошему, нужно поставить запрет прерываний в процедурах работающих с дисплеем.
Цитата
Кстати вопрос имею- почему нужно использовать таймер2, а не таймер1 ?

Потому что у таймера 1 нету регистра, задающего период (у второго это регистр PR2). Следовательно нельзя на аппаратном уровне задать время его переполнения (только буквально несколько вариантов, зависящих от делителя). Поэтому пришлось бы после каждого переполнения заново задавать начальное значение таймера. Что не очень красиво.
Цитата
И ещё вот это можно откоментировать, для ясности 05.gif
Код
#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 такта. (см. даташит)
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 23 2008, 19:15
Сообщение #203


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Супер !!! a14.gif Всё заработало.Кнопки отзываются и очень быстро,только команды не совпадают с нажатием, как-то всё перепутано.Попробую разобраться с этим сам
Код
#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.gif

Код
//############## КОДИРОВКА КНОПОК #######
#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.gif и уважуха beer.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 24 2008, 02:41
Сообщение #204


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 24 2008, 04:15) *
Супер !!! a14.gif Всё заработало.Кнопки отзываются и очень быстро

Поздравляю! beer.gif
Цитата
Всё встало на свои места, после того как переопределил кнопки

Можно было и не переопределять, а сделать так, как я писал выше:
Код
if (input(Code_Out)) Keyy|=0x8000; //Если клавиши нажата
Keyy>>=1;//Сдвигаем
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 24 2008, 16:10
Сообщение #205


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Цитата
Поздравляю! beer.gif

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

Цитата
Можно было и не переопределять, а сделать так, как я писал выше:
if (input(Code_Out)) Keyy|=0x8000; //Если клавиши нажата
Keyy>>=1;//Сдвигаем

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


--------------------
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 28 2008, 17:08
Сообщение #206


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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

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

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


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Apr 30 2008, 01:46
Сообщение #207


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



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

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

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

Огромная проcьба выложить на rapidshare.com smile.gif а то предыдущее я так и не скачал (у нас сайт забанен)
Go to the top of the page
 
+Quote Post
andreichk
сообщение Apr 30 2008, 14:55
Сообщение #208


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



Цитата
Огромная про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.gif


--------------------
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение May 1 2008, 08:48
Сообщение #209


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(andreichk @ Apr 30 2008, 23:55) *
Ок , сделаю. Интересно, как можно забанить YouTube?

Забнить можно все)
Цитата
Сорри, но получилось 120МБ 05.gif

Большое спасибо smile.gif После праздников с работы качну.... Там проблем с объемом нету.
Go to the top of the page
 
+Quote Post
andreichk
сообщение May 3 2008, 11:10
Сообщение #210


Знающий
****

Группа: Свой
Сообщений: 507
Регистрация: 15-04-06
Из: Германия
Пользователь №: 16 143



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


--------------------
Go to the top of the page
 
+Quote Post

30 страниц V  « < 12 13 14 15 16 > » 
Closed TopicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016