Easyelectronics.ru

Электроника для всех
Текущее время: 27 мар 2017, 11:39

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по спящему режиму
СообщениеДобавлено: 09 окт 2016, 10:08 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
Есть пик 12f1822 . Первый вопрос такой - от чего может просыпаца данный пик? то все что его может разбудить?
Второе - задача чтобы пик спал и его будило от PIR сенсора - реально такое?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 09 окт 2016, 10:13 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
и что такое WPU???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 09 окт 2016, 11:50 
Свой человек

Зарегистрирован: 28 апр 2010, 00:17
Сообщения: 103
Откуда: picping.lg.ua
WPU - регистр, где установленная единица включает подтяжку к плюсу указанного пина, при этом должно быть включено общее разрешение подтяжки (OPTOIN, WPUEN)

Проц может проснуться
- от переполнения WDT, сброс не происходит.
- от любого события, генерирующее прерывания. Причем само прерывание может не обрабатываться. (запрещено глобально)

PIR датчик на ногу процессора, где есть прерывание от изменения уровня. Включаем прерывание от этой ноги. Глобально запрещаем прерывания и WDT.
Процессор в сон (sleep).
Проц будет стоять пока не произойдет изменение сигнала от PIR сенсора. Как только сигнал изменится, программа пойдет далее со следующей команды , после SLEEP.

Если еще чего-то иногда надо делать, то вкл WDT с нужным периодом, и после просыпания анализ, почему проснулись, если WDT то чего-то делаем , потом снова спим или обработка PIR.

Перед входом в сон - сбросить флаги прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 09 окт 2016, 22:18 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
То есть глобально прерывания все запрещены но прерывание от позитивного фронта на ноге пика активно так?
Вот также вопрос по ватчдог таймеру,как его настраивать?не нашел я в код конфигураторе как его настроить.
Пропиши мне команду сброса флагов.
И еще такой вопрос что такое в код конфигураторе в настройке пинов там же где этот wpu там есть еще галочку можно ставить на analog это что за фишка??? Альтернативная функция ножки чтоли? Просто если я к примеру хочу пин просто выходом сделать я всеравно могу ставить туда галочку


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 10 окт 2016, 18:21 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
Перепробовал много, не просыпаеца пик и все тут. Но может я чето не так сделал, вот кароч настройки в код конфигураторе:
Изображение
У меня внешнее прерывание на пине РА0 по позитивному фронту (сенсор при появлении движения выдает 3 вольта длительностью 2 секунды примерно импульс).
Изображение
Вот тут я так понял активируется вектор прерываний, вот я поставил галку энаблед.
Вот сам код проги (эта прога не полная — только начинаю шаг за шагом):
Код:
void START_pause (void);
/*
                         Main application
*/
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:
    START_pause();
    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();   --- я тут игрался и так и так

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();  --- тут тоже вариировал и так и эдак

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
   
    int b = 0;
    while (1)
    {
        SLEEP ();
        if ((b = SENS_GetValue ()) == 1)
        {
            __delay_ms (20);
            if ((b = SENS_GetValue ()) == 1)
            {
                KEY_SetHigh ();
                LED_SetHigh ();
                __delay_ms (500);
            }
        }
    }
}

void START_pause (void)
{
    int i = 70;
    int c = 0;
    while (i >= 10)
    {
        BEEP_SetHigh ();
        LED_SetHigh ();
        __delay_ms (200);
        BEEP_SetLow ();
        LED_SetLow ();
        for (c = 0; c < i; c++ )
            __delay_ms (10);
        i = i - 2;
    }
    BEEP_SetHigh ();
    LED_SetHigh ();
    for (i = 0; i <= 20; i++)
        __delay_ms (100);
    BEEP_SetLow ();
    LED_SetLow ();
}


вот мы заходим в цикл после функции подготовки к работе. И сразу укладываем пик спать. Далее по идее по приходу импульса от сенсора пик должен по первому же положительному фронту проснулся и перейти на следуюший оператор идуший за функцией слиип () также?
А там у меня идет проверка наличия импульса но ноге пика, потом малая пауза и потом перепроверка для фильтрации помех, так если положительный уровень установлен (то есть не помеха а тот самый импульс от сенсора) то включаем ключ и светик и держим так пол минуты.
Но в реале пик отпипикивается по функции начальной так сказать инициализации и потом замолкает и вродь внешне как ушел спать, но как я там руками не махаю перед сенсором — ноль реакции. То есть видимо не просыпаеца. Что же не так?
Вот снимок с осцила показывающий что сенсор импульсы кидает исправно, то есть проблема не в нем.
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 10 окт 2016, 22:12 
Свой человек

