|
|
  |
SED1335,PIC18F4550 и LCD320x240, разбираем по косточкам модуль SED1335.c |
|
|
|
Apr 20 2008, 14:27
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 20 2008, 20:43)  теперь я нифига не понимаю, что я должен с ПЛИСки в ПИК гнать? такими должны быть импульсы? Вот, что я имел ввиду:
В данный момент одновременно нажаты клавишы: 2,5,12,16 Т.е. за одну посылку передается все состояние клавиатуры.
|
|
|
|
|
Apr 20 2008, 14:43
|

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

|
Цитата Вот, что я имел ввиду: я так и подозревал, но боялся об этом подумать. теперь рассказывайте мне , как мне ПЛИСину перерисовать для такого случая. зы.попробовал перезагрузить код с обновлённым прерыванием, так вот проц запускается только , если закомментировать строчку // while(bit_test(PIR1,T2IF));//Ждем флага переполнения. на обоих входах- TASTE_EN и Code_Out лог.0 а если при этом нажать любую кнопку, то картинка оживает. На входе TASTE_EN появляется лог.1, а Code_Out лог.0( я его временно заземлил)
--------------------
|
|
|
|
|
Apr 21 2008, 10:29
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 20 2008, 23:43)  теперь рассказывайте мне , как мне ПЛИСину перерисовать для такого случая.  Тут навеное вам виднее... Цитата зы.попробовал перезагрузить код с обновлённым прерыванием, так вот проц запускается только , если закомментировать строчку // while(bit_test(PIR1,T2IF));//Ждем флага переполнения. на обоих входах- TASTE_EN и Code_Out лог.0
а если при этом нажать любую кнопку, то картинка оживает. Так и должно было получиться. Вам нужно отправлять состояние клавиатуры постоянно, независимо от того, нажата или нет хоть одна клавиша.
|
|
|
|
|
Apr 21 2008, 17:06
|

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

|
Ок, вот такой кнопочник мне предложили запихнуть в ПЛИСку. Я его собрал и проверил.Сигналы соответствуют тому графику , который вы нарисовали.На входе счётчика 156кГц(если надо, то можно выбрать от 80ти МГц и далее делением на 2). На ножке Taste_EN меандр активная часть 100мкс,пауза тоже 100мкс, а на CODE_OUT короткие импульсы прим. 8мкс. Если одновременно нажать все 16 кнопок, то они как раз умещаются в активную часть Taste_EN, то есть тут , как я полагаю всё правильно. дальнейшей проверкой работы кнопок пока не занимался, уже поздно и спать хочу
--------------------
|
|
|
|
|
Apr 22 2008, 01:15
|
Частый гость
 
Группа: Свой
Сообщений: 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, то есть тут , как я полагаю всё правильно. дальнейшей проверкой работы кнопок пока не занимался, уже поздно и спать хочу  Замечательно! Теперь немного посчитаем: Точная длительность одного импульса равна: 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 раз в секунду. С этой же частотой будет обновляться состояние клавиатуры.
|
|
|
|
|
Apr 22 2008, 16:33
|

Знающий
   
Группа: Свой
Сообщений: 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;//Сдвигаем } на экране происходит полная неразбериха, а именно ничего хорошего, сетка не рисуется, всё остальное тоже, просто он либо не включается, либо по экрану бегут беспорядочные горизонтальные полосы сверху вниз.  Кстати вопрос имею- почему нужно использовать таймер2, а не таймер1 ? И ещё вот это можно откоментировать, для ясности Код #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 МГц
--------------------
|
|
|
|
|
Apr 23 2008, 04:44
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 23 2008, 01:33)  тут компилятор выдаёт ошибку так как значение(выделено красным ) может быть от 1 до 16 Ясно, значит он хочет значение делителя. Напишите за место этой строчки так: Код T2CON=0x00; PR2=PR; Просто и, главное сразу все понятно. Цитата но и это ещё не всё . Как я писал ранее , при наличии в прерывании строки(выделено красным) на экране происходит полная неразбериха, а именно ничего хорошего, сетка не рисуется, всё остальное тоже, просто он либо не включается, либо по экрану бегут беспорядочные горизонтальные полосы сверху вниз.  Странно. Кстати я ошибочку нашел. Нужно так: while( !bit_test(PIR1,T2IF));//Ждем флага переполнения. Попробуйте и отпишитесь. Вообще, по хорошему, нужно поставить запрет прерываний в процедурах работающих с дисплеем. Цитата Кстати вопрос имею- почему нужно использовать таймер2, а не таймер1 ? Потому что у таймера 1 нету регистра, задающего период (у второго это регистр PR2). Следовательно нельзя на аппаратном уровне задать время его переполнения (только буквально несколько вариантов, зависящих от делителя). Поэтому пришлось бы после каждого переполнения заново задавать начальное значение таймера. Что не очень красиво. Цитата И ещё вот это можно откоментировать, для ясности Код #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 такта. (см. даташит)
|
|
|
|
|
Apr 23 2008, 19:15
|

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

