Перейти к блогу GetChip.net - блог        JilTE[1] - в разработке     Модификации устройств - модификации

 
Текущее время: 21 июл 2019, 00:45

Часовой пояс: UTC + 3 часа [ Летнее время ]



Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 04 июн 2012, 23:15 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 5
Подскажите что не так делаю ?
Собрал я Драйвер сенсорной клавиатуры 060 для SMD
Прошил прошивку
Мод #065 (Четырехканальный сенсорный переключатель нагрузок) вторая которая
без фиксации на 6 кнопок
Фьюз-биты прошил как указано в статье
Устройство ни как не хочет реагировать на прикосновения сенсорные площадки сделал 40*40 мм
Может прошивка не для этой печатки?
Или можно поправить прошивку?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 05 июн 2012, 00:12 
Не в сети
Аватара пользователя

Зарегистрирован: 12 фев 2012, 22:25
Сообщения: 74
Там на плате есть хитренькая перемычка, соединяющая все резисторы по 1М на +5V, вы ее запаяли?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 05 июн 2012, 13:26 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 5
Да перемычка запаяна. Она соединяет все 6 резисторов на 1 мОм к +

Горит только один светодиод, и все.
На прикосновение не реагирует. Прошивка залита правильно, верификацию
проходит успешно. Пробовал другую attiny2313 также себя ведет.

В статье указаны Фьюзы для Algorithm Builder’а, я пользовался для прошивки Code VisionAVR

Фьюзы прошил в Code VisionAVR также как указано в статье, только на оборот,
там где стоят галки снимал, там где не стоят галочки ставил.
Может что то в них я напутал?
Фьюзы для Code VisionAVR так как в статье.

 Фьюзы
CKSEL0=1
CKSEL1=1
CKSEL2=0
CKSEL3=1
SUT0=0
SUT1=1
CKOUT=0 он разве не должен быть включен? 1
CKDIV8=0
RSTDISBL=0
BODLEVEL0=0
BODLEVEL1=0
BODLEVEL2=0
WDTON=0
EESAVE=0
DWEN=0
SPIEN=1


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 15 июн 2012, 07:51 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 55
Vitalik_Nic писал(а):
Подскажите что не так делаю ?
Собрал я Драйвер сенсорной клавиатуры 060 для SMD
Прошил прошивку
Мод #065 (Четырехканальный сенсорный переключатель нагрузок) вторая которая
без фиксации на 6 кнопок
Фьюз-биты прошил как указано в статье
Устройство ни как не хочет реагировать на прикосновения сенсорные площадки сделал 40*40 мм
Может прошивка не для этой печатки?
Или можно поправить прошивку?

Попробуйте залить основную прошивку из статьи #065. Печатку я не изменял, фузы как в статьи, и у меня всё работает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 17 июн 2012, 16:16 
А что поменять чтоб вместо цифр по юарту выдавать два символа? Например Х1, У2 и подобное.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 17 июн 2012, 21:45 
AVRmaster писал(а):
А что поменять чтоб вместо цифр по юарту выдавать два символа? Например Х1, У2 и подобное.


Поменять в программе блок Get_Char


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 04 дек 2015, 15:59 
Не в сети

Зарегистрирован: 05 апр 2012, 09:14
Сообщения: 7
не буду плодить тем.
делаю сейчас сенсорную клавиатуру. уже протравил и спаял плату по по образу и подобию ссылка. схему прикладываю. контролер тини 2313
уже заливал чужую прошивку из ссылки, для того чтобы проверить правильно ли я спаял всё. всё работает правильно.
конкретно сейчас у меня страшнейший затуп из-за неполного знания языка C++.

для начала введу в курс
я опрашиваю/меняю_значения выводов портов с помощью вот таких структур:
Код:
// структура/массив пинов сенсорных площадок
struct _STRUCT_PIN     
{
   volatile   unsigned char   *PIN_BUT;         //порт кнопки   (PIND, PINA...)
            unsigned char   BUT;              //пин кнопки   (PD0, PA1...)
};

struct _STRUCT_PIN  VirtPIN[] =
{
   {&PIND,PD3},
   {&PINB,PB1},
   {&PINB,PB4},
   {&PIND,PD2},
   {&PINB,PB0},
   {&PINB,PB3},
   {&PIND,PD4},
   {&PINB,PB2},
   {&PINB,PB5},
//   {&PIND,PD5},   //<--- нет 1Мом резистора на выводе
   {&PIND,PD6},
//   {&PINB,PB6}      //<--- нет 1Мом резистора на выводе
};

// структура/массив регистров направления сенсорных площадок
struct _STRUCT_DDR     
{
   volatile   unsigned char   *DDR_BUT;         //порт кнопки   (DDRD, DDRA...)
            unsigned char   BUT1;              //пин кнопки   (PD0, PA1...)
};

