Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RESET
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kuznec9999
У меня в проекте установлен фьюз BODON (запуск при достижении питания), однако даже с ним схема не всегда удачно стартует. Как повысить стабильность запуска схемы? Может стоит подключить какую-либо внешнюю цепь к выводу reset?
volod_ua
Цитата(Kuznec9999 @ May 5 2008, 17:02) *
У меня в проекте установлен фьюз BODON (запуск при достижении питания), однако даже с ним схема не всегда удачно стартует. Как повысить стабильность запуска схемы? Может стоит подключить какую-либо внешнюю цепь к выводу reset?

На ресеті висить резістор і конденсатор....можна поставити супервізор... а так більше нічого не треба
uriy
А вы уверена что проблема в ресете. Может кварц виноват.
Vlad219i
Цитата(Kuznec9999 @ May 5 2008, 18:02) *
У меня в проекте установлен фьюз BODON (запуск при достижении питания), однако даже с ним схема не всегда удачно стартует. Как повысить стабильность запуска схемы? Может стоит подключить какую-либо внешнюю цепь к выводу reset?


Reset стОит подтянуть через резистор 4,7-10к к питанию.
Кстати - это может быть проблема не ресета, а запуска генератора (конденсаторов в обвязке кварца нет или не те, остатки флюса около кварца, неправильно выставленные фузы CKSEL,CKOPT etc).
Kuznec9999
Цитата(Vlad219i @ May 5 2008, 18:20) *
Reset стОит подтянуть через резистор 4,7-10к к питанию.
Кстати - это может быть проблема не ресета, а запуска генератора (конденсаторов в обвязке кварца нет или не те, остатки флюса около кварца, неправильно выставленные фузы CKSEL,CKOPT etc).

Дело в том, что генератор внутренний. А при запуске индикатор выдаёт совершенно "нечитабельные" символы. Хотя по динамике их работы видно, что программа всё же работает. Всё-таки инициализировать ОЗУ обязательно. Сейчас буду пробовать. Уверен, дело в этом. Добавил в программу блок инициализации (очистки) ОЗУ, запуск стал корректным даже при отсутствии чего-либо на ножке reset.
chds
Были такие же гадости - плата могла несколько раз стартовать отлично, а могла и просто зависнуть в неопределенном состоянии. Помог внешний дубовый супервизор питания. Все стало предсказуемо и стабильно запускаться, в не зависимости от того как клацают тумблером питания.
domowoj
Еще обязательно вблизи МК необходимо поставить керамич.
кондер 0,047...0,22 мкФ.
galjoen
Цитата(chds @ May 5 2008, 19:45) *
а могла и просто зависнуть в неопределенном состоянии.

А ватчдог?
Vlad219i
Цитата(Kuznec9999 @ May 5 2008, 18:40) *
Всё-таки инициализировать ОЗУ обязательно.


Думается мне - это косяк вот этой конкретной программы. )
Kuznec9999
Цитата(Vlad219i @ May 5 2008, 20:22) *
Думается мне - это косяк вот этой конкретной программы. )


Посмотрите, пожалуйста. Возможно что-то я делаю не так? Косяки очень возможны. Спасибо.

===================================================

.include "c:\asm\AvrAssembler2\Appnotes\m8def.inc"


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
clr zh
clr zl
clr r16
init: ; Начало программы


; Включаем и инициализируем АЦП
ldi r20,0b11100100
out adcsra,r20
ldi r20,0b11100000
out admux,r20

; Запись консанты начала ОЗУ
ldi r24,$0060

; Загрузка таблицы чисел семисегментного индикатора в ОЗУ
ldi r29,0b11111100
sts $0060,r29
ldi r29,0b01100000
sts $0061,r29
ldi r29,0b11011010
sts $0062,r29
ldi r29,0b11110010
sts $0063,r29
ldi r29,0b01100110
sts $0064,r29
ldi r29,0b10110110
sts $0065,r29
ldi r29,0b10111110
sts $0066,r29
ldi r29,0b11100000
sts $0067,r29
ldi r29,0b11111110
sts $0068,r29
ldi r29,0b11110110
sts $0069,r29

; Перемещаем данные АЦП в регистр r16
in r16,adch

; Если - перебор, то выводим E
ldi r29,255
cp r16,r29
in r28,sreg
sbrc r28,1
rjmp error

; Переводим регистр r16 в двоично-десятичный код
ldi r17,164
mul r16,r17
clr r18
lsl r0
rol r1
rol r18
lsl r0
rol r1
rol r18
inc r1
ldi r16,10
mul r1,r16
mov r17,r1
mul r0,r16
mov r16,r1

; Прибавляем единицу для коррекного инкремента
subi r16,-1
subi r17,-1
subi r18,-1

; Находим и устанавливам разряд 1 в регистр r25
ldi zl,0
nrav1:
inc zl
cp r16,zl
in r20,sreg
sbrs r20,1
rjmp nrav1
subi zl,1
add zl,r24
ld r25,z

; Находим и устанавливам разряд 2 в регистр r26
ldi zl,0
nrav2:
inc zl
cp r17,zl
in r20,sreg
sbrs r20,1
rjmp nrav2
subi zl,1
add zl,r24
ld r26,z

; Находим и устанавливам разряд 3 в регистр r27
ldi zl,0
nrav3:
inc zl
cp r18,zl
in r20,sreg
sbrs r20,1
rjmp nrav3
subi zl,1
add zl,r24
ld r27,z

; Инициализируем порты B и D
ldi r16,0b11111111
out ddrb,r16
out ddrd,r16