|
Супер !!!  Всё заработало.Кнопки отзываются и очень быстро,только команды не совпадают с нажатием, как-то всё перепутано.Попробую разобраться с этим сам Код #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 //#################################################### Но такое впечатление, что он как-будто вывернут наизнанку Ура !!! Всё встало на свои места, после того как переопределил кнопки Код //############## КОДИРОВКА КНОПОК ####### #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// Илье очередной  и уважуха
--------------------
|
|
|
|
|
Apr 24 2008, 02:41
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 24 2008, 04:15)  Супер !!!  Всё заработало.Кнопки отзываются и очень быстро Поздравляю!  Цитата Всё встало на свои места, после того как переопределил кнопки Можно было и не переопределять, а сделать так, как я писал выше: Код if (input(Code_Out)) Keyy|=0x8000; //Если клавиши нажата Keyy>>=1;//Сдвигаем
|
|
|
|
|
Apr 24 2008, 16:10
|

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

|
Цитата Поздравляю!  Спасибо, и вас поздравляю Цитата Можно было и не переопределять, а сделать так, как я писал выше: if (input(Code_Out)) Keyy|=0x8000; //Если клавиши нажата Keyy>>=1;//Сдвигаем не поверите, так я тоже пробовал, но почему-то не прокатило У меня теперь другая проблема-ПЛИСка перестала перепрограмироваться, вернее почему-то не опознаётся кабель на паралельном порту, хотя ПИК, этим же кабелем прошивается нормально.Может там какое-то ограничение вступило в силу, пойду разбираться к плисоводам
--------------------
|
|
|
|
|
Apr 28 2008, 17:08
|

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

|
Цитата Вообще, по хорошему, нужно поставить запрет прерываний в процедурах работающих с дисплеем. то есть при входе запрещать прерывание, а при выходе из неё опять разрешать? Поскольку уже всё работает и даже лучше , чем я ожидал, выкладываю на всеобщее скачивание весь проект, исходники для ПИКа, ПЛИСки, чертежи печатной платы и схемы.Дальнейшие изменения и дополнения с целью улучшения и совершенствования только приветствуются  безо всяких претензий и нареканий. Выражаю огромную благодарность всем принявшим участие в данной теме,а в особенности Илье за самое активное участие и неоценимую помошь в отладке данного прибора.
--------------------
|
|
|
|
|
Apr 30 2008, 01:46
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата то есть при входе запрещать прерывание, а при выходе из неё опять разрешать? Да именно так. имеются в виду самые низкоуровневые типа write_data, read_data. Хотя если и так все работает, то можно оставить без изменения.... 8) Ну и напоследок, если вас не затруднит хотелось бы увидеть девайс в действии, после всех проведенных апгрейдов. Имеется ввиду видео на минуту-две с демонстрацией всех возможностей и быстродействия устройства. Огромная проcьба выложить на rapidshare.com  а то предыдущее я так и не скачал (у нас сайт забанен)
|
|
|
|
|
May 1 2008, 08:48
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Apr 30 2008, 23:55)  Ок , сделаю. Интересно, как можно забанить YouTube? Забнить можно все) Цитата Сорри, но получилось 120МБ  Большое спасибо  После праздников с работы качну.... Там проблем с объемом нету.
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|