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

|
Извиняюсь за задержку с ответом - праздники, даже не заходил на форум  Решить вашу проблему можно, заведя переменную для хранения значения предыдущей нажатой кнопки, следующим образом: Код unsigned char XX; // переменная которая будет изменяться unsigned char key=0,keyold=0;
key=GetButton(); if(key==12){ if(keyold!=12) XX++; }else if(key==13){ if(keyold!=13) XX--; } keyold=key;
|
|
|
|
|
Mar 12 2008, 13:18
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 19-02-08
Из: Днепропетровск
Пользователь №: 35 198

|
Это самая лучшая разработка одного человека какую я видел за последнее время. Я сам пытался разработать цифровой осциллограф, но так до конца не доделал, АЦП не заработал (AD9283 100Msps), сделал его только как логический анализатор через LPT порт с частотой дискретизации 48MHz и 8 каналов, потом забросил, щас снова интерес появился, я хочу повторить ваш осциллограф для себя. Аналогов такого осциллографа со схемами я не нашёл.
Сообщение отредактировал Transon - Mar 12 2008, 13:20
|
|
|
|
|
Mar 14 2008, 10:41
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 14 2008, 04:26)  Код unsigned char XX; // переменная которая будет изменяться unsigned char key=0,keyold=0;
key=GetButton(); if(key==12){ if(keyold!=12) XX++; }else if(key==13){ if(keyold!=13) XX--; } keyold=key; тут не совсем так как надо получается, а именно- значение переменной ХХ меняется только один раз, при повторном нажатии на ту же кнопку оно уже не меняется. А нужно , чтобы оно увеличивалось(или уменьшалось) на единицу при каждом нажатии. Почему же? Все будет ОК если функция GetButton() будет возвращать 0 если не получила никакого кода клавиши. Тогда переменная keyold занулится (в момент отжатия) и при следующем нажатии на ту же кнопку произойдет необходимая операция
|
|
|
|
|
Mar 15 2008, 12:14
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 15 2008, 18:12)  дело в том , что момент отжатия невозможно установить точно, так как он происходит в произвольный момент времени и там ведь ещё целая куча задач выполняется.Плохо то, что я не могу назначить прерывание по изменению состояния порта РА5,в компиляторе такого почему-то не прописано(может его вобще не существует для ПИКа 18Ф4550), хотя в общей доке для компилятора описание имеется.Плёхо, очень плёхо...... Есть 2 выхода: Во первых можно перекинуть с RA5 на одну из ног: RB0, RB1, RB2 - ноги на которых можно настроить прерывания по фронту или по спаду. Либо можно завести внутренний таймер, с периодом переполнения, например 100 мс и настроить прерывание, по переполнению. А уже в прерывании выполнять GetButton(). - появиться гарантированное время между опросами клавы.
|
|
|
|
|
Mar 16 2008, 07:27
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Хорошо. Теперь приступим: Возьмем за базу TMR0, у него большой прескалер (на 10 MIPS можно получить до 1.6 с.) Код ..... //Гдето в инициализации программы в T0CON указываем: as 16 bit timer/counter Internal instruction cycle clock TMR0 prescaler is assigned Prescaler выбираем из следующих соображений: 1:8 - 0.0524288 с 1:16 - 0.1048576 с можно и другие варианты, достаточное значение опредилится опытным путем
TMR0H=0; // Зануляем таймер TMR0L=0;
TMR0IF=0; //Очищаем флаг TMR0IE=1; //Включаем прерывание по переполнению IPEN=0; //Отключаем приоритет прерываний PEIE=1; //Включаем прерывания перефирии GIE=1; //Включаем глобальный флаг разрешения прерываний TMR0ON=1; //Затем стартуем таймер: ..... Почитал я немного про CSS, походу там обработка прерываний делается так: (для экономии времени на вызов функции лучше тело GetButton перенести сюда, также нужно сделать глобальными переменные key и keyold) Код ... где- то в программе: int8 key=0,keyold=0; // незнаю, как в CCS но в PICC18 я бы добавил ключевое слово volatile ... //Непосредственно обработчик прерываний #int_timer0 void timer0_isr(void){ TMR0IF=0;// Очистим флаг прерывания key=0; if (!input(TASTE_EN)){//теперь, раз уж мы сюда зашли, придется дождаться начала передачи кода клавиши while(!input(TASTE_EN)); }else{// а если зашли уже в момент передачи кода кнопки то придеться дождаться окончания передачи... while(input(TASTE_EN)); while(!input(TASTE_EN));//а также ждем начало следующей передачи } while(input(TASTE_EN))//пока активно RA5 { while(!input(Code_Out))//ждём фронт { if (!input(TASTE_EN)) break;//проверяем: если передача законилась то выходим } if (!input(TASTE_EN)) break;//проверяем: если передача законилась то выходим while(input(Code_Out));//ждём спад key++; } //по хорошему эту обработку тоже нужно занести сюда: if(key==12){ if(keyold!=12) XX++; //XX тоже должна быть глобальной }else if(key==13){ if(keyold!=13) XX--; } keyold=key; } ... А уже в теле программы можно спокойно, в любой момент, проверять переменную key.... В особо критичных моментах можно будет на время выключать прерывания, например: Код GIE=0; бла, бла,бла.... GIE=1; Да, и еще - не совсем понял как кодируется "не нажата ни одна клавиша" - по хорошему, нужно чтобы был импульс на TASTE_EN, без импульса на Code_Out
Сообщение отредактировал Илья - Mar 16 2008, 08:16
|
|
|
|
|
Mar 16 2008, 12:55
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(andreichk @ Mar 16 2008, 19:15)  компилятор не хочет это признавать TMR0IF=0;// Очистим флаг прерывания Значит этот бит либо не прописан, либо прописан каким либо другим образом. Вообще-то этот бит принадлежит регистру INTCON. Можно попробывать варианты: INTCON.TMR0IF=0 или INTCONbits.TMR0IF=0. Ну вообще-то вам лучше знать как обращаться к битам регистров в вашем компиляторе.  На крайняк такой вариант точно проканает: INTCON&=0b11111011;
Сообщение отредактировал Илья - Mar 16 2008, 13:00
|
|
|
|
|
Mar 16 2008, 14:49
|

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

|
пробую так его прописать set_timer0(0); // TMR0IF=0;// Очистим флаг прерывания
тоже не катит INTCON&=0b11111011; вообще это идиотизм, что эти компиляторописатели подменяют стандартные описания какими-то собственновыдуманными конструкциями, поди разбери, что чем заменяется.
Вот что я решил, у меня тут с ПЛИСкой проблемы, вернее с обьеденением некоторых функций, которые я в ней заложил.Поэтому я решил инициализировать ещё 4 пина и напрямую ввести их в ПИК на порты РА0,РА1,РА2,РА3(они у меня ничем не заняты).И тогда я смогу простым нажатием на соотв.кнопку увеличивать-уменьшать значение переменной ХХ.Прошу пока все дальнейие изыскания на эту тему приостановить, сделать паузу и попить пивка напр.
--------------------
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|