Пара вопросов по МК AVR

Обсуждаем контроллеры компании Atmel.
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

Re: Пара вопросов по МК AVR

Сообщение saint981 »

все-таки по подробней, а то мне начинающему ламеру надо это увидеть, переварить и т.д.
так что просьба по подрбнеее
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Такой вопрос, если допустим сконфигурировано какую-то ногу на выход и на ней логическая единица, и там висит светодиод к примеру, при переходе в "powerdown" лог. единица пропадёт, то есть потухнет ли светодиод? в описании режима сказано что тушатся все тактовые генераторы, рас так то и проц по идее тоже тухнет, поправьте если не прав, вывести из этого режима может внешнее прерывание (если настроено), сторожевой таймер(опять же если настроен) и что-то ещё, но меня сейчас больше интересует внешнее прерывание. Вообщем глохнет всё чему нужен счёт, но регистрам он ведь не нужен по идее, и то что в них записано, какие ноги к каким узлам подключены, тоже должно оставаться в силе, в противном случае настройка внешнего прерывания, так же как и настройка сторожевого таймера, пропадут, и разбудить МК будет просто не возможно. Из этого делаю вывод, что все статические величины, такие как конфигурации портов на вход/выход, подключение к ним подтягивающих резисторов(если это вход) или не подключение, выдача на ногу вывода лог. нуля или единицы, выставленные на момент перехода МК в режим "powerdown" остаются в силе, то есть МК заснёт по команде, но светодиод продолжит гореть, при этом потребление МК сведётся к минимуму, кушать будет только сам светодиод. И если мне нужно всё потушить, то есть чтоб не только МК не кушал, но и всё чем он управляет, мне нужно пере переходом в сон всё выключить самому, а при выходе из сна включить обратно( если есть надобность).
Собственно сам вопрос: правильные ли я сделал выводи из прочитанной документации к МК?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Пара вопросов по МК AVR

Сообщение ibiza11 »

Правильно:)
Ставим плюсы: )
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Тогда ещё вопрос, когда я его разбужу внешним прерыванием то он начнёт выполнять главную функцию или всё же сначала выполнит то что написано в функции прерывания?
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

И как же тогда понять всё таки, заснул МК или просто потушил всё что я скомандовал и ждёт? Визуально то я не увижу разницу, всё ведь потушено?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пара вопросов по МК AVR

Сообщение YS »

когда я его разбужу внешним прерыванием


МК перейдет к выполнению обработчика, естесственно. А потом продолжит выполнение с того места, где остановился...

If an enabled interrupt occurs while the MCU is in a sleep mode, the MCU wakes up. The MCU
is then halted for four cycles in addition to the start-up time, executes the interrupt routine, and
resumes execution from the instruction following SLEEP. The contents of the Register File and
SRAM are unaltered when the device wakes up from sleep. If a reset occurs during sleep mode,
the MCU wakes up and executes from the reset vector.


И как же тогда понять


Замером тока его потребления. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Ну я как бы подозревал что амперметр решает! Имел ввиду какой нибудь другой вариант.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пара вопросов по МК AVR

Сообщение YS »

какой нибудь другой вариант


Ну, можно организовать мигание светодиодом в главном цикле. МК уйдет в сон - диод перестанет мигать.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

А если, к примеру, нет цикла?
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Пара вопросов по МК AVR

Сообщение Ser60 »

Koldyn писал(а):И как же тогда понять...

Например, с помощью внутрисхемного отладчика. Поставьте точку останова на следующую команду после отправки МК в сон и еще одну на входе соответствующего обработчика прерывания по пробуждении.
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Вот про точку останова не понял!
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Вот код написан в CVAVR, tiny2313, прерывание по INT0, по заднему фронту, пробовал по переднему, тоже самое, проектирую в протеусе и вроде засыпает, но вот просыпаться по нажатию той же кнопки не хочет. В чём беда?

#include <tiny2313.h>
#include <delay.h>
#include <sleep.h>

char a=0; char z;


interrupt[2] void KNOPKA()
{
a++;
if(a==4) a=0;
z=0;
}

void p()
{
delay_ms(z);
}

