Пара вопросов по МК AVR
-
saint981
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вс мар 08, 2009 22:52:27
- Откуда: Ukraine
Re: Пара вопросов по МК AVR
все-таки по подробней, а то мне начинающему ламеру надо это увидеть, переварить и т.д.
так что просьба по подрбнеее
так что просьба по подрбнеее
Re: Пара вопросов по МК AVR
Такой вопрос, если допустим сконфигурировано какую-то ногу на выход и на ней логическая единица, и там висит светодиод к примеру, при переходе в "powerdown" лог. единица пропадёт, то есть потухнет ли светодиод? в описании режима сказано что тушатся все тактовые генераторы, рас так то и проц по идее тоже тухнет, поправьте если не прав, вывести из этого режима может внешнее прерывание (если настроено), сторожевой таймер(опять же если настроен) и что-то ещё, но меня сейчас больше интересует внешнее прерывание. Вообщем глохнет всё чему нужен счёт, но регистрам он ведь не нужен по идее, и то что в них записано, какие ноги к каким узлам подключены, тоже должно оставаться в силе, в противном случае настройка внешнего прерывания, так же как и настройка сторожевого таймера, пропадут, и разбудить МК будет просто не возможно. Из этого делаю вывод, что все статические величины, такие как конфигурации портов на вход/выход, подключение к ним подтягивающих резисторов(если это вход) или не подключение, выдача на ногу вывода лог. нуля или единицы, выставленные на момент перехода МК в режим "powerdown" остаются в силе, то есть МК заснёт по команде, но светодиод продолжит гореть, при этом потребление МК сведётся к минимуму, кушать будет только сам светодиод. И если мне нужно всё потушить, то есть чтоб не только МК не кушал, но и всё чем он управляет, мне нужно пере переходом в сон всё выключить самому, а при выходе из сна включить обратно( если есть надобность).
Собственно сам вопрос: правильные ли я сделал выводи из прочитанной документации к МК?
Собственно сам вопрос: правильные ли я сделал выводи из прочитанной документации к МК?
Re: Пара вопросов по МК AVR
Тогда ещё вопрос, когда я его разбужу внешним прерыванием то он начнёт выполнять главную функцию или всё же сначала выполнит то что написано в функции прерывания?
Re: Пара вопросов по МК AVR
И как же тогда понять всё таки, заснул МК или просто потушил всё что я скомандовал и ждёт? Визуально то я не увижу разницу, всё ведь потушено?
Re: Пара вопросов по МК AVR
когда я его разбужу внешним прерыванием
МК перейдет к выполнению обработчика, естесственно. А потом продолжит выполнение с того места, где остановился...
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.
И как же тогда понять
Замером тока его потребления.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Пара вопросов по МК AVR
Ну я как бы подозревал что амперметр решает! Имел ввиду какой нибудь другой вариант.
Re: Пара вопросов по МК AVR
какой нибудь другой вариант
Ну, можно организовать мигание светодиодом в главном цикле. МК уйдет в сон - диод перестанет мигать.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Пара вопросов по МК AVR
А если, к примеру, нет цикла?
Re: Пара вопросов по МК AVR
Koldyn писал(а):И как же тогда понять...
Например, с помощью внутрисхемного отладчика. Поставьте точку останова на следующую команду после отправки МК в сон и еще одну на входе соответствующего обработчика прерывания по пробуждении.
Re: Пара вопросов по МК AVR
Вот про точку останова не понял!
Re: Пара вопросов по МК AVR
Вот код написан в 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();}
}
}
#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();}
}
}
Re: Пара вопросов по МК AVR
Судя по вопросу, Вы никогда не пользовались внутрисхемными отладчиками типа AVR Dragon. Если так, то забудьте про мой совет, иначе специфицируйте что именно непонятно. А насчет пробуждения - тиньки из режима powerdown не будятся прерыванием по фронту или спаду, а будятся только по уровню.
Re: Пара вопросов по МК AVR
А от куда такая информация про прерывания и пробуждения? В даташите я что-то такое не встречал. Или это экспериментальным путём выявлено? Я же правильно понимаю, что при выставленном прерывании по уровню если я не отпущу кнопку на тот момент, когда обработчик прерывания закончит выполнять то что в нём написано, МК снова считает низкий уровень на ноге и опять запустит обработчик? То есть пока я буду держать кнопку, моя переменная, которая отвечает за то какой цикл запустить будет плясать как бешеная по кругу и какой именно из режимов будет запущен в момент снятия низкого уровня с INT0 остаётся угадывать только тыкая пальцем в небо. Но в протэусе почему-то всё работает по порядку, за исключением того, что МК перестал вообще засыпать, как будто этого режима и нет, при нажатии сменяются остальные 3 цикла по кругу. Зато когда добавил в обработчик, в самом конце, задержку в 100 миллисекунд всё заработало чудесным образом. И засыпает, и просыпается, и по порядку режимы переключаются. Только вот не ясно почему так. (
Re: Пара вопросов по МК AVR
И ещё есть вопрос по поводу кнопки. На этой же тиньке была собрана другая схема, без ШИМа, но суть не сильно отличается, тоже по разному моргают светодиоды, их больше и каждый на своей ноге, написано было 9 режимов этого самого моргания, переключение между режимами аналогично выше приведенному коду, только сравнивался остаток от деления переменной отвечающей за режим, к стати в том коде что я привёл, вначале тоже так было написано, но почему-то не захотело компилироваться, по этому поставил простое сравнение и добавил строчку "if(a==4) a=0;" дабы закольцевать сие действо, почему не заработал остаток от деления тоже остаётся загадкой! ( В общем в протэусе всё прошло на ура (режима сна там не применялся), но когда собрал всё в реале, при нажатии на кнопку происходил полный трешь, никакой речи про последовательное переключение режимов не идёт, режимы переключались, может и по порядку возрастания, не не по порядку следования, а скакали через 1, через 2 и так далее. Параллельно кнопке поставил кондёр и этим всё поставил на места, чёткое переключение по порядку, кроме того что стартует, при подаче питания, не с 1-го режима, а с 3-го, то есть со старта 2 раза переключается. Я конечно исправил немного код, изначальное значение переменной выставил соответственно предпоследнему режиму, то есть со старта переключает 2 раза и имеем первый режим, но не тут то было, в этом варианте со старта переключало только раз, я выставил последний режим и тогда уже всё заработало как хотелось.
Собственно вопрос: чем вызвано такое перескакивание при запуске на 2 режима вперёд и почему оно изменилось к концу на 1 режим?! Грешил на кондёр, мол он как-то заставляет МК со старта понимать 2 нажатия кнопки, но почему тогда с выставлением переменной ближе к конечному режиму срабатывает только раз, кондёр ведь я не менял?!
Собственно вопрос: чем вызвано такое перескакивание при запуске на 2 режима вперёд и почему оно изменилось к концу на 1 режим?! Грешил на кондёр, мол он как-то заставляет МК со старта понимать 2 нажатия кнопки, но почему тогда с выставлением переменной ближе к конечному режиму срабатывает только раз, кондёр ведь я не менял?!
Re: Пара вопросов по МК AVR
Я конечно извиняюсь за трёхэтажные посты, просто хочу точнее передать суть проблемы, чтоб точнее получить ответ. Просто много веток читал, и когда задают короткий вопрос, в ответ получают тоже кучу вопросов уточнений в духе какое железо, а что в этой строке, а что в той и т.п. Стараюсь немного предугадать! )
Re: Пара вопросов по МК AVR
А если, к примеру, нет цикла?
Такого быть не может. Программа для МК всегда содержит бесконечный цикл в main().
А от куда такая информация про прерывания и пробуждения? В даташите я что-то такое не встречал.
Плохо читали.

Причина следующая - в спящем режиме останавливается генератор, соотвественно, определить фронт невозможно.
То есть пока я буду держать кнопку, моя переменная, которая отвечает за то какой цикл запустить будет плясать как бешеная по кругу
А Вы проверяйте значение ноги, на которой кнопка, и гоняйте после пробуждения пустой цикл, пока она нажата.
обственно вопрос: чем вызвано такое перескакивание
Дребезгом контактов реальной кнопки. В Протеусе, понятно, все срабатывает четко.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Пара вопросов по МК AVR
А от куда такая информация про прерывания и пробуждения? В даташите я что-то такое не встречал.
Плохо читали.
Да, видимо действительно не внимательно. Спасибо!
То есть пока я буду держать кнопку, моя переменная, которая отвечает за то какой цикл запустить будет плясать как бешеная по кругу
А Вы проверяйте значение ноги, на которой кнопка, и гоняйте после пробуждения пустой цикл, пока она нажата.
Как же пустой цикл, если пока она нажата, у меня будет постоянно выполняться обработчик прерываний, он не пустой, он же несёт определённый смысл во всём коде?! или я что-то не понял. И что вы имели ввиду под проверять значение ноги? Да и суть в том что даже не в момент пробуждения, а просто при переключении режимов тоже будет тот же эффект ибо у процессора скорость, с которой он прочтёт несчастные 4 строки обработчика прерываний, не в какие сравнения не ставиться со скоростью замыкания и размыкания контактов кнопки, особенно учитывая что кнопку тыкает простой смертный. Иным языком, пока я отпущу кнопку, хоть это мне и покажется быстрым, камень прогонит не раз то что написано в прерывании, и сколько раз прогонит, столько раз и прибавит 1 к переменной. На ум приходит только перестройка прерывания по фронту между режимами, а при переходе в сон, переназначать биты на уровень, потом при выходе из сна снова на фронт. Но это решает только проблему переключения между режимами. Хотя можно в обработчике указать, что когда он просыпается то обратно меняет значение на фронт, и по идее обработчик должен только раз выполнить код, даже если буду держать кнопку.
обственно вопрос: чем вызвано такое перескакивание
Дребезгом контактов реальной кнопки. В Протеусе, понятно, все срабатывает четко.
Я имел ввиду уже с установленным конденсатором, то что оно как попало скачет без кондёра это ясно, но с ним стабильно перескакивает 2 режима если выставлено начинать с первого и 1 если выставлено с последнего. Вот это почему происходит меня интересует!
Re: Пара вопросов по МК AVR
Как же пустой цикл, если пока она нажата, у меня будет постоянно выполняться обработчик прерываний ...
Код: Выделить всё
/*Положим для примера, что прерывание настроено на срабатывание по высокому уровню, т.е., кнопка замыкает вывод на питание.*/
ISR (INT0_vect)
{
/*Вот тут человек нажал кнопку. По первому же импульсу от нее контроллер просыпается и входит в обработчик. Ясное дело, вложенные прерывания не разрешены.*/
do
{
/*И пока кнопка все еще нажата, мы ожидаем квантами по 100 мс. ее отпускания. По 100 мс - чтобы игнорировать дребезг.*/
_delay_ms(100);
}while (INT_PORT & INT0_PINMASK);
/*Сбрасываем флаги внешних прерываний на случай, если импульс от дребезга активировал прерывание еще раз (поставив его в очередь).*/
EIFR=0;
/*Ну а потом делаем что-то полезное, когда кнопка уже отжата.*/
something_worthwhile();
/*После выхода из обработчика начнется исполнение программы с инструкции, следующей за SLEEP.*/
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Пара вопросов по МК AVR
Спасибо конечно, но я пока не всё понял что вы написали. Только начинаю писать на Си и по этому не все операторы знаю, буду разбираться.