Зарегистрирован: 28 апр 2010, 00:17
Сообщения: 103
Откуда: picping.lg.ua
Порядок действий следующий ( для улучшенного ядра PIC161xxx, для старых - по другому)
запретить глобальные прерывания
настроить пин порта на ввод
отключить от него аналоговые функции
включить IOCIE: Interrupt-on-Change Enable bit
включить бит на порту IOCAP (если фронт)

М1:
(ту я еще отключаю все лишнее для снижения потребления, остальные порты либо аналоговые либо на вывод, etc.)
очистить флаг прерывания IOCAF
SLEEP
следующая команда исполняется когда было условие прерывания или WDT - у нас IOCAF по фронту (IOCAP)
проверять уровень не имеет смысла, фронт был - точно.
выполняем, чего хочется,
проверяем , если порт успокоился и датчик отключился
очистить флаг прерывания IOCAF
GOTO M1

Основная ваша ошибка - нет нигде очистки флага наступившего прерывания.
Естественно следующее не возникнет.


PS
В новых ядрах PIC16 можно выбирать тип входа ST или TTL - следите за уровнями входных сигналов по отношению к питанию.
Конкретно для вашего - по моему там только TTL

PS2
Использовать задержки - плохой тон.
Используйте событийное программирование или ожидание исполнения условий
Причем все ожидания должны иметь выход по таймауту с ошибкой для обработчика ошибок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 10 окт 2016, 22:28 
Свой человек

Зарегистрирован: 28 апр 2010, 00:17
Сообщения: 103
Откуда: picping.lg.ua
Решил тут дописать для защиты от помех.
Если необходима проверка длинного уровня по входу а не просто фронта:

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 11 окт 2016, 18:54 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
вот кому не лень проектик для мплаб икс. посмотрите что не так


Вложения:
light_control.X.zip [166.79 Кб]
Скачиваний: 13
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 11 окт 2016, 19:18 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
Driver_gv писал(а):
Порядок действий следующий ( для улучшенного ядра PIC161xxx, для старых - по другому)
запретить глобальные прерывания
настроить пин порта на ввод
отключить от него аналоговые функции
включить IOCIE: Interrupt-on-Change Enable bit
включить бит на порту IOCAP (если фронт)

М1:
(ту я еще отключаю все лишнее для снижения потребления, остальные порты либо аналоговые либо на вывод, etc.)
очистить флаг прерывания IOCAF
SLEEP
следующая команда исполняется когда было условие прерывания или WDT - у нас IOCAF по фронту (IOCAP)
проверять уровень не имеет смысла, фронт был - точно.
выполняем, чего хочется,
проверяем , если порт успокоился и датчик отключился
очистить флаг прерывания IOCAF
GOTO M1

Основная ваша ошибка - нет нигде очистки флага наступившего прерывания.
Естественно следующее не возникнет.


PS
В новых ядрах PIC16 можно выбирать тип входа ST или TTL - следите за уровнями входных сигналов по отношению к питанию.
Конкретно для вашего - по моему там только TTL

PS2
Использовать задержки - плохой тон.
Используйте событийное программирование или ожидание исполнения условий
Причем все ожидания должны иметь выход по таймауту с ошибкой для обработчика ошибок.

первый вопрос - у меня пик 12ф1822 - это старое ядро или новое?
второй - напиши алгоритм для моего ядра
третий - да у меня и первое то не наступает прерывание
четвертый - в смысле в моем только ттл, у меня пик работает от 5 вольт а датчик выдает импульсы ровно 3 вольта - неужели пику это не хватит чтобы принять за единицу?
использовать задержки плохой тон - я сам так подозревал но попродробней с примером обьсяни что мне использовать. лучше пример а то я не понял что ты в конце имел в виду


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 11 окт 2016, 19:21 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
Driver_gv писал(а):
Решил тут дописать для защиты от помех.
Если необходима проверка длинного уровня по входу а не просто фронта:

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

то есть ты предлагаешь просто вместо задержке использовать таймер?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 12 окт 2016, 15:54 
Свой человек

Зарегистрирован: 05 дек 2015, 16:56
Сообщения: 168
Судя по вопросам даташит даже не пробовал читать. "Напиши","обьясни" ...всё на ты да ещё и в приказном склонении.
Новый вид - гопота из электриков?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 12 окт 2016, 18:31 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
не надо на меня плакать!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по спящему режиму
СообщениеДобавлено: 13 окт 2016, 21:44 
Свой человек

Зарегистрирован: 15 авг 2016, 08:50
Сообщения: 80
Видимо вопрос сложный, который день захожу - тишина как в зимнем лесу


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 5 часов


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

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB