Есть пик 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 (); }
вот мы заходим в цикл после функции подготовки к работе. И сразу укладываем пик спать. Далее по идее по приходу импульса от сенсора пик должен по первому же положительному фронту проснулся и перейти на следуюший оператор идуший за функцией слиип () также? А там у меня идет проверка наличия импульса но ноге пика, потом малая пауза и потом перепроверка для фильтрации помех, так если положительный уровень установлен (то есть не помеха а тот самый импульс от сенсора) то включаем ключ и светик и держим так пол минуты. Но в реале пик отпипикивается по функции начальной так сказать инициализации и потом замолкает и вродь внешне как ушел спать, но как я там руками не махаю перед сенсором — ноль реакции. То есть видимо не просыпаеца. Что же не так? Вот снимок с осцила показывающий что сенсор импульсы кидает исправно, то есть проблема не в нем.
Есть пик 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)
Кароч такая фишка. мой пик должен спать все время пока не придет импульс на ножку 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: и еще такой ворпос - у нас есть макрос - глобального разрешения прервыний, а также переферийные прерывания разрешение (к этим периферийным что именно относиться? все что внутри типа таймеры ацп и тд или что?)
Ищем 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 лет смотрел черно-белый телевизор.
Я всетаки поставил себе конфигуратор но более старой версии. Действительно кривые руки микрочип сделали баг в конфигураторе. Теперь заработало. Но не все. Вот код который я написал по новому, тоже криво наверно — но хоть как то работает. Но после активации режима слип () пик по моему не просыпаеца, кароч со слип () не работает. И второй вопрос связанный с PIR датчиком — он дает слишком большой импульс — около 2 сек минимум. Подскажите как сократить импульс скажем до 200-300 мс. Я знаю там по моему RC цепочка, сокращением либо резистора либо емкости кондера можно уменьшить длительность так же? Только вот там не один кондер и резистор а несколько, так какие же надо сокращать? Вот новый файл проекта прикрепил.
Зачем? МК по барабану длина импульса. Прерывание выводящее из слипа должно быть сконфигурировано на необходимый активный фронт. ЗЫ. Если честно, то лично у меня практически нет никакого желания Вам что либо объяснять, поскольку Вы упорно не желаете хоть что нибудь изучать...
Я прекрасно знаю что по положительно музыку фронту и длина импульса не здравствуйте значения. Но я хочу ууменьшить длину по другой причине. Вопрос в силе.
Ставьте между ПИРом и ПИКом триггер какой нибудь, чтоб он давал короткий импульс при получении длинного. Но я пока не вижу в этом никакого смысла. О какой силе идет речь?
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
там по моему просто мне раньше показывали схему данного датчика и там есть RC цепочка от нее зависит длительность импульса, нужно лишь поменять номиналы, только нет у меня щас этого может кто скинет? триггер - излишний обвес. вопрос в силе- это такое выражение то есть вопрос еще имеет актуальность
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения