Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Дистанционное управление, пульты, RC5 и т.п. » Емкостные кнопки для леньтяйки


Емкостные кнопки для леньтяйки

Сообщений 1 страница 9 из 9

1

Кто поможет с куском кода на кнопки вот такие http://www.getchip.net/posts/060-drajjv … ttiny2313/
Если можно то с комментарием.
Пробовал на 16 меге + LCD на одну кнопку для начала, что-то увидеть, ни чего не получил.

Код:
'Блок тест MRC-40'
$regfile = "m16def.dat"                                     ' используем ATbanned6
$crystal = 16000000                                         ' частота установленного кварца 16 mHz
$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'
'Библиотека lcd4.lbx использует следующее подключение -
'
'LCD = ATmega32
'---------------
'Rs  = PortB.0
'RW  = PortB.1  в данном варианте не используется - просто подключен (так же его можно подключить на землю)
' E  = PortB.2
'E2  = PortB.3  данный вывод используется для подключения некоторых дисплеев с двумя чипами (здесь не используется)
'Db4 = PortB.4
'Db5 = PortB.5
'Db6 = PortB.6
'Db7 = PortB.7

' указываем конфигурацию подключения дисплея к портам МК
'Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
'*******************************************************************************

'*********объявляем переменные******
Dim A As Integer                                            'переменная которую приравниваем со значением таймера 0
Dim I As Byte                                               'проверяем эту переменную на число срабатываний, если равно 2 тогда нагрузку включаем/выключаем


'***********конфигурация портов*******************

Config Timer0 = Timer , Prescale = 1 , Capture Edge = Falling       'настройка таймера0, 
Config Pind.0 = Output

Config Lcd = 16 * 2                                         ' экран 16*2 (любой с контроллером HD44780)
Config Lcdpin = Pin , Rs = Portb.0 , E2 = Portb.3 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7

'****Reset for Start***********
Stop Timer0


'******Interrupt routline setting****
'ссылки на обработчики прерываний
On Timer0 Res:

'разрешаем все что включили
Enable Timer0

'останавливаем и сбрасываем таймер
Stop Timer0
Timer0 = 0


'****** основной цикл программы ******

Do

Cls                                                         ' очистка дисплея
Cursor Off
Lcd "  KHOPKA  "                                            ' LCD заставка

Waitms 100

  Config Pind.0 = Output                                    ' Нога порта D0 на выход
   Reset Pind.0                                             ' Сброс порта D
    Config Pind.0 = Input                                   ' Нога порта D0 на вход

      Start Timer0                                          'запускаем таймер0
      'Set Portd.4                                           'зажигаем светодиод
        'Waitms 100                                          'ждем некоторое время, чтобы не ловить эхо
Tik:
        If Pind.0 = 1 Then                                  'если значение порта D0 равно 1, тогда считаем что таймер стоп
            Stop Timer0                                     'останавливаем таймер
                 A = Timer0                                 'присваиваем переменной текущее значение таймера0 (для Т0 это может быть от 0 до 65535)
Else                                                        'в противном случае,продолжаем счет
        Goto Tik

        End If
Goto Prn_lcd
Goto Res


Loop

'******* Сброс таймера **********

Res:                                                        'прерывание от таймера0

       Stop Timer0                                          'останавливаем таймер
       Timer0 = 0                                           'сбрасываем значение таймера0 в 0
       'Reset Portd.4                                        'гасим светодиод


Return


'*********** Смотрим результат ****************
Prn_lcd:


            Cls
            Cursor Off
            Lcd A
            Lcd "  Pin D"
            Locate 1 , 1
     Waitms 300
Return
   End

0

2

Вот мой код на пять кнопок (4-стрелки и один ввод)
работал стабильно
Далее я дошёл до матрицы на 12 сенсоров,с подсветкой кнопок. на макетке работал отлично.решил всё красиво оформить, но под конец обнаружил, что не отзеркалил плату, а тут весна пришла...., ну короче
отложил до осени.

Код:
'$regfile = "m8def.dat"
$regfile = "attiny2313.dat"
$crystal = 8000000
Config Timer0 = Timer , Prescale = 1
Dim S(5) As Byte , T(5) As Byte , E As Byte , A As Byte
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 1a
Portd = 0
A = 0
Stop Timer0
'щупаем сенсоры
While A < 5
S(a) = 0
 For E = 1 To 200
Gosub Sensor
If S(a) < T(a) Then S(a) = T(a)                             'из 200 замеров выбираем наибольший
Next
 S(a) = S(a) + 15                                           ' "15" для бумаги
Incr A
 Wend
 Cls
Lcd S(1) ; "/" ; S(2) ; "/" ; S(3) ;
Lowerline
Lcd "/" ; S(4) ; "/" ; S(5) ;
'  сканируем сенсоры
 Do
