Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Своими руками (http://www.microchip.su/forumdisplay.php?f=21)
-   -   Сенсорный ввод на PIC (http://www.microchip.su/showthread.php?t=18150)

CocuckuH 31.08.2017 05:10

Сенсорный ввод на PIC
 
Доброго всем!

Пытаюсь собрать сенсорную панельку на PIC18F2580. И теорию и схему взял из статьи на Хабре: https://geektimes.ru/post/256674/

Так вот, уже на этапе калибровки контроллер не хочет работать как задумано. Программа стопорится на первом же цикле while, будто никакого заряда ёмкости и не происходит вовсе:

Код:

void CallibrateButtons(void) {
TRISB &= 0b11111000;  // порт на выход
LATB  &= 0b11111000;  // в порт ноль
idle_millisec = 2; OSCCON = OSCCON_START_STATE; SLEEP(); // Ждём пока стечёт заряд
microsec = 0;              // Счётчик микросекунд, инкементируется таймером
TMR0H = TIMER0_H; TMR0L = TIMER0_L; // Установка таймера на прерывание каждые 5с
TMR0ON = 1;                                      // Включили таймер
TRISB |= 0b00000111;                        // Порт на вход
while ( RB0 == 0 ) { __delay_us(1); };    // Вот тут висиииим =(
TMR0ON = 0;
button_1_open_time = microsec + 10; }

На всякий случай: резистор 1.3 МОм, конденсатор 27 пФ.

Есть идеи у кого-нибудь, с чем это может быть связано?

pasha_zv 31.08.2017 09:24

Re: Сенсорный ввод на PIC
 
плату от флюса нормально то отмыл?
а то бывали чудеса.

CocuckuH 31.08.2017 12:34

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от pasha_zv (Сообщение 233938)
плату от флюса нормально то отмыл?
а то бывали чудеса.

Да это ж ёмкостной датчик, ему флюс по боку должен быть...

DimaS 31.08.2017 12:38

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от CocuckuH (Сообщение 233942)
Да это ж ёмкостной датчик, ему флюс по боку должен быть...

А утечка?

ampersant 31.08.2017 12:39

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от CocuckuH (Сообщение 233942)
Да это ж ёмкостной датчик, ему флюс по боку должен быть...

ничего не получится. физика процесса не понята тс.

maagalex 31.08.2017 12:50

Re: Сенсорный ввод на PIC
 
Зачем так мучиться?
https://youtu.be/KmoG8AZ5bqg

CocuckuH 31.08.2017 13:41

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от maagalex (Сообщение 233948)
Зачем так мучиться?
https://youtu.be/KmoG8AZ5bqg

Дак можно вообще тогда ничё не делать, купить ардуину и скетчей накачать.

CocuckuH 31.08.2017 13:42

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от DimaS (Сообщение 233943)
А утечка?

Утечка с чего и куда?

Guaho 31.08.2017 18:31

Re: Сенсорный ввод на PIC
 
На мой взгляд, ёмкость конденсатора маловата. Чем меньше эта ёмкость, тем меньше влияние ёмкости тела человека на время заряда. Увеличьте ёмкость до 100 пФ, как в оригинальной схеме.

DimaS 31.08.2017 18:46

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от CocuckuH (Сообщение 233951)
Утечка с чего и куда?

Между входом проца и землей/питанием, между сконцами мегомного резистора, между обоими концами конденсатора.
Если флюс активный, и небыл прогрет до соотв. температуры, или просто дерьмовый флюс - оно все вполне может быть электропроводно, и для высокоимпедансных цепей может пагубно сказаться.

sdn_sdn 31.08.2017 18:52

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от CocuckuH (Сообщение 233935)
Доброго всем!

Пытаюсь собрать сенсорную панельку на PIC18F2580. И теорию и схему взял из статьи на Хабре: https://geektimes.ru/post/256674/

Так вот, уже на этапе калибровки контроллер не хочет работать как задумано. Программа стопорится на первом же цикле while, будто никакого заряда ёмкости и не происходит вовсе:

Код:

void CallibrateButtons(void) {
TRISB &= 0b11111000;  // порт на выход
LATB  &= 0b11111000;  // в порт ноль
idle_millisec = 2; OSCCON = OSCCON_START_STATE; SLEEP(); // Ждём пока стечёт заряд
microsec = 0;              // Счётчик микросекунд, инкементируется таймером
TMR0H = TIMER0_H; TMR0L = TIMER0_L; // Установка таймера на прерывание каждые 5с
TMR0ON = 1;                                      // Включили таймер
TRISB |= 0b00000111;                        // Порт на вход
while ( RB0 == 0 ) { __delay_us(1); };    // Вот тут висиииим =(
TMR0ON = 0;
button_1_open_time = microsec + 10; }

На всякий случай: резистор 1.3 МОм, конденсатор 27 пФ.

Есть идеи у кого-нибудь, с чем это может быть связано?

Реализуйте, вместо этой бороды, программный CVD на данном мк.
Так же во многих мк, у микрочипа, есть апаратные модули CVD.

petrd 31.08.2017 20:58

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от DimaS (Сообщение 233943)
А утечка?

А RB0 в цифровой режим переведен?

CocuckuH 01.09.2017 02:40

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от Guaho (Сообщение 233952)
На мой взгляд, ёмкость конденсатора маловата. Чем меньше эта ёмкость, тем меньше влияние ёмкости тела человека на время заряда. Увеличьте ёмкость до 100 пФ, как в оригинальной схеме.

Дельная мысль. Просто дома были только 27 пФ. Попробую, спасибо.

Цитата:

Сообщение от DimaS (Сообщение 233953)
Между входом проца и землей/питанием, между сконцами мегомного резистора, между обоими концами конденсатора.
Если флюс активный, и небыл прогрет до соотв. температуры, или просто дерьмовый флюс - оно все вполне может быть электропроводно, и для высокоимпедансных цепей может пагубно сказаться.

Не, флюс - обычная канифоль, она не особо проводящая. Ну и я не сильно ею плату залил, грязи минимум. Плата на которой собран МК вообще изготовлена на заказ в Резоните, никаких "соплей" точно нет.

Плату сенсора попробую отмыть получше ещё, спасибо за наводку.

Как сделаю - отпишу тут.

CocuckuH 01.09.2017 02:45

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от petrd (Сообщение 233956)
А RB0 в цифровой режим переведен?

За состояние порта RB отвечают всего несколько регистров. Из них, кажется, три отвечают за прерывания. TRIS, LAT и PORT в коде видно.

Менять входной буфер ещё могут биты PCFG<3:0> в регистре ADCON1, но в моём случае есть

Код:

#pragma config PBADEN = OFF    // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
Так как я их не меняю после старта, очевидно у меня
Код:

PCFG<3:0> = 0111
То есть RB0 должен быть настроен как цифровой, и я всё делаю как говорит автор оригинальной идеи.

Вероятно, дело действительно в малой ёмкости сенсора.

sdn_sdn 01.09.2017 07:37

Re: Сенсорный ввод на PIC
 
Цитата:

Менять входной буфер ещё могут биты PCFG<3:0> в регистре ADCON1, но в моём случае есть
Код:

#pragma config PBADEN = OFF    // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
Цитата:

Так как я их не меняю после старта, очевидно у меня
Код:

PCFG<3:0> = 0111
Откуда очевидно ? В зависимости от состояния бита PBADEN.
Цитата:

Note 1: The POR value of the PCFG bits depends on the value of the PBADEN bit in Configuration Register 3H.
When PBADEN = 1, PCFG<3:0> = 0000; when PBADEN = 0, PCFG<3:0> = 0111.
А PBADEN, по дефолту = 1
Цитата:

1--- -01-
(второй бит)
Так что прописать инициализацию нужно.
А вообще возьмите и проверьте напрямую цифровой он или нет и не гадайте.

CocuckuH 01.09.2017 14:25

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от sdn_sdn (Сообщение 233963)
Код:

#pragma config PBADEN = OFF    // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
Код:

PCFG<3:0> = 0111
Откуда очевидно ? В зависимости от состояния бита PBADEN.

А PBADEN, по дефолту = 1
(второй бит)
Так что прописать инициализацию нужно.
А вообще возьмите и проверьте напрямую цифровой он или нет и не гадайте.

PBADEN = OFF
В конфиге это как раз обнуление этого бита.

А как проверить напряму цифровой он или нет?

petrd 01.09.2017 14:42

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от CocuckuH (Сообщение 233970)
PBADEN = OFF
А как проверить напряму цифровой он или нет?

В отладке посмотреть содержимое регистра ADCON1.

sdn_sdn 01.09.2017 18:39

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от CocuckuH (Сообщение 233970)
PBADEN = OFF
В конфиге это как раз обнуление этого бита.

Да, что - то я слона и не заметил.
Цитата:

Сообщение от CocuckuH (Сообщение 233970)
PBADEN = OFF

А как проверить напряму цифровой он или нет?

Напейсанием тестовой программки с кнопкой и светодиодом.

CocuckuH 01.09.2017 23:44

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от petrd (Сообщение 233971)
В отладке посмотреть содержимое регистра ADCON1.

У меня почему-то клон Pickit2 с Mplab X не хочет отлаживать. Шить через официальную прогу - шьёт, а при попытке отладить прошивку, говорит "not dklab device".

Я так понимаю, он ругается что это клон. Купить оригинал или хотя бы копию оригинала пока руки никак не доходят... Так-то с отладчиком в мильён раз удобнее, конечно было бы.

smart_pic 02.09.2017 07:14

Re: Сенсорный ввод на PIC
 
Вложений: 1
вот делал сенсорную клавиатуру, может кому пригодится.
Полученное значение счетчика сравниваем с пороговым значением и затем принимается решение о касании к кнопке.
Калибровка происходит при старте. Для калибровки достаточно считать значение когда кнопки не касаются.
Код:

//****************************************************************************
void CAP_keyboard1(void)
{
    CAPkey1_TRIS=0;
    CAPkey1_OUT=0;

    TMR1H = 0x00;
    TMR1L = 0x00;
    T1CON = 0x20;
   
    INTCONbits.GIE=0;            // disable interrupts
    CAPkey1_TRIS=1;
    T1CONbits.TMR1ON=1;            //  старт таймера
    while(CAPkey1_I == 0) ;
    T1CONbits.TMR1ON=0;            //  стоп таймера
    INTCONbits.GIE=1;            // enable interrupts

    cap_timer1.byte.HB=TMR1H;
    cap_timer1.byte.LB=TMR1L;

    CAPkey1_OUT=0;
    CAPkey1_TRIS=0;            // разрядили вход
}
//****************************************************************************

вот фото макета.
Сенсорные кнопки выполнены напылением, диаметр кнопок примерно 15-20мм.

CocuckuH 12.09.2017 20:07

Re: Сенсорный ввод на PIC
 
Всем спасибо за участие!

Наконец заработало. В коде проблем не было.

Резюмирую - утечки действительно имеют место, надо обращать внимание на схемотехнику и на плату.

В моём случае, на плате было место, где провода, идущие от сенсора, из-за слишком большого количества припоя очень близко проходили рядом с землёй, из-за чего (видимо через остатки флюса) образовывалась паразитная ёмкость либо небольшая проводимость на землю, которая не давала зарядиться сенсору.

Кроме того, на одном из портов стояли обратно включенные диоды на землю - защита от перенапряжения. После того как два других сенсора заработали, я выяснил, что даже через обратно включенный диод идёт утечка на землю, в результате чего сенсор никогда не зарядится. Вывод - с порта сенсорного ввода надо убирать всё лишнее.

Весь код оформил в подключаемый файл, а также всё подробно описал в отдельной статье, кому интересно:
http://chipinfo.pro/mcu/pic/sensor.shtml

smart_pic 14.09.2017 09:21

Re: Сенсорный ввод на PIC
 
Посмотрел статью.
Одно небольшое замечание. Если используем порт с внутренними подтягивающими резисторами , то в конфигурации порта их нужно отключить, иначе получите проблему с симптомами , которые уже описали.
Резистор на +Питания ставить больше 470кОм особо не имеет смысла, так как на практике трудно обеспечить высокое сопротивление материалов сенсорной клавиатуры. Всегда есть утечки на землю. В итоге получаем резистивный делитель и Конденсатор нашей сенсорной клавиатуры не заряжается до порогового напряжения входа микроконтроллера с вытекающими последствиями.

CocuckuH 14.09.2017 10:10

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от smart_pic (Сообщение 234283)
Посмотрел статью.
Одно небольшое замечание. Если используем порт с внутренними подтягивающими резисторами , то в конфигурации порта их нужно отключить, иначе получите проблему с симптомами , которые уже описали.
Резистор на +Питания ставить больше 470кОм особо не имеет смысла, так как на практике трудно обеспечить высокое сопротивление материалов сенсорной клавиатуры. Всегда есть утечки на землю. В итоге получаем резистивный делитель и Конденсатор нашей сенсорной клавиатуры не заряжается до порогового напряжения входа микроконтроллера с вытекающими последствиями.

Спасибо за замечания!

Добавил в раздел "на что обратить внимание".

BarsTmb 15.09.2017 06:26

Re: Сенсорный ввод на PIC
 
Ещё замечание. Никогда в программах "для заказчика" (для себя любимого можете делать как Вам угодно) не используйте конструкции, приводящие к ситуации, когда устройство внешне кажется полностью неработоспособным.
В вашем случае - это бесконечный цикл на кнопке. Любая грязь или утечка - и капут всей системе. Обязательно оставляйте способы аварийного выхода - например по таймеру или поставив счётчик максимума циклов. В интерфейс Вашего пакета подпрограмм можно ввести аварийный флаг и функцию проверки исправности сенсоров.

CocuckuH 15.09.2017 16:01

Re: Сенсорный ввод на PIC
 
Цитата:

Сообщение от BarsTmb (Сообщение 234314)
Ещё замечание. Никогда в программах "для заказчика" (для себя любимого можете делать как Вам угодно) не используйте конструкции, приводящие к ситуации, когда устройство внешне кажется полностью неработоспособным.
В вашем случае - это бесконечный цикл на кнопке. Любая грязь или утечка - и капут всей системе. Обязательно оставляйте способы аварийного выхода - например по таймеру или поставив счётчик максимума циклов. В интерфейс Вашего пакета подпрограмм можно ввести аварийный флаг и функцию проверки исправности сенсоров.

В данном случае, если сенсор будет по какой-то причине неисправен - всё устройство можно тупо выкинуть.


Часовой пояс GMT +3, время: 21:34.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot