Перейти к содержанию

Использование Режима Сна В Мк Atmega16


Рекомендуемые сообщения

Доброго времени суток!

В данный момент занимаюсь разработкой протсой ДЖСМ-автосигнализации на МК. Сигнализацию делаю для себя :) В качестве датчиков используются:

1)ИК датчик движений

2) креш-сенсор (датчик удара)

Собственно, платы я уже все спаял и проверил. Теперь дошло время до написания программы в МК.

Вопрос следующий:

Как использовать режим сна и возможно ли в режиме сна такое:

(порт С работает на выхо) перед "засыпанием" допустим, выставили некоторые биты порта =1 и во время сна они должны быть тоже 1.

МК будет пробуждаться по приходу сигнала от любого из 2-х датчиков.

Читал курс Авер (не полностью), но там не нашел достаточного кол-ва информации.

Фотки готового девайса с прошивкой будут выложены в форуме "автосигнализации" :)

Изменено пользователем Дмитрий Андреевич
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

А какой мк хотите применить в своём устройстве?,

Думаю что ваши датчики движения/удара, питаются 12 вольтами, и особенно ДЖСМ модуль являются основными потребителями энергии, а мк минемальным в любом случае, встаёт вопрос о целесообразности применения спящего режима мк...

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

А какой мк хотите применить в своём устройстве?

mega16

ДЖСМ модуля пока еще нет, да и в качестве него я планирую использовать обычный мобильный телефон - просто подключу порты МК к кнопкам и все. Мне кажется, так будет проще :) Телефон же потребляет не много.

Датчики питаются 1-й от 5 В. 2-й от 8. про токи потребления сказать не могу, но они не большие (в сумме порядка 30 мА).

Просто у меня же еще приемник радио-сигнала будет стоять (а это еще +20мА). Вот и пытаюсь всецело экономить электроэнергию.

МОжно поинтересоваться - сколько примерно потребляет МК в активном режиме?

тактовая частота может быть любой - главное экономия!

Изменено пользователем Дмитрий Андреевич
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В активном режиме, несколько мА, в зависимости от задейственных внутренних ус-в, +от частоты генератора,

чем выше частота соответственно выше потребление тока мк,

Можно взять самую экономичную модель mega16L , питание 3в, ток 1.1мА на 1МГц...

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Можно взять самую экономичную модель mega16L , питание 3в, ток 1.1мА на 1МГц...

О! Эт хорошо, спасибо большое! У меня, правда уже куплена 16Pu, но все-равно эт классно!

Думаю, просто частоту пониже выставлю с помощью фьюзов (внутренний генератор) и все :)

Спасиба!

Ссылка на комментарий
Поделиться на другие сайты

Внимательно изучите режимы пониженного энергопотребления... в каждом из них действует только определенная переферия...

Кроме того, из некоторых режимов "сна" МК выводится только по событиям определеннного характера! И не забывайте про флаги прерываний, ибо без них в спячке никак... ;)

Ссылка на комментарий
Поделиться на другие сайты

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

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

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

полностью согласен с выше сказаным.От себя: Мега во сне на порядок меньше потребляет, чем на 1мГц(е). Режим сна в даташате изложен довольно доступно. Прочитайте, что не понятно подскажу.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

ок. Спасибо за советы:)

Сейчас написал программу, прогнал в симуляторе. Осталось прошить. После прошивки померяю ток - подумаю, ставить сон или нет. Это нужно для автосигнализации, поэтому и пытаюсь "сэкономить".

Есть еще пару мелких вопросов:

1) При прошивании, + напряж. питания нужно подавать и на ножку AVCC, а минус также на AGND? Без подключения напряж. к вышеуказанным выводам пытался шить, пишет "connection error".

2) В начальном мастере кодевижена есть флаги настройки Сторожевого таймера. Метки от 32к до 2048к. Как их понимать? Это коэф. деления тактовой частоты? Как выставить максимальную паузу (устроит от 2сек). Где сделать вставки сброса таймера?

Потому что, я писал практически во всех циклах, писал перед while(1), а симулятор все равно пишет "Wachdog will produce a reset here" Пишет сразу после сброса таймера в цикле while(1). Это глюк или что-то делаю неправильно?

Ссылка на комментарий
Поделиться на другие сайты

Немного о WDT

Немного буду утрировать для лучшего понимания.

Что такое WDT: для пользователя это циклически работающий таймер, который если периодически не сбрасывать в ноль, при своем переполнении произведет перезапуск микроконтроллера (сделает контроллеру ресет). Если не рассматривать команды включения и установки WDT, то управляется он одной командой “WDR”. Это команда сбрасывает таймер в ноль и начинает новый цикл отсчета времени, до сброса микроконтроллера предотвратив текущий сброс.

Зачем нужен: Предотвращает зацикливание в программе, выводит микроконтроллера из состояния останова, зависания.