For A = 0 To 4
Gosub Sensor
If T(a) > S(a) Then
Home
Lcd A
Waitms 150
End If
Next
Loop

' подпрограмма сенсора
Sensor:
Ddrd = 255
Start Timer0
Ddrd = 0
Select Case A
Case 1 : Bitwait Pind.1 , Set
Case 2 : Bitwait Pind.2 , Set
Case 3 : Bitwait Pind.3 , Set
Case 4 : Bitwait Pind.4 , Set
Case 0 : Bitwait Pind.0 , Set
End Select
Stop Timer0
T(a) = Timer0
Timer0 = 0
Return

0

3

kipСпасибо!
Уже опробовал.
Все ОкЭй, впротосе, а в железе работает после касания, похоже, нужно увеличить 1 мегом.
Да, еще защиту от нажатия 2 кнопок.

Отредактировано Aleks (2011-05-24 20:27:01)

0

4

Aleks написал(а):

а в железе работает после касания, похоже, нужно увеличить 1 мегом

Не совсем понял, работает или нет?
Чуствительность, конечно зависит от сенсоров.  Я делел примерно 15х15 мм., чтобы как можно сильнее исключить  влияние на соседнии контакты. далее-
S(a) = S(a) + 15-  так я тоже пытался регулировать чувствительность. Ну лучше не придумал :dontknow:
15- для бумаги с скотчем. Также делал из коробки от CD дисков(оргстекла). Вырезал по размеру, потом обильно смазывал ацетоном и быстро приклеевал к плате с сенсорами. Соответственно S(a) уменьшал с 15 до 5. И тоже всё работало замечательно.
Но долговременно не проверял. Кроме того, заметил, что при смене места(дом-работа) начальные значения

Код:
'щупаем сенсоры
---
---
 Cls
Lcd S(1) ; "/" ; S(2) ; "/" ; S(3) ;
Lowerline
Lcd "/" ; S(4) ; "/" ; S(5) ;

менялись
Думаю надо уделить внимание на помехоустойчивость аппаратным способом.
Вообщем тема для меня интересная, ежели чего, пишите о своих успехах, хоть в личку, а я , пстораюсь дабить "матрицу" и выложить.

0

5

Делаю матрицу как в статье.

Нет начального старта, на ЖК все чисто, после касания появляются значения ем. Кнопок (14/34/12/....)
2-ая строка, номер нажатой кнопки, идет перебор от0-4. (У меня Pin_A Х  )
Вывод один, матрица!
Вид Жка
/***************************/
/  14/34/12/39/15/                               /
/   Pin_A 0                                              /
/***************************/

0

6

вот программка. Если у кого, то есть готовое железо, то можно попробовать

Код:
'Измерил емкость, вносимую сухим пальцем на на печатную площадку 7х7 мм.
'Во результаты:
' - непосредственно касаясь металла (без изоляции) добавляем 6-7 пФ. Этот вариант
'   не годится из-за возможного влияния сетевой наодки и утечек. Нужен разделительный
'   конденсатор, выполняющий роль фильтра верхних частот. Далее попробуем определить
'   его параметры;
' - через один слой пленки толщиной 0.15 мм - 4-5 пФ. Это оптимально и соответствует
'   разделительному конденсатору 10 - 20 пФ;
' - через два слоя пленки - 2.5-3 пФ. Маловато для надежности.

