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

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

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

Сообщение saint981 »

Подскажите, плз, начинающему, как решить 2 вопроса:

1-й генерация AVR ATtiny2313, ATmega8 звука
2-й включение/отключение питания МК одной кнопкой, т.к. есть необходимость сделать один девайс, где надо реализовать так питание.

Тренируюсь в программировании МК на WinAVR
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

1 зависит от типа звука (синтез или воспроизведение записи), в любом случае - МК+ЦАП+УНЧ
2 при нажатии на кнопку переход в режим power-down (потребление - микроамперы), при повторном нажатии - соответственно переход в обычный режим, естественно все по прерыванию (INT1-2 или pin change)
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

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

Сообщение saint981 »

по 1-му вопроса, - просто должна быть генерация сигнала в диапозоне от 600 до 2000 Гц в зависимости от необходимости;
по 2-му - принцип понятен, а как на практике это все выполнить, то бишь оба вопроса хотя бы общие наброски программ.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

Так какой сигнал? Прямоугольный? Тогда берем таймер, настраиваем предделитель - получаем нужную частоту (грубо), записываем в регистр сравнения число (подбираем частоту - точно). Настраиваем прерывание - совпадение таймера с регистром. В процедуре обработки - сбрасываем таймер, выводим наш сигнал.

Вкл/Выкл примерно будет так: Настраиваем прерывание (pin change) на какую-нибудь ногу, берем какой-нибудь ненужный бит в регистре для запоминания режима (лучше SE в MCUCR). Записываем в MCUCR биты для режима power down. При нажатии на кнопку - прерывание, в нем проверяем в каком режиме находимся, если в активном (SE=0), то делаем SE=1 и выполняем команду SLEEP, если уже спим, тогда SE=0 и выход из подпрограммы...

Проги писать уже глаза закрываются :sleep:

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

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

Сообщение saint981 »

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

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

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

Сообщение saint981 »

добрый вечер, ув. коты! прошу меня не пинать и не роутить через vlan на обучалку. :o :))
прочитал досконально даташит на tiny2313, книги белова и уяснил, что для перевода в режим
sleep необходимо по внешнему прерыванию сделать прерывание и проверить/записать в бит SE - 1, а в биты SM0 (бит 4) и SM1 (бит 6) комбинацию для выбора режима МК. Т.е. получается
power save mode биты 7 6 5 4 надо записать 0111, а проснуться по разрешенному внешнему прерыванию на выводе INT0 - записав в биты ISC01 ISC00 11. ТАк подобно сделано в примере для МК м8535 - т.е афтар персчитал значения каким-то образом и врпоге указал так:
MCUCR=0x75
asm("slep")
Подскажите, подойдет такая форма усыпления МК? какое значение MCUCR мне необходимо выставить?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

раз уж вы тренируетесь на WinAVR, почему бы вам не использовать модуль avr/sleep.h и его макросы set_sleep_mode() и sleep_mode() ???
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение saint981 »

я пытаюсь тренироваться на cvavr и winavr! но хоть какая-то инфо по режиму sleep нарыл на cvavr.
можно, ув. ARV немного описать этот модуль?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

saint981 писал(а):можно немного описать этот модуль?
можно:
avr/sleep.h – Управление энергосберегающими режимами и режимами «сна»
В этом модуле определен ряд макросов и функций, реализующих общий интерфейс управления режимами «сна».
Использование инструкции SLEEP позволяет снизить общее энергопотребление в некоторых применениях. Микроконтроллеры AVR реализуют несколько различных вари-антов «сна», для которых в модуле определены следующие константы (о поддержке вы-бранным контроллером соответствующего режима следует справиться в документации к контроллеру, не все константы определены для любого контроллера):
SLEEP_MODE_IDLE – режим «бездействия» Idle
SLEEP_MODE_PWR_DOWN – режим «отключения» Power Down
SLEEP_MODE_PWR_SAVE – режим «экономии» Power Save
SLEEP_MODE_ADC – режим «снижения шума АЦП» ADC Noise Reduction
SLEEP_MODE_STANDBY – режим «ожидания»
SLEEP_MODE_EXT_STANDBY – расширенный режим «ожидания»
Практически управление режимом энергосбережения сводится к вызову макроса set_sleep_mode() для указания нужного режима и последующего включения этого режима макросом sleep_mode(). Следует помнить, что если нет необходимости остановить работу микроконтроллера вплоть до аппаратного сброса, необходимо разрешить прерывания до выполнения этих макросов.
В некоторых случаях может потребоваться большая гибкость в управлении режимами экономии, для чего предусмотрены отдельные функции sleep_enable(), sleep_disable() и sleep_cpu().