void main()
{
DDRD=0b1110011;
PORTD.2=1;
SREG=0b10000000;
GIMSK=0b01000000;
MCUCR=0b00110011;
OCR0B=0;

while(1)
{
while(a==0)
{
TCCR0A=0b00000000;
TCCR0B=0b00000000;
PORTD.5=1;
}

TCCR0A=0b00110011;
TCCR0B=0b00000001;
z=5;

while(a==1)
{
while(OCR0B!=210) // тушит
{
p();
OCR0B++;
}

p();p(); p();p();

while(OCR0B!=0) // зажигает
{
p();p();
OCR0B--;
}

}

z=5;

while(a==2)
{
while(OCR0B!=210) // тушит
{
p();
OCR0B++;
}

p();p();p();p();

while(OCR0B!=0) // зажигает
{
p();p();
OCR0B--;
}

delay_ms(z*1000);
}

if(a==3) {PORTD.5=0;powerdown();}
}
}
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Пара вопросов по МК AVR

Сообщение Ser60 »

Судя по вопросу, Вы никогда не пользовались внутрисхемными отладчиками типа AVR Dragon. Если так, то забудьте про мой совет, иначе специфицируйте что именно непонятно. А насчет пробуждения - тиньки из режима powerdown не будятся прерыванием по фронту или спаду, а будятся только по уровню.
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

А от куда такая информация про прерывания и пробуждения? В даташите я что-то такое не встречал. Или это экспериментальным путём выявлено? Я же правильно понимаю, что при выставленном прерывании по уровню если я не отпущу кнопку на тот момент, когда обработчик прерывания закончит выполнять то что в нём написано, МК снова считает низкий уровень на ноге и опять запустит обработчик? То есть пока я буду держать кнопку, моя переменная, которая отвечает за то какой цикл запустить будет плясать как бешеная по кругу и какой именно из режимов будет запущен в момент снятия низкого уровня с INT0 остаётся угадывать только тыкая пальцем в небо. Но в протэусе почему-то всё работает по порядку, за исключением того, что МК перестал вообще засыпать, как будто этого режима и нет, при нажатии сменяются остальные 3 цикла по кругу. Зато когда добавил в обработчик, в самом конце, задержку в 100 миллисекунд всё заработало чудесным образом. И засыпает, и просыпается, и по порядку режимы переключаются. Только вот не ясно почему так. (
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

И ещё есть вопрос по поводу кнопки. На этой же тиньке была собрана другая схема, без ШИМа, но суть не сильно отличается, тоже по разному моргают светодиоды, их больше и каждый на своей ноге, написано было 9 режимов этого самого моргания, переключение между режимами аналогично выше приведенному коду, только сравнивался остаток от деления переменной отвечающей за режим, к стати в том коде что я привёл, вначале тоже так было написано, но почему-то не захотело компилироваться, по этому поставил простое сравнение и добавил строчку "if(a==4) a=0;" дабы закольцевать сие действо, почему не заработал остаток от деления тоже остаётся загадкой! ( В общем в протэусе всё прошло на ура (режима сна там не применялся), но когда собрал всё в реале, при нажатии на кнопку происходил полный трешь, никакой речи про последовательное переключение режимов не идёт, режимы переключались, может и по порядку возрастания, не не по порядку следования, а скакали через 1, через 2 и так далее. Параллельно кнопке поставил кондёр и этим всё поставил на места, чёткое переключение по порядку, кроме того что стартует, при подаче питания, не с 1-го режима, а с 3-го, то есть со старта 2 раза переключается. Я конечно исправил немного код, изначальное значение переменной выставил соответственно предпоследнему режиму, то есть со старта переключает 2 раза и имеем первый режим, но не тут то было, в этом варианте со старта переключало только раз, я выставил последний режим и тогда уже всё заработало как хотелось.
Собственно вопрос: чем вызвано такое перескакивание при запуске на 2 режима вперёд и почему оно изменилось к концу на 1 режим?! Грешил на кондёр, мол он как-то заставляет МК со старта понимать 2 нажатия кнопки, но почему тогда с выставлением переменной ближе к конечному режиму срабатывает только раз, кондёр ведь я не менял?!
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Я конечно извиняюсь за трёхэтажные посты, просто хочу точнее передать суть проблемы, чтоб точнее получить ответ. Просто много веток читал, и когда задают короткий вопрос, в ответ получают тоже кучу вопросов уточнений в духе какое железо, а что в этой строке, а что в той и т.п. Стараюсь немного предугадать! )
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пара вопросов по МК AVR

Сообщение YS »

А если, к примеру, нет цикла?


Такого быть не может. Программа для МК всегда содержит бесконечный цикл в main().

А от куда такая информация про прерывания и пробуждения? В даташите я что-то такое не встречал.


Плохо читали.

Изображение

Причина следующая - в спящем режиме останавливается генератор, соотвественно, определить фронт невозможно.

То есть пока я буду держать кнопку, моя переменная, которая отвечает за то какой цикл запустить будет плясать как бешеная по кругу


А Вы проверяйте значение ноги, на которой кнопка, и гоняйте после пробуждения пустой цикл, пока она нажата.

обственно вопрос: чем вызвано такое перескакивание


Дребезгом контактов реальной кнопки. В Протеусе, понятно, все срабатывает четко. :)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

