Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема начального запуска
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kuznec9999
Здравствуйте. Собрал схему - цифровой вольтметр. Включаю питание - всё работает, всё прекрасно измеряет. Поставил фильтрующую ёмкость по питанию (470uF) - схема перестала запускаться!!! Убрал - работает отлично. В общем вопрос следующий: как корректно проводить запуск МК? Неужели только "скачковым" питанием? Или существуют какие-либо методы побороть данную проблему?

Возможно (я почти уверен в этом), это из-за того, что при запуске не очищается ОЗУ (читал на форуме про подобные проблемы). Как стереть ОЗУ (желательно на асм) при инициализации программы?

Генератор внутренний. Частота 1МГц. Может фьюэы? Некорректная инициализация? ...
Artem_Petrik
Проблема у вас с ресетом. Включите brown-out detector, и все пройдет(Это как раз фьюзы smile.gif ). Или использовать внешний ресет-генератор. А ОЗУ здесь не при чем.
domowoj
Странно.
А кондер питание не коротит?
Обычно фильтра мало не бывает.
Kuznec9999
Цитата(Artem_Petrik @ May 4 2008, 18:50) *
Проблема у вас с ресетом. Включите brown-out detector, и все пройдет(Это как раз фьюзы smile.gif ). Или использовать внешний ресет-генератор. А ОЗУ здесь не при чем.

Спасибо. Совершенно точно.ж Фьюз BDON убрал проблему. Спасибо.
chds
Цитата(domowoj @ May 4 2008, 17:52) *
Странно.
А кондер питание не коротит?
Обычно фильтра мало не бывает.


Но при этом переходная характеристика цепи питания увеличивается, за счет увеличения емкости и постоянном потреблении. А это приводит к некорректному запуску либо внутренней PLL либо автомата МК.
Vlad219i
Цитата(Kuznec9999 @ May 4 2008, 18:26) *
Как стереть ОЗУ (желательно на асм) при инициализации программы?


Примерно так:
ldi xh, high(sram_size) ;очистка памяти (SRAM)
ldi xl, low(sram_size)
ldi zh, high(sram_start)
ldi zl, low(sram_start)
clr r16
clr_ram:st z+, r16
sbiw xh:xl, 1
brne clr_ram
Kuznec9999
Цитата(Vlad219i @ May 4 2008, 19:50) *
Примерно так:
ldi xh, high(sram_size) ;очистка памяти (SRAM)
ldi xl, low(sram_size)
ldi zh, high(sram_start)
ldi zl, low(sram_start)
clr r16
clr_ram:st z+, r16
sbiw xh:xl, 1
brne clr_ram

Понял, спасибо, примерно так и сделал. А вообще неочищенная ОЗУ влияет на корректность работы при старте МК? Или очищать её в начале программы (своеобразная инициализация) не обязательно? Я понимаю ОЗУ на то и ОЗУ, чтобы помнить данные только тогда, когда МК запитан, или всё же лучше очистить? И ещё один вопрос, если позволите. Регистры 0-15 - для чего они предназначены? Только для хранения результата умножения? Какие-то они совсем неполноценные - ни записать в них нормально, ни произвести арифметическую операцию..
tazik
Цитата(Kuznec9999 @ May 5 2008, 01:35) *
... Какие-то они совсем неполноценные ...

Есть такая штука 07.gif
Нормальные регистры, только непосредственно с числовыми аргументами не работают (ldi, adi...)
Зато команда lpm работает только с R0, а spm только с R1:R0
SasaVitebsk
Цитата(tazik @ May 4 2008, 22:59) *
Есть такая штука 07.gif
Зато команда lpm работает только с R0, а spm только с R1:R0

01.gif
Загляните ну хоть куда-нибудь. Команда lpm работала только с r0 на заре AVR строения. И уже давно работает со всеми подряд. Команда spm - как бы не совсем команда. Работа её весьма сложна. Применять её в программе достаточно редкое явление, если не считать bootloader-ы. Есть ограничения на пересылку регистровых пар и команды умножения/деления результат кладут только в R0:R1.
В целом это рядовое явление коль мы говорим о МК с RISC системой команд.
tazik
Цитата(SasaVitebsk @ May 5 2008, 03:08) *
01.gif
Загляните ну хоть куда-нибудь. Команда lpm работала только с r0 на заре AVR строения. И уже давно работает со всеми подряд. Команда spm - как бы не совсем команда. Работа её весьма сложна. Применять её в программе достаточно редкое явление, если не считать bootloader-ы. Есть ограничения на пересылку регистровых пар и команды умножения/деления результат кладут только в R0:R1.
В целом это рядовое явление коль мы говорим о МК с RISC системой команд.