; Выводим информацию последовательно в порт: R25 R26 R27
ldi r22,0
ldi r23,0
ldi r24,128
zad:
inc r23
cp r23,r24
in r22,sreg
sbrc r22,1
rjmp init

; Младший разряд
ldi r20,0b11111011
out portd,r20
out portb,r25

; Задержка
ldi r16,255
ldi r17,0
init1:
inc r17
cp r16,r17
in r18,sreg
sbrs r18,1
rjmp init1

; Средний разряд
ldi r20,0b11111101
out portd,r20
out portb,r26
sbi portb,0 ; Точка дробного остатка

; Задержка
ldi r16,255
ldi r17,0
init2:
inc r17
cp r16,r17
in r18,sreg
sbrs r18,1
rjmp init2

; Старший разряд
ldi r20,0b11111110
out portd,r20
out portb,r27


; Задержка
ldi r16,255
ldi r17,0
init3:
inc r17
cp r16,r17
in r18,sreg
sbrs r18,1
rjmp init3
rjmp zad

error:
ldi r20,0b11111000
out portd,r20
ldi r27,0b10011110
out portb,r27
sbi portb,1

===========================================

Цитата(galjoen @ May 5 2008, 20:08) *
А ватчдог?

Нет, не зависает. Видно по скорости обновления индикатора, что так и должно быть (т.е она работает, только данные из ОЗУ читаются неверно, и неверно же выдаются на индикатор.
galjoen
Цитата(Kuznec9999 @ May 5 2008, 18:40) *
Всё-таки инициализировать ОЗУ обязательно.

Переменные, находящиеся в ОЗУ, инициализировать обязательно, а всё ОЗУ нет. Рекомендую составить подпрограммы инициализации переменных для каждой задачи, и в самом начале их вызывать. Так-же нужна подпрограмма инициализации портов. Только ук-ль стека нужно инициализировать до их вызова. А эти подпрограммы и не при старте потом понадобится могут.

Посмотрел вашу программу - впечатлило. Видимо это N1? Ну чтож - всё когда-то новичками были. А вообще всё правильно делаете - с ассемблера и нужно начинать. Только рекомендую какие-нибудь примеры посмотреть что-ли. Особенно интересно смотреть на
Код
in r18,sreg
sbrs r18,1
rjmp init1

Что можно заменить на
Код
brne init1

А вообще удивительно, что эта программа работает!
А разная ерунда на индикатор выводится видимо из-за того, что вы при отсутствии обнуления ОЗУ, видимо и zh не обнуляли.
Kuznec9999
Цитата(galjoen @ May 5 2008, 20:41) *
Переменные, находящиеся в ОЗУ, инициализировать обязательно, а всё ОЗУ нет. Рекомендую составить подпрограммы инициализации переменных для каждой задачи, и в самом начале их вызывать. Так-же нужна подпрограмма инициализации портов. Только ук-ль стека нужно инициализировать до их вызова. А эти подпрограммы и не при старте потом понадобится могут.

Посмотрел вашу программу - впечатлило. Видимо это N1? Ну чтож - всё когда-то новичками были. А вообще всё правильно делаете - с ассемблера и нужно начинать. Только рекомендую какие-нибудь примеры посмотреть что-ли. Особенно интересно смотреть на
Код
in r18,sreg
sbrs r18,1
rjmp init1

Что можно заменить на
Код
brne init1

А вообще удивительно, что эта программа работает!
А разная ерунда на индикатор выводится видимо из-за того, что вы при отсутствии обнуления ОЗУ, видимо и zh не обнуляли.

Спасибо за развёрнутый ответ. Нет, это №2 smile.gif . Кстати, как не странно, работает отлично smile.gif. Процедура очистки ОЗУ - в самом начале. Что такое zh? rolleyes.gif Что представляет собой инициализация переменных, портов? Извините за множество вопросов. Микроконтроллеры для меня пока - зелёный лес smile.gif.
galjoen
Цитата(Kuznec9999 @ May 5 2008, 21:37) *
Что такое zh?

Код
clr zh

Вот обнуление (zh==r31).
Вы командой ld r25,z пользовались, а она адрес из zh и zl берёт. ldi zl,0 вы делали,а ldi zh,0 нет. А в zh случайное число при включении процессора попадало.

А всетаки посмотрите как другие-то программы пишут - поучитесь. Это самый лучший способ обучения. Ну и теорию почитайте конечно.
Kuznec9999
Цитата(galjoen @ May 5 2008, 21:52) *
Код
clr zh

Вот обнуление (zh==r31).
Вы командой ld r25,z пользовались, а она адрес из zh и zl берёт. ldi zl,0 вы делали,а ldi zh,0 нет. А в zh случайное число при включении процессора попадало.

А всетаки посмотрите как другие-то программы пишут - поучитесь. Это самый лучший способ обучения. Ну и теорию почитайте конечно.


Ну конечно я смотрел примеры и читал теорию. Не стал бы я "из головы" писать на ассемблере smile.gif. А насчёт zh.. Я сначала подумал, что это какой-то особый оператор rolleyes.gif . А про r30-31 даже и не подумал smile.gif. Перед использованием любого регистра его нужно инициализировать (очистить) обязательно? Не думал об этом.
vet
многобайтные числа нужно инкрементировать по-другому:
subi r16,-1
sbci r17,-1
sbci r18,-1
Kuznec9999
Цитата(vet @ May 5 2008, 22:41) *
многобайтные числа нужно инкрементировать по-другому:
subi r16,-1
sbci r17,-1
sbci r18,-1

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