А от куда такая информация про прерывания и пробуждения? В даташите я что-то такое не встречал.


Плохо читали.


Да, видимо действительно не внимательно. Спасибо!

То есть пока я буду держать кнопку, моя переменная, которая отвечает за то какой цикл запустить будет плясать как бешеная по кругу


А Вы проверяйте значение ноги, на которой кнопка, и гоняйте после пробуждения пустой цикл, пока она нажата.


Как же пустой цикл, если пока она нажата, у меня будет постоянно выполняться обработчик прерываний, он не пустой, он же несёт определённый смысл во всём коде?! или я что-то не понял. И что вы имели ввиду под проверять значение ноги? Да и суть в том что даже не в момент пробуждения, а просто при переключении режимов тоже будет тот же эффект ибо у процессора скорость, с которой он прочтёт несчастные 4 строки обработчика прерываний, не в какие сравнения не ставиться со скоростью замыкания и размыкания контактов кнопки, особенно учитывая что кнопку тыкает простой смертный. Иным языком, пока я отпущу кнопку, хоть это мне и покажется быстрым, камень прогонит не раз то что написано в прерывании, и сколько раз прогонит, столько раз и прибавит 1 к переменной. На ум приходит только перестройка прерывания по фронту между режимами, а при переходе в сон, переназначать биты на уровень, потом при выходе из сна снова на фронт. Но это решает только проблему переключения между режимами. Хотя можно в обработчике указать, что когда он просыпается то обратно меняет значение на фронт, и по идее обработчик должен только раз выполнить код, даже если буду держать кнопку.

обственно вопрос: чем вызвано такое перескакивание


Дребезгом контактов реальной кнопки. В Протеусе, понятно, все срабатывает четко.


Я имел ввиду уже с установленным конденсатором, то что оно как попало скачет без кондёра это ясно, но с ним стабильно перескакивает 2 режима если выставлено начинать с первого и 1 если выставлено с последнего. Вот это почему происходит меня интересует!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пара вопросов по МК AVR

Сообщение YS »

Как же пустой цикл, если пока она нажата, у меня будет постоянно выполняться обработчик прерываний ...


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


/*Положим для примера, что прерывание настроено на срабатывание по высокому уровню, т.е., кнопка замыкает вывод на питание.*/

ISR (INT0_vect)
{

  /*Вот тут человек нажал кнопку. По первому же импульсу от нее контроллер просыпается и входит в обработчик. Ясное дело, вложенные прерывания не разрешены.*/

  do
  {
    /*И пока кнопка все еще нажата, мы ожидаем квантами по 100 мс. ее отпускания. По 100 мс - чтобы игнорировать дребезг.*/
    _delay_ms(100);
  }while (INT_PORT & INT0_PINMASK);


  /*Сбрасываем флаги внешних прерываний на случай, если импульс от дребезга активировал прерывание еще раз (поставив его в очередь).*/
  EIFR=0;

  /*Ну а потом делаем что-то полезное, когда кнопка уже отжата.*/
  something_worthwhile();

  /*После выхода из обработчика начнется исполнение программы с инструкции, следующей за SLEEP.*/
}

Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Koldyn
Открыл глаза
Сообщения: 65
Зарегистрирован: Чт апр 14, 2011 22:32:11

Re: Пара вопросов по МК AVR

Сообщение Koldyn »

Спасибо конечно, но я пока не всё понял что вы написали. Только начинаю писать на Си и по этому не все операторы знаю, буду разбираться.
Ответить

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