Да, Вы правы
Vlad219i
Цитата(Kuznec9999 @ May 4 2008, 21:35) *
Понял, спасибо, примерно так и сделал. А вообще неочищенная ОЗУ влияет на корректность работы при старте МК? Или очищать её в начале программы (своеобразная инициализация) не обязательно?


Неочищенная оперативка на старт не влияет никак.

Цитата(Kuznec9999 @ May 4 2008, 21:35) *
И ещё один вопрос, если позволите. Регистры 0-15 - для чего они предназначены?


Я использую для всего, что не связано с необходимостью прямой загрузки (или установки/снятия битов) в эти регистры - как правило счетчики, времянки при расчетах, сохранение регистров в прерываниях etc.
В принципе - загружать непосредственные значения в эти регистры тоже можно, но при помощи регистра из верхней половины (примерно так: ldi r16,data \ mov r3,r16) . Коряво, неоптимально по коду и не всегда удобно...
Maik-vs
Цитата(Vlad219i @ May 5 2008, 12:20) *
В принципе - загружать непосредственные значения в эти регистры тоже можно, но при помощи регистра из верхней половины (примерно так: ldi r16,data \ mov r3,r16) . Коряво, неоптимально по коду и не всегда удобно...

А также так: lds R5 или in R6. Нижние регистры не работают с константами: всякие там andi ldi. Остальное всё работает. Имхо, если программа вся на константах - -это или очень простая программа, или плохо написанная.
Память при старте прописывать ничем не надо, если переменные, хранимые в этой памяти, правильно инициализируются.
Kuznec9999
[quote name='Vlad219i' date='May 5 2008, 12:20' post='406317']
Спасибо. У меня возник ещё один вопрос. В некоем регистре (например R16), хранится значение в диапазоне 0-256 (например, снятое с АЦП). Как преобразовать диапазон 0-256 в 0-80 (т.е фактически, регистр R16 разделить на 3.2). Возможно ли это в принципе?
aaarrr
Ну так умножьте на 5 и поделите на 16. Откуда сомнения в принципиальной возможности?
Kuznec9999
Цитата(aaarrr @ May 5 2008, 14:38) *
Ну так умножьте на 5 и поделите на 16. Откуда сомнения в принципиальной возможности?

Даже смешно, что сам не додумался до этого smile.gif . Спасибо. Смутило то, что число делителя дробное rolleyes.gif . Т.е умножаем на 5, и сдвигаем влево на 4 бита, правильно? (ну не считая того, что мы потеряем запятую, т.к важно целое число). Подскажите мне, если можно, как работает ШИМ. Подаём на вход двоичное число, и получаем ШИМ последовательность, отношение 1/0 у которого равно этому числу?. Т.е для 8 бит: 0-255. Подав 128 получим меандр?
777777
Цитата(chds @ May 4 2008, 19:30) *
Но при этом переходная характеристика цепи питания увеличивается, за счет увеличения емкости и постоянном потреблении. А это приводит к некорректному запуску либо внутренней PLL либо автомата МК.


Для начала надо бы поросить автора показать схему сброса (то, что приходит на вход RESET) и приходит ли вообще. А из этого уже можно решать, насколько эта схема критична к плавному увеличению питания.
aaarrr
Цитата(Kuznec9999 @ May 5 2008, 14:50) *
Даже смешно, что сам не додумался до этого smile.gif . Спасибо. Смутило то, что число делителя дробное rolleyes.gif . Т.е умножаем на 5, и сдвигаем влево на 4 бита, правильно? (ну не считая того, что мы потеряем запятую, т.к важно целое число).

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

Цитата(Kuznec9999 @ May 5 2008, 14:50) *
Подскажите мне, если можно, как работает ШИМ. Подаём на вход двоичное число, и получаем ШИМ последовательность, отношение 1/0 у которого равно этому числу?. Т.е для 8 бит: 0-255. Подав 128 получим меандр?

Да.
million68
Редактирование сообщения в Проблема начального запуска
Сори, что-то заглючило
Kuznec9999
Цитата(777777 @ May 5 2008, 15:33) *
Для начала надо бы поросить автора показать схему сброса (то, что приходит на вход RESET) и приходит ли вообще. А из этого уже можно решать, насколько эта схема критична к плавному увеличению питания.

На ресете нет ничего, в этом и была проблема. Таймер сброса даёт команду выйти из режима сброса (через 16мсек.), а напряжение на микросхеме не достигло к тому времени необходимого для корректной инициализации и работы значения. В результате этого запуск был нестабилен. Если включить фьюз BOD, то запуск микроконтроллера будет произведён только после того, как напряжение питания будет равно 2.7В (или 4.0В если установлен фьюз BOD LEVEL), а следовательно запуск микроконтроллера будет стабилен независимо от переходных процессов во время подачи питания.

Цитата(aaarrr @ May 5 2008, 15:42) *
Вправо сдвигаем только, а так все правильно.

Конечно вправо, это я поторопился немного. Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.