И так как его использовать: Вот тут то идеология использования WDT как раз очень сильно зависит от общей структуры вашей программы. Вы пишете «Потому что, я писал практически во всех циклах, писал перед while(1)» спрашивается откуда у Вас в программе такое количество «while(1)» циклов? И как Вы из них выходите? Если командой “break” в купе с “if” и флагом то еще ни чего, разве что не оптимально, если как то иначе, то хотелось бы посмотреть как. Покажите код (и не пугайтесь критики) а мы посмотрим куда воткнуть “WDR”.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

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

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Немного о WDT

Немного буду утрировать для лучшего понимания.

Что такое WDT: для пользователя это циклически работающий таймер, который если периодически не сбрасывать в ноль, при своем переполнении произведет перезапуск микроконтроллера (сделает контроллеру ресет). Если не рассматривать команды включения и установки WDT, то управляется он одной командой “WDR”. Это команда сбрасывает таймер в ноль и начинает новый цикл отсчета времени, до сброса микроконтроллера предотвратив текущий сброс.

Зачем нужен: Предотвращает зацикливание в программе, выводит микроконтроллера из состояния останова, зависания.

И так как его использовать: Вот тут то идеология использования WDT как раз очень сильно зависит от общей структуры вашей программы. Вы пишете «Потому что, я писал практически во всех циклах, писал перед while(1)» спрашивается откуда у Вас в программе такое количество «while(1)» циклов? И как Вы из них выходите? Если командой “break” в купе с “if” и флагом то еще ни чего, разве что не оптимально, если как то иначе, то хотелось бы посмотреть как. Покажите код (и не пугайтесь критики) а мы посмотрим куда воткнуть “WDR”.

Да нет, критика только приветствуется, т.к. главная задача - научится писать программы и отлаживать ус-ва. (Ну, попутно еще сделать что-то)

Цикл while(1) у меня ТОЛЬКО ОДИН. Я писал:

практически во всех циклах, писал перед while(1)
цикл while(1) только 1!

Просто у меня есть цикл for с временем выполнения до 1 мин (если не поступит прерывание).

Код пришлю вечером (сейчас не дома прост). Он немного может показаться "неправильным" с точки зрения программирования, но в симуляторе все работает. Проверять в железе буду сегодня.

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

По поводу отладки - так и сдлаю :)

Просто забюегая немного вперед, хотел спросить и о WDT.

По поводу питания разобрался - действительно надо на + напряж. питания нужно подавать и на ножку AVCC, а минус также на AGND.

Спасибо за советы.

Ссылка на комментарий
Поделиться на другие сайты

Да, на кристалле программа работает совсем не так как предполагалось...

В общем, не работает мой код ни фига :(

Вот код:

/*****************************************************

This program was produced by the

CodeWizardAVR V2.03.4 Standard

Automatic Program Generator

© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

Project : autoSIGN

Version : 1.0

Date : 27.05.2009

Author : Dmitriy Ivanov

Company :

Comments: Программа простой, но надежной автосигнализации, которая может быть дополнена GSM мобильным

телефоном для оповещения водителя. Нужно только дописать функцию call :)

Chip type : ATmega16

Program type : Application

Clock frequency : 1,000000 MHz

Memory model : Small

External RAM size : 0

Data Stack size : 256

*****************************************************/

#include <mega16.h>

#include <delay.h>

//Описание глобальных переменных

unsigned char on=1; //Перемнная вкл/выкл. сигнализации

unsigned char warning=0;//перемнная отчета "внимание"

unsigned char i;//Дополнительная служебная переменная

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)//прерывание по приходу сигнала от радиоприемника

{

PORTC.0=0;//отключаем звук в любом случае

PORTC.1=1;//включаем световую сигнализацию

for(i=(on)*2+4;i>0;i--){//пикаем 2 или 3 раза (в завис. от вкл/выкл)

PORTC.0^=1;

delay_ms(90);

}

delay_ms(500);

PORTC.1=0;//отключаем световую сигнализацию

PORTD.7^=1;//Переключаем светодиод

PORTC.2^=1;//Переключаем датчики

on++;//инкременируем вкл

if(on==2){//не надо, чтобы его зн-е было больше, чем 2.

on=0;}

}

// функция дозвона абоненту (в данный момент пуста)

/*void func_call(void)

{

}*/

//функция активного оповещения окружающих :)

void func_sirena(void)

{

PORTC.0=0;//отключаем звук в любом случае

PORTC.1=1;//включаем световую сигнализацию

for (i=120;i>0;i--){//пикаем звуком

if(on){PORTC.0^=1;//при условии, что флаг ОН установлен.

delay_ms(500);

}

}

PORTC.1=0;//отключаем световую сигнализацию

warning=0;//Обнуляем воинг на всякий случай

}//конец ф-и сирена.

void main(void)