struct _STRUCT_DDR  VirtDDR[] =
{
   {&DDRD,PD3},
   {&DDRB,PB1},
   {&DDRB,PB4},
   {&DDRD,PD2},
   {&DDRB,PB0},
   {&DDRB,PB3},
   {&DDRD,PD4},
   {&DDRB,PB2},
   {&DDRB,PB5},
//   {&DDRD,PD5},   //<--- нет 1Мом резистора на выводе
   {&DDRD,PD6},
//   {&DDRB,PB6}      //<--- нет 1Мом резистора на выводе
};

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

далее.
у меня есть полное представление об алгоритме опроса сенсорной площадки:
1) вывод обнуляется и ёмкость площадки сбрасывается.
2) вывод переводится в режим hi-z и начинает тикать счётчик переменной
4) опрашивается пин сенсорной площадки и тикается счётчик
5) когда сенсорная площадка набрала ёмкость и на выводе лог.1 то опрос прекращается
6) значение счётчика сравнивается с калибровочным значением пустой ("не нажатой") из памяти
7) если больше - "кнопка нажата"
8) если сопоставимо - "кнопка не нажата" и опрашиваем следующую сенсорную кнопку.

я долго думал откуда брать калибровачные начения. набивать их вручную казалось как-то не рационально. а без этих значений просто так не напишешь код опроса.
а потом придумал код автокалибровки по запуску контроллера.
алгоримт автокалибровки такой:
1) объявляем массив для хранения значений каибровки каждой "кнопки" // то есть лог.1 "не нажатой" сенсорной площадки
2) вывод обнуляется и ёмкость площадки сбрасывается.
3) вывод переводится в режим hi-z и начинает тикать счётчик переменной
4) опрашивается пин сенсорной площадки и тикается счётчик
5) когда сенсорная площадка набрала ёмкость и на выводе лог.1 то значение переменной заносится в массив с адресом конкретной сенсорной площадки

просто и изящно (наверное). но вот (не)знание си++ меня подводит
те конструкции я использую вот так:
Код:
#define Clear_DDR(numb)         ( *(VirtDDR[numb].DDR_BUT) &=  (~(1<<VirtDDR[numb].BUT1)) ) // переводит направление порта на вывод

#define Set_DDR(numb)         ( *(VirtDDR[numb].DDR_BUT) |=  (1<<VirtDDR[numb].BUT1) ) // переводит направление порта на ввод

#define Check_PIN(numb)         ( (*(VirtPIN[numb].PIN_BUT)&(1<<VirtPIN[numb].BUT))!=0 ) // используется для опроса состояние пина порта


затуп у меня в этом месте:
Код:
for (iSens=0; iSens<=SENSOR; iSens++)
    {
      Clear_DDR(iSens);                  // сбросили ёмкость на сенсоре
      Count = 0;                        // обнулили счётчик
      Set_DDR(iSens);                     // начали заряжать ёмкость сенсорной площадки
      while(!Check_PIN(iSens))            // инкременировать счётчик до тех пор пока не выйдет из нуля в единицу. значит ёмкость зарядилась
      {
         Count++;                     // проверка счётчика. если счётчик равен ff значит пин контроллера и ёмкость сенсорной площадки калибровку не прошли. а значит бида-бида.
         if (Count==0xFF)
         {
            break;
         }
         
      }      
      Clear_DDR(iSens);                  // сбросили ёмкость на сенсоре и переходим к следующему сенсору
      Kalibrovka[iSens]=Count+1;            // сохранили показание счётчика в массиве калибровки. с этими значениями будет проверяться нажата "кнопка или нет"
    }
логика вроде правильная. однако симуляция и бесконечные прогоны и слежение за данными дают ноль. данные не сохраняются.
может я неправльно как-то использую while? или for? или где-то чего-то не предусмотрел?
upd: мне так кажется что ошибка где-то в этих дефайнах...
Код:
//проверка нажатия кнопки через структуру где numb - переменная цикла
#define Clear_DDR(numb)         ( *(VirtDDR[numb].DDR_BUT) &=  (~(1<<VirtDDR[numb].BUT1)) )
#define Set_DDR(numb)         ( *(VirtDDR[numb].DDR_BUT) |=  (1<<VirtDDR[numb].BUT1) )
#define Check_PIN(numb)         ( (*(VirtPIN[numb].PIN_BUT)&(1<<VirtPIN[numb].BUT))!=0 )


Вложения:
CapSensKB.c [4.6 КБ]
Скачиваний: 178
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 04 дек 2015, 16:25 
Не в сети

Зарегистрирован: 05 апр 2012, 09:14
Сообщения: 7
мысли в слух

