Вопрос по спящему режиму

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Родился
Сообщения: 5
Зарегистрирован: Вт окт 18, 2016 16:02:54

Сообщение roman89 »

Есть пик 12f1822 . Первый вопрос такой - от чего может просыпаца данный пик? то все что его может разбудить?
Второе - задача чтобы пик спал и его будило от PIR сенсора - реально такое?

Перепробовал много, не просыпаеца пик и все тут. Но может я чето не так сделал, вот кароч настройки в код конфигураторе:
Изображение
У меня внешнее прерывание на пине РА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 ();
}
вот мы заходим в цикл после функции подготовки к работе. И сразу укладываем пик спать. Далее по идее по приходу импульса от сенсора пик должен по первому же положительному фронту проснулся и перейти на следуюший оператор идуший за функцией слиип () также?
А там у меня идет проверка наличия импульса но ноге пика, потом малая пауза и потом перепроверка для фильтрации помех, так если положительный уровень установлен (то есть не помеха а тот самый импульс от сенсора) то включаем ключ и светик и держим так пол минуты.
Но в реале пик отпипикивается по функции начальной так сказать инициализации и потом замолкает и вродь внешне как ушел спать, но как я там руками не махаю перед сенсором — ноль реакции. То есть видимо не просыпаеца. Что же не так?
Вот снимок с осцила показывающий что сенсор импульсы кидает исправно, то есть проблема не в нем.
Изображение
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

roman89 писал(а):Есть пик 12f1822 . Первый вопрос такой - от чего может просыпаца данный пик? то все что его может разбудить?
Даташит, раздел 9 читали? Вряд ли.

П.с. Что это?

Код: Выделить всё

INTERRUPT_GlobalInterruptEnable(); 
Вернее я могу это понять, но поймет ли это пик? Что это за среда программирования?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25613
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

roman89 писал(а):Есть пик 12f1822 . Первый вопрос такой - от чего может просыпаца данный пик? то все что его может разбудить?
Второе - задача чтобы пик спал и его будило от PIR сенсора - реально такое?
Учимся читать даташит писал(а):9.1 Wake-up from Sleep
The device can wake-up from Sleep through one of the
following events:
1. External Reset input on MCLR pin, if enabled
2. BOR Reset, if enabled
3. POR Reset
4. Watchdog Timer, if enabled
5. Any external interrupt
6. Interrupts by peripherals capable of running
during Sleep (see individual peripheral for more
information)
Родился
Сообщения: 5
Зарегистрирован: Вт окт 18, 2016 16:02:54

Сообщение roman89 »

Кароч такая фишка. мой пик должен спать все время пока не придет импульс на ножку RA0. По приходу положительного фронта просыпаемся, проверяем действительно ли это испульс а не помеха и если все так то включаем релешку и диод. вот код который я написал:

Код: Выделить всё

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 (flag_PIR == 1)
        {
            INTERRUPT_GlobalInterruptDisable();
            __delay_ms (20);
            if ((b = SENS_GetValue ()) == 1)
            {
                KEY_SetHigh ();
                LED_SetHigh ();
                __delay_ms (500);
            }
            flag_PIR = 0;
            INTERRUPT_GlobalInterruptEnable();
        }
    }
}
Добавлено after 14 minutes 37 seconds:
Изображение
смотри картинку выше. кто пользовался код конфигуратором знает, какие он файлы генерирует.
я все там установил для прерывания по приходу положительного импульса. но трудность у меня в том что.вот спит пик. пришел положительный фронт - пошло прерывание. в функции обработки прерывания я поставил переменную флаг, в которой должна записаца единица, если пришло прерывание. и потом сразу возвращаемся в майн функцию и там смотрим стала ли единицей эта переменная ну и так далее - смотри код. но в реале ниче не работает - реакции устройства на импульс ноль. у меня сомнения в том - правильно ли я сделал этот флаг, типа область видимости или в си же передача по значению в функцию то происходит, кароч не понял я ничего. вот еще могу скинуть весь проект.

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