Функции и макросы модуля
set_sleep_mode()
set_sleep_mode(mode) – макрос, подготавливающий микроконтроллер к заданному режиму сна. Параметр mode – одна из определенных ранее констант режима. Этот макрос эквивалентен переходу в режим Idle, т.е. остановки тактового генератора и отключения периферии, если это требуется режимом, не происходит. Для полноценного включения режима требуется второй макрос sleep_mode()

sleep_mode()
sleep_mode() – макрос, переводящий микроконтроллер в режим сна. Его реализация такова, что программист вправе считать, что «возврат» из макроса произойдет уже после «пробуждения» контроллера.

sleep_enable()
void sleep_enable(void) – функция, устанавливающая бит разрешения режима сна (SE-бит).

sleep_disable()
void sleep_disable(void) – функция, сбрасывающая бит разрешения режима сна (SE-бит)

sleep_cpu()
void sleep_cpu(void) – функция, «усыпляющая» микроконтроллер, т.е. эквивалент-ная команде SLEEP.
собственно говоря, усыпляют контроллер так:

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

#include <avr/sleep.h>
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
константа режима сна может быть любой нужной.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

saint981 писал(а):афтар персчитал значения каким-то образом и врпоге указал так:

Аффтар перевёл значение в 16-ричную систему. Иногда это оправданно и удобно, но скажите мне, почему бы в таких случаях, когда нужно побитно работать с регистром, не воспользоваться фитчами winavr-а указывая, даже не номера конкретных битов, а их название(!)?

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

MCUCR|=(1<<SM0); //Sleep Mode: Power-down
MCUCR|=(1<<SE); //Sleep Enable
asm("sleep"); //ZZZzzzz... ZZZzzzz... ZZZzzzz...

Чтоб разбудить контроллер, настройте внешнее прерывание.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

AI_Disable писал(а):но скажите мне, почему бы в таких случаях, когда нужно побитно работать с регистром, не воспользоваться фитчами winavr-а указывая, даже не номера конкретных битов, а их название(!)?

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

MCUCR|=(1<<SM0); //Sleep Mode: Power-down
MCUCR|=(1<<SE); //Sleep Enable
asm("sleep"); //ZZZzzzz... ZZZzzzz... ZZZzzzz...
если следовать стилю WinAVR, то следует воспользоваться макросом _BV():

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

MCUCR |= _BV(SM0);
MCUCR |= _BV(SE);
однако, еще лучше воспользоваться готовыми макросами, как я описал ранее
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

ARV писал(а):если следовать стилю WinAVR, то следует воспользоваться макросом _BV():

Просто не уважаю я эти макросы :). Становится сложнее читать код человеку, использующего другой компилятор. Так что, правильнее сказать, надо использовать стандартные средства Си. Исключение - названия битов регистров, т.к. эта фитча упрощает чтение (и написание, конечно же) программы, даже если человек пользует другую среду.
wvw
Родился
Сообщения: 4
Зарегистрирован: Пт июн 18, 2010 06:21:13

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

Сообщение wvw »

ARV, а откуда цитата с описанием макросов WinAVR?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

wvw писал(а):ARV, а откуда цитата с описанием макросов WinAVR?
это я занимался переводом документации к avr-libc и WinAVR
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение saint981 »

написал прогу с помощью CodeVision для перевода tiny2313 в режим сна и обратно, но хотелось, чтобы подсказали мне, правильно ли описал я работу мк?
кнопка для вкл-выкл мк подключена между землей и выводом PD2, а светодиод к PD5, который служит индикацией режима работы мк. меня интересует - правильно ли записал MCUCR=0b01110011
Заранее спс.
Вложения
sleep.c
(3.1 КБ) 859 скачиваний
sleep.c
(1.75 КБ) 736 скачиваний
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

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

Сообщение saint981 »

листинг проги в cvar весит 3 кб, а 1,7 кб - старый вариант в winavr (удалить не получилось).
Аватара пользователя
maglev
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk
Контактная информация:

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

Сообщение maglev »

А я как-то аппаратное решение полюбил. Одной кнопочкой вклю-выключаю. Щас покажу схему.
Вложения
Image1.gif
(4.73 КБ) 1170 скачиваний
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5732
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

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

Сообщение >TEHb< »

А никто не подумал тупо о кнопке с фиксацией? Фильтруем дребезг, ставим запуск подольше и готово. Хотя туда - сюда передёргивать питание без надобности на то, конечно, не сильно хорошо.
"Привет!" - соврал он.
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

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

Сообщение saint981 »

а по подробнее?
тем более что, необходимо именно вкл-выкл мк кнопкой;
как правильно сформировать задержку после нажатия кнопки?
Аватара пользователя
>TEHb<
Друг Кота
Сообщения: 5732
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж
Контактная информация:

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

Сообщение >TEHb< »

Обычная кнопка с фиксацией, после неё хватит даже небольшого кондера, а на МК фьюзами ставим или самый долгий запуск или вообще включаем БОД.
"Привет!" - соврал он.
Ответить

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