{

// Declare your local variables here

unsigned long int W=0;//специальная переменная для расчета времени между срабатываниями "легких" возбужд. факторов

// Input/Output Ports initialization

// Port A initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTA=0x00;

DDRA=0x00;

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTB=0x00;

DDRB=0x00;

// Port C initialization

// Func7=In Func6=In Func5=Out Func4=In Func3=In Func2=Out Func1=Out Func0=Out

// State7=T State6=T State5=1 State4=T State3=T State2=1 State1=0 State0=0

PORTC=0x24;

DDRC=0x27;

// Port D initialization

// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=1 State6=T State5=T State4=T State3=T State2=P State1=T State0=T

PORTD=0x84;

DDRD=0x80;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Falling Edge

// INT1: Off

// INT2: Off

GICR|=0x40;

MCUCR=0x02;

MCUCSR=0x00;

GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

// Global enable interrupts

#asm("sei")

while (1)

{

while (on){

/*Проверка исправности цепи питания - в данный момнент отключ.

while (!PINC.6){

func_call();

}

*/

if((PINC.3)||(!PINC.4)){//Если напряжение на датчике, подкл к PC3=1 или Если напряжение на датчике, подкл к PC3=0,то

//ГДЕ-ТО ЗДЕСЬ НАХОД. ТРАБЛ, Т.К. ПРИ ВКЛЮЧЕНИИ сигнализация отправляется на функцию func_sirena()

PORTC.5=0;//Проверка 2-го уровня срабатывания датчика удара

delay_ms(10);

if (!PINC.4){

func_sirena();}

PORTC.5=1;

warning++; //воинг. Если послупило 3 воинга в течении времени, пока его не обнулили Этим:

W--;//счетчик для обнуления переменной внимания. Обнуляет ее каждые 4 триллиона прогонов цикла вайл.

//Т.е. примерно каждые 42 мин.

if(!W){

warning=0;}

if (warning==3){//идем на функц. сирена.

func_sirena();}

PORTC.0=1;//это дает кратковременный звук "пик"

delay_ms(300);

PORTC.0=0;

delay_ms(100);//пауза до следующего скана датчиков равная 0,1 сек.

}

W--;//счетчик для обнуления переменной внимания. Обнуляет ее каждые 4 триллиона прогонов цикла вайл.

//Т.е. примерно каждые 42 мин.

if(!W){

warning=0;}

}

}

}

Я понимаю, что в прерывании задержек лучше не делать, но по другому я не могу. А так прерывание работает как часы. Поэтому его не трогать :) Функцию func_sirena тоже. Главный трабл наход в цикле while(1). Циклы if не работают вообще никак. При первом запуске МК, он вошел в func_sirena и после прерывания возвращался туда же. Я начал урезать программу. Когда убрал if((PINC.3)||(PINC.4)) это прекратилось, но работать не стало. В результате я сократил программу в цикле меин до такой:

while (1)

{

PORTC.0=PINC.4;}

Но и это не хочет работать! Обработчик прерывания работает хорошо, но на напряжение на PINC.4 контроллер вообще не обращает внимания!

Т.е. работает "вхолостую" не рагируя на значение ПИНц.4

Люди! Хелп!

Что делать?

Может я фьюзы какие неправильно выставил, но я их, по моему вообще отключил - убрал галочку напротив Programing fuse

Изменено пользователем wowa
Ссылка на комментарий
Поделиться на другие сайты

А кто JTAG отключать будет?

Как его отключить?

В общем, я так понял,что программа у меня работает нормально. Но порт С как-то по левому настроен, и PORTC.3 и PORTC.4 не реагируют на внешние сигналы.

Почитал ДШ - действительно - надо JTAG выключить. Как это сделать?

Изменено пользователем Дмитрий Андреевич
Ссылка на комментарий
Поделиться на другие сайты

А кто JTAG отключать будет?

Как его отключить?

в фузах ищим ячейку созвучным названием :lol:

если не нашли смотрите фуз JTAGEN и OCDEN

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

в фузах ищим ячейку созвучным названием

если не нашли смотрите фуз JTAGEN и OCDEN

Ок. Надо же выставить, чтобы внутренний генератор не ребутнуть. Насколько я понял, фьюзы, напротив которых ставлю галочку обнуляются. Это так, или наоборот?

Чтоб не запутаться.

JTAGEN и OCDEN

Почитал - это фьюз JTAGEN :)

Ссылка на комментарий
Поделиться на другие сайты

Ок. Надо же выставить, чтобы внутренний генератор не ребутнуть. Насколько я понял, фьюзы, напротив которых ставлю галочку обнуляются. Это так, или наоборот?

Вы поняли правильно, а вот создатели программаторов правильно поняли не все. :lol: Поэтому лучше воспользуйтесь советом Knazev33

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Да в любом случае, сначала фьюзы надо ПРОЧИТАТЬ, а потом изменить JTAGEN на противоположный. И гадать не надо, что означает галочка - по SPIEN определить проще простого...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

напротив JTAGEN и OCDEN галочку не ставил. Тактовый ген. на 1Мег.

ВСЕ РАБОТАЕТ!!!!!

как часы :)

В общем, радлости моей не было предела, когда все заработало как надо!

Последний открытый вопрос о WDT. Куда в мой код его можно втулить?

Когда установлю - дофоткаю и выложу проект в "автосигнализации" :)

Изменено пользователем Дмитрий Андреевич
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...