'Отсюда выводы, что для надежной работы необходимы следующие условия:
' 1) начальная емкость на линии порта не должна быть более 5 пФ (емкость порта и монтажа),
'    чтобы изменение постоянной времени было приблизительно двухкратным;
' 2) невозможно удалить клавиатуру от МК более, чем на 100 мм, иначе
'    не обеспечить первое и равенство по емкости всех кнопок;
' 3) оптимальным временем измерения является интервал в пределах 0.5 - 2 мкс,
'    позволяющий не применять в RC-цепочке резистор более 330 кОм. С таким резистором
'    частота среза ФВЧ составит 100 кГц. Отлично, помеха сети будет ославляться в 2000 раз.
'    Резистор 1 МОм - это уже много, т.к. ток утечки отключенного выхода -  10 мкА и
'    и сильно зависит от температуры. Соответственно все действия программы
'    придется писать только на ассемблере;
' 4) лучше не применять переключение выхода в режим ввода в начале измерительного цикла,
'    чтобы не инжектировать из порта заряд во внешний конденсатор;
' 5) зато можно не применять никаких таймеров для подсчета времени - задержку на 1-2 мкс просто
'    сделать командами NOP.
' На основании теоретических изысканий получаем следующую схему на 7 "кнопок"
'
'                                     R1 - R7 = 220 kOhm
'        |                 ___  R1                    |
' PortD,0|---------*------|___|---*------------------|| площадка 1
'        |         |              |                   |
'        |         |              |
'        |         |       ___ R2 |                   |
'        |         *------|___|-------*--------------|| площадка 2
'        |         |              |   |               |
'        |         |              |   |
'       .............................................
'        |         |       ___ R6 |   |               |
'        |         *------|___|-----------*----------|| площадка 7
'        |         |              |   |   |           |
'        |         |       ___ R7 |   |   |            /
'        |          ------|___|---------------*------||---|
'        |                        |   |   |   |     / 2 - 6 пФ
' PortB,0|------------------------    |   |   |       подстроечный
'        |                            |   |   |       конденсатор
' PortB,1|----------------------------    |   |       устанавливает
'       ............................................. оптимальный
'        |                                |   |       порог
' PortB,6|--------------------------------    |       срабатывания
'        |                                    |
' PortB,7|------------------------------------
'        |
'        |
' в которой на PortD,0 генерится сигнал заряда-разряда,
'              PortB,0 - PortB,6 принимают сигналы с RC-цепочек
'           на PortB,7 опорный конденсатор. его значение подбирается так,
'           чтобы переход логического уровня на нем происходил чуть раньше
'           чем на входе которого касается палец, т.е. точка срабатывания
'           регулируется отверткой, а не подбирается программно. При этом
'           все аппаратные неприятности, связанные с нестабильность порога
'           срабатывания порта полностью компенсируются.
'---------------------------------------
Portb = &B00000000
Ddrb = &B00000000

Portd = &B00000000
Ddrd = &B00000001
'---------------------------------------
'подпрограмма считывания состояния емкостной клавиатуры
'расчитана на тактовую частоты 8 - 16 МГц.
'выход с кодом в R31. При отсутствии нажатий (касаний) R31=0
'данная функция может включаться в любую привычную программу опроса клавиатуры
'вместо операции считывания состояния порта с механическими кнопками
Rdekl:
$asm
'т.к. порт portd,0 ранее установлен в нуль,
'то начальный кусок программы не нужен
    Cbi portd , 0                       'разряд
    nop                                 'дождемся снятия заряда
    Nop                                 'количество NOP должно быть равно тактовой частоте
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
'конец участка необязательно кода
'его можно закомментировать
    sbi portd , 0                       'начинаем заряд
Rdekl1:
    SBis pind , 7                       'ждем пока эталонный конденсатор зарядится
    Rjmp Rdekl1
    Nop                                 'эта строка необходима при тактовой частоте 16 МГц
    in R31 , pinb                       'считаем значение линий клавиатуры
    Andi R31 , &B01111111               'сохраним в R31
    nop                                 'дождемся полного заряда
    nop                                 'количество NOP должно быть равно тактовой частоте
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    Cbi portd , 0                       'начинаем разряд
Rdekl2:
    SBiC pind , 7                       'ждем пока эталонный конденсатор разрядится
    Rjmp Rdekl2
    Nop                                 'эта строка необходима при тактовой частоте 12-16 МГц
    in R30 , pinb                       'считать код кнопок
    Com R30                             'инвертировать код для последующего сравнения
    Andi R30 , &B01111111               'сохраним в R30
    CPse R30 , R31                      'сравниваем два кода
    ldi R31 , 0                         'если не равны, то очищаем результат
Rdekl3:
    ret
$end Asm
'---------------------------------------

+1

7

kip
Нет, Васька тормоз для такого! Не могу подобрать задержки (для кода постом выше).
Мнение такое, на кнопочки нужно помимо 1МоМ вешать доп. емкость в 100нан, тогда что-то близкое получаю.
Значения все равно пляшут. %(
Думаю у автора  http://www.getchip.net/posts/060-drajjv … ttiny2313/  испросить кусок АСМа.
Часть исполнителя на Ваське + АСМ опрос кнопок.

0

8

Aleks, у меня работало стабильно на пять сенсоров. Хотел плату сенсоров выложить, но не нашёл здесь как! Короче, плата 2-х стороняя, с одной стороны сенсоры, с другой, резисторы 1МОм СМД, прямо под сенсорами. При первом сканировании получались значения порядка 100. Проверьте фьюзы, делитель на 8 отключён?

0

9

kip
Вот 100 точно нет.
Разобрался, длина провода меж кнопками и процем оооочень кретична. Резюки стаят на плате с процем, а клава далее..
Пока тест режим ганяю.
Спасибо!!! за код!!

0


Вы здесь » Программирование ATMEL в BASCOM. » Дистанционное управление, пульты, RC5 и т.п. » Емкостные кнопки для леньтяйки