Страница 1 из 1

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

Добавлено: Вт окт 18, 2016 16:06:30
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 ();
}
вот мы заходим в цикл после функции подготовки к работе. И сразу укладываем пик спать. Далее по идее по приходу импульса от сенсора пик должен по первому же положительному фронту проснулся и перейти на следуюший оператор идуший за функцией слиип () также?
А там у меня идет проверка наличия импульса но ноге пика, потом малая пауза и потом перепроверка для фильтрации помех, так если положительный уровень установлен (то есть не помеха а тот самый импульс от сенсора) то включаем ключ и светик и держим так пол минуты.
Но в реале пик отпипикивается по функции начальной так сказать инициализации и потом замолкает и вродь внешне как ушел спать, но как я там руками не махаю перед сенсором — ноль реакции. То есть видимо не просыпаеца. Что же не так?
Вот снимок с осцила показывающий что сенсор импульсы кидает исправно, то есть проблема не в нем.
Изображение

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

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

П.с. Что это?

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

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

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

Добавлено: Вт окт 18, 2016 17:24:17
КРАМ
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)

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

Добавлено: Ср окт 19, 2016 07:58:59
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:
и еще такой ворпос - у нас есть макрос - глобального разрешения прервыний, а также переферийные прерывания разрешение (к этим периферийным что именно относиться? все что внутри типа таймеры ацп и тд или что?)

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

Добавлено: Ср окт 19, 2016 09:41:30
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.

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

Добавлено: Чт окт 20, 2016 11:48:21
roman89
Я всетаки поставил себе конфигуратор но более старой версии. Действительно кривые руки микрочип сделали баг в конфигураторе. Теперь заработало. Но не все. Вот код который я написал по новому, тоже криво наверно — но хоть как то работает. Но после активации режима слип () пик по моему не просыпаеца, кароч со слип () не работает. И второй вопрос связанный с PIR датчиком — он дает слишком большой импульс — около 2 сек минимум. Подскажите как сократить импульс скажем до 200-300 мс. Я знаю там по моему RC цепочка, сокращением либо резистора либо емкости кондера можно уменьшить длительность так же? Только вот там не один кондер и резистор а несколько, так какие же надо сокращать? Вот новый файл проекта прикрепил.
Изображение

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

Добавлено: Чт окт 20, 2016 12:32:28
КРАМ
roman89 писал(а):как сократить импульс[/url]
Зачем?
МК по барабану длина импульса. Прерывание выводящее из слипа должно быть сконфигурировано на необходимый активный фронт.
ЗЫ. Если честно, то лично у меня практически нет никакого желания Вам что либо объяснять, поскольку Вы упорно не желаете хоть что нибудь изучать...

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

Добавлено: Чт окт 20, 2016 14:07:31
abc
кривые руки микрочип
а есть смайл с завалившимся на спину котом в истошном приступе смеха ?

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

Добавлено: Чт окт 20, 2016 18:27:09
roman89
Я прекрасно знаю что по положительно музыку фронту и длина импульса не здравствуйте значения. Но я хочу ууменьшить длину по другой причине. Вопрос в силе.

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

Добавлено: Чт окт 20, 2016 19:30:59
Zhuk72
Ставьте между ПИРом и ПИКом триггер какой нибудь, чтоб он давал короткий импульс при получении длинного.
Но я пока не вижу в этом никакого смысла. О какой силе идет речь?

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

Добавлено: Пт окт 21, 2016 17:16:11
roman89
там по моему просто мне раньше показывали схему данного датчика и там есть RC цепочка от нее зависит длительность импульса, нужно лишь поменять номиналы, только нет у меня щас этого может кто скинет? триггер - излишний обвес. вопрос в силе- это такое выражение то есть вопрос еще имеет актуальность