Добавлено after 17 minutes 23 seconds:
и еще такой ворпос - у нас есть макрос - глобального разрешения прервыний, а также переферийные прерывания разрешение (к этим периферийным что именно относиться? все что внутри типа таймеры ацп и тд или что?)
Вложения
light_control.X.zip
(166.79 КБ) 157 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Проект надо не скинуть, а выкинуть и писать с нуля, причем традиционным методом, а не понадеявшись на конструктор.
Хотите доказательств? Пожалуйста.

Программа начинается с SYSTEM_Initialize(). Находим ее и видим следующее:

Код: Выделить всё

void SYSTEM_Initialize(void)
{
    
    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
}
Ищем PIN_MANAGER_Initialize() и помимо всего прочего что мы видим? А вот что:

Код: Выделить всё

    // interrupt on change for group IOCAF - flag
    IOCAFbits.IOCAF0 = 0; // Pin : RA0

    // interrupt on change for group IOCAN - negative
    IOCANbits.IOCAN0 = 0; // Pin : RA0

    // interrupt on change for group IOCAP - positive
    IOCAPbits.IOCAP0 = 0; // Pin : RA0

    INTCONbits.IOCIE = 1; // Enable IOCI interrupt
Расшифровать? Без проблем. RA0, согласно вышеуказанному, НЕ БУДЕТ реагировать ни на положительный фронт, ни на отрицательный. И после этого разрешается прерывание по изменению неизменяемого.
Далее идут разрешения глобальных и периферийных прерываний, но это уже не имеет смысла, т.к. источник прерываний ОТКЛЮЧЕН.

Я не ас, я в некотором роде тоже начинающий, но эти ошибки просто бросаются в глаза. Мне хватило 5 минут, чтоб разобраться в исходниках и свериться с ДШ.
Так что забудьте про МСС, берите ДШ и пишите традиционным методом без лишнего мусора. Вот и все, что я могу посоветовать.

P.S. И вдогонку еще один совет. Для начала добейтесь того, чтобы ПИК реагировал на датчик в обычном режиме. А вот когда добьетесь этого, тогда и вводите SLEEP.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Родился
Сообщения: 5
Зарегистрирован: Вт окт 18, 2016 16:02:54

Сообщение roman89 »

Я всетаки поставил себе конфигуратор но более старой версии. Действительно кривые руки микрочип сделали баг в конфигураторе. Теперь заработало. Но не все. Вот код который я написал по новому, тоже криво наверно — но хоть как то работает. Но после активации режима слип () пик по моему не просыпаеца, кароч со слип () не работает. И второй вопрос связанный с PIR датчиком — он дает слишком большой импульс — около 2 сек минимум. Подскажите как сократить импульс скажем до 200-300 мс. Я знаю там по моему RC цепочка, сокращением либо резистора либо емкости кондера можно уменьшить длительность так же? Только вот там не один кондер и резистор а несколько, так какие же надо сокращать? Вот новый файл проекта прикрепил.
Изображение
Вложения
light_control.X.zip
(150.34 КБ) 169 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25613
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

roman89 писал(а):как сократить импульс[/url]
Зачем?
МК по барабану длина импульса. Прерывание выводящее из слипа должно быть сконфигурировано на необходимый активный фронт.
ЗЫ. Если честно, то лично у меня практически нет никакого желания Вам что либо объяснять, поскольку Вы упорно не желаете хоть что нибудь изучать...
abc
Друг Кота
Аватара пользователя
Сообщения: 3688
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Сообщение abc »

кривые руки микрочип
а есть смайл с завалившимся на спину котом в истошном приступе смеха ?
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Родился
Сообщения: 5
Зарегистрирован: Вт окт 18, 2016 16:02:54

Сообщение roman89 »

Я прекрасно знаю что по положительно музыку фронту и длина импульса не здравствуйте значения. Но я хочу ууменьшить длину по другой причине. Вопрос в силе.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Ставьте между ПИРом и ПИКом триггер какой нибудь, чтоб он давал короткий импульс при получении длинного.
Но я пока не вижу в этом никакого смысла. О какой силе идет речь?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Вт окт 18, 2016 16:02:54

Сообщение roman89 »

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

Вернуться в «PIC»