Код:
for (iSens=0; iSens<=SENSOR; iSens++)
    {
      Clear_DDR(iSens);                  // сбросили ёмкость на сенсоре
      Count = 0;                        // обнулили счётчик
      Set_DDR(iSens);                     // начали заряжать ёмкость сенсорной площадки
      while(!Check_PIN(iSens) && (Count < 0xFF) )            // инкременировать счётчик до тех пор пока не выйдет из нуля в единицу. значит ёмкость зарядилась
      {
         Count++;                     // проверка счётчика. если счётчик равен ff значит пин контроллера и ёмкость сенсорной площадки калибровку не прошли. а значит бида-бида.
      }      
      Clear_DDR(iSens);                  // сбросили ёмкость на сенсоре и переходим к следующему сенсору
      Kalibrovka[iSens]=Count;            // сохранили показание счётчика в массиве калибровки. с этими значениями будет проверяться нажата "кнопка или нет"
    }

while(!Check_PIN(iSens) && (Count < 0xFF) )
без одного IF позволяет обойтись...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 08 дек 2015, 01:48 
Не в сети

Зарегистрирован: 05 апр 2012, 09:14
Сообщения: 7
за пару вечеров мозгования родилось вот это:
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include "usart.c"


//макросы для работы с битами
#define InvBit(reg, bit)        reg ^= (1<<(bit))
#define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
#define SetBit(reg, bit)         reg |= (1<<(bit))   
#define BitIsSet(reg, bit)     ((reg &  (1<<bit)) != 0)

/*
//переменные для подсчета количества переполнений
volatile unsigned char sub_time_pin0 = 0;

unsigned char CountDreb;
//сколько циклов опроса кнопка должна удерживаться

*/
// количество сенсоров
#define SENSOR 10 //10.
//  переменная счётчик сенсорных площадок
volatile unsigned char _iSens;
// переменная счётчик
volatile unsigned char _Counter;
// массив данных калибровки выводов
volatile unsigned char Kalibrovka[SENSOR];
//переменная для антидребезга
//volatile unsigned char _DrebComp = 0;
//#define _Drebezg 20
// перемменная предыдущей клавиши
volatile unsigned char _PreviousSensor = 0xFF;
//проверка нажатия кнопки через структуру где numb - переменная цикла
#define Clear_DDR(numb)         ( *(VirtPIN[numb].DDR_BUT) &=  (~(1<<VirtPIN[numb].BUT)) )       // вывод работает как ВХОД. при PORT = 0 = HI-Z
#define Set_DDR(numb)         ( *(VirtPIN[numb].DDR_BUT) |=  (1<<VirtPIN[numb].BUT) )         // вывод работает на ВЫХОД. PORT = 0 = pin = 0
#define Check_PIN(numb)         ( (*(VirtPIN[numb].PIN_BUT)&(1<<VirtPIN[numb].BUT))!=0 )       
#define UART_PIN(numb)         (VirtPIN[numb].Symbol)
// структура/массив пинов сенсорных площадок
struct _STRUCT_PIN     
{
   volatile   unsigned char   *DDR_BUT;         //порт кнопки   (DDRD, DDRA...)
   volatile   unsigned char   *PIN_BUT;         //порт кнопки   (PIND, PINA...)
   volatile   unsigned char   BUT;              //пин кнопки   (PD0, PA1...)
   volatile   unsigned char   Symbol;         // символ по уарту
};

struct _STRUCT_PIN  VirtPIN[SENSOR] =
{
   {&DDRD,&PIND,PD6,'0'},//9
   {&DDRD,&PIND,PD3,'1'},//7
   {&DDRB,&PINB,PB1,'2'},//1
   {&DDRB,&PINB,PB4,'3'},//4
   {&DDRD,&PIND,PD2,'4'},//6
   {&DDRB,&PINB,PB0,'5'},//0
   {&DDRB,&PINB,PB3,'6'},//3
   {&DDRD,&PIND,PD4,'7'},//8
   {&DDRB,&PINB,PB2,'8'},//2
   {&DDRB,&PINB,PB5,'9'},//5
//   {&DDRD,&PIND,PD5,'L'},//10      //<--- нет 1Мом резистора на выводе
//   {&DDRB,&PINB,PB6,'R'} //11      //<--- нет 1Мом резистора на выводе
};

int main( void )
{
  // инициализация пинов контроллера для работы с сенсорными площадками
  // устанавливаем выводы на выход (DDR = 1) и в устанавливаем ноль (PORT = 0)
   DDRD  |= (1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD6);
   PORTD &= (1<<PD2)&(1<<PD3)&(1<<PD4)&(1<<PD6);
   DDRB  |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);
   PORTB &= (1<<PB0)&(1<<PB1)&(1<<PB2)&(1<<PB3)&(1<<PB4)&(1<<PB5);
   USART_Init();

   //   USART_SendStr("Button: ");
   
// калибровочная часть НАЧАЛО
// выполняется один раз после инициализации периферии
//++++++++++++++++++++++++++++++++++++++++++++++++++
for (_iSens=0; _iSens<SENSOR; _iSens++)
    {
      Set_DDR(_iSens);                       // сбросили ёмкость на сенсоре
      _Counter = 0;                        // обнулили счётчик
      Clear_DDR(_iSens);                     // начали заряжать ёмкость сенсорной площадки
      while(!Check_PIN(_iSens) && (_Counter < 0xFF) )            // инкременировать счётчик до тех пор пока не выйдет из нуля в единицу. значит ёмкость зарядилась
      {
         _Counter++;                     // проверка счётчика. если счётчик равен ff значит пин контроллера и ёмкость сенсорной площадки калибровку не прошли. а значит бида-бида.
      }      
      Set_DDR(_iSens);                     // сбросили ёмкость на сенсоре и переходим к следующему сенсору
      Kalibrovka[_iSens]=_Counter++;            // сохранили показание счётчика в массиве калибровки. с этими значениями будет проверяться нажата "кнопка или нет"
      
      //USART_SendStr(_Counter);
    }
//++++++++++++++++++++++++++++++++++++++++++++++++++
// калибровочная часть КОНЕЦ
//разрешаем прерывания 
sei();



  while(1)
  {
    
        //  рабочая часть НАЧАЛО
//++++++++++++++++++++++++++++++++++++++++++++++++++   

    for (_iSens=0; _iSens<SENSOR; _iSens++)    
    {
      cli();
      if (Kalibrovka[_iSens]<0xFF)                //  проверка массива калибровки на 0xFF. если равно то пин не фурычит
      {
         Set_DDR(_iSens);                       // сбросили ёмкость на сенсоре
         _Counter = 0;                        // обнулили счётчик
         Clear_DDR(_iSens);                     // начали заряжать ёмкость сенсорной площадки
         while(!Check_PIN(_iSens) && (_Counter < 0xFF))            // инкременировать счётчик до тех пор пока не выйдет из нуля в единицу. значит ёмкость зарядилась
         {
            _Counter++;                     // проверка счётчика. если счётчик равен ff значит пин контроллера и ёмкость сенсорной площадки калибровку не прошли. а значит бида-бида.
         }      
         if ( (_Counter > Kalibrovka[_iSens]) && (_PreviousSensor != _iSens) )       // сравниваем счётчик со значениями из массива калибровки.
         {                              // если значение калибровки меньше то (1)
            _PreviousSensor = _iSens;         //делаем нынешнюю кнопку предыдущей
            USART_SendStr(_iSens++);          // (1) то отсылаем код кнопки по уарту.
         }
         Set_DDR(_iSens);                     // сбросили ёмкость на сенсоре. он больше нам не нужен
         //шагаем на следующий пин
      }      
      sei();
    }
//++++++++++++++++++++++++++++++++++++++++++++++++++   
//  рабочая часть КОНЕЦ
  }   

  return 0;
  }





что делает:
1) определяет в цикле от 1 до 10 для каждой кнопки предел чвствительности. я назвал это автокалибровкой. запустился мк, прогнал каждую кнопку на время заряда до 1. сохранил знаение в массиве для каждой кнопки.
2) в теле цикла while идёт постоянная проверка каждой клавиши со значением из массива калибровки. если бльше то отсылаем код клавиши.
вопросы:
как примерно реализовать антидребезг? как реализовать антиповтор клавиши(антизалипание)? как реализовать антимультитач? я много времени убил безвозвратно пытаясь разобрать каракули исходника для алгоритм билдера. можно ли просто на словах объяснить алгоритм?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Простая сенсорная панель (Keypad).
СообщениеДобавлено: 08 дек 2015, 19:14 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 15 май 2011, 23:00
Сообщения: 1925
Антидребезга, как токового, у сенсоров нет, но нужно игнорировать единичные сработки (могут появляться от электрических или электромагнитных помех).
Отвязаться от таких помех легко - достаточно делать несколько замеров и если они все показываю что сенсор сработал, значит он сработал. А если из серии замеров только один или два сработавших остальные нет - это помехи.

Что значит антиповтор? Чтобы когда клавиша нажата не шли ее коды при каждом опросе?
Тоже просто заведи переменную в которой храни номер предыдущей нажатой клавиши (или ноль если ничего не нажато) и сравнивай это значение после каждого опроса. Если новое значение равно предыдущему - значит клавиша еще не отпускалась.

Про антимультитач. Сенсоры ты опрашиваешь последовательно. Какой первый сработал тот и нажат - остальные просто игнорируй.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB