|
RESET, Что должно быть на ней? |
|
|
|
May 5 2008, 14:02
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
У меня в проекте установлен фьюз BODON (запуск при достижении питания), однако даже с ним схема не всегда удачно стартует. Как повысить стабильность запуска схемы? Может стоит подключить какую-либо внешнюю цепь к выводу reset?
|
|
|
|
|
May 5 2008, 14:06
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 9-06-05
Пользователь №: 5 885

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

Участник

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204

|
Цитата(Kuznec9999 @ May 5 2008, 18:02)  У меня в проекте установлен фьюз BODON (запуск при достижении питания), однако даже с ним схема не всегда удачно стартует. Как повысить стабильность запуска схемы? Может стоит подключить какую-либо внешнюю цепь к выводу reset? Reset стОит подтянуть через резистор 4,7-10к к питанию. Кстати - это может быть проблема не ресета, а запуска генератора (конденсаторов в обвязке кварца нет или не те, остатки флюса около кварца, неправильно выставленные фузы CKSEL,CKOPT etc).
|
|
|
|
|
May 5 2008, 14:40
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(Vlad219i @ May 5 2008, 18:20)  Reset стОит подтянуть через резистор 4,7-10к к питанию. Кстати - это может быть проблема не ресета, а запуска генератора (конденсаторов в обвязке кварца нет или не те, остатки флюса около кварца, неправильно выставленные фузы CKSEL,CKOPT etc). Дело в том, что генератор внутренний. А при запуске индикатор выдаёт совершенно "нечитабельные" символы. Хотя по динамике их работы видно, что программа всё же работает. Всё-таки инициализировать ОЗУ обязательно. Сейчас буду пробовать. Уверен, дело в этом. Добавил в программу блок инициализации (очистки) ОЗУ, запуск стал корректным даже при отсутствии чего-либо на ножке reset.
Сообщение отредактировал Kuznec9999 - May 5 2008, 15:02
|
|
|
|
|
May 5 2008, 16:22
|

Участник

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204

|
Цитата(Kuznec9999 @ May 5 2008, 18:40)  Всё-таки инициализировать ОЗУ обязательно. Думается мне - это косяк вот этой конкретной программы. )
|
|
|
|
|
May 5 2008, 16:37
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(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)  А ватчдог? Нет, не зависает. Видно по скорости обновления индикатора, что так и должно быть (т.е она работает, только данные из ОЗУ читаются неверно, и неверно же выдаются на индикатор.
Сообщение отредактировал Kuznec9999 - May 5 2008, 16:38
|
|
|
|
|
May 5 2008, 16:41
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Kuznec9999 @ May 5 2008, 18:40)  Всё-таки инициализировать ОЗУ обязательно. Переменные, находящиеся в ОЗУ, инициализировать обязательно, а всё ОЗУ нет. Рекомендую составить подпрограммы инициализации переменных для каждой задачи, и в самом начале их вызывать. Так-же нужна подпрограмма инициализации портов. Только ук-ль стека нужно инициализировать до их вызова. А эти подпрограммы и не при старте потом понадобится могут. Посмотрел вашу программу - впечатлило. Видимо это N1? Ну чтож - всё когда-то новичками были. А вообще всё правильно делаете - с ассемблера и нужно начинать. Только рекомендую какие-нибудь примеры посмотреть что-ли. Особенно интересно смотреть на Код in r18,sreg sbrs r18,1 rjmp init1 Что можно заменить на Код brne init1 А вообще удивительно, что эта программа работает! А разная ерунда на индикатор выводится видимо из-за того, что вы при отсутствии обнуления ОЗУ, видимо и zh не обнуляли.
|
|
|
|
|
May 5 2008, 17:37
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(galjoen @ May 5 2008, 20:41)  Переменные, находящиеся в ОЗУ, инициализировать обязательно, а всё ОЗУ нет. Рекомендую составить подпрограммы инициализации переменных для каждой задачи, и в самом начале их вызывать. Так-же нужна подпрограмма инициализации портов. Только ук-ль стека нужно инициализировать до их вызова. А эти подпрограммы и не при старте потом понадобится могут. Посмотрел вашу программу - впечатлило. Видимо это N1? Ну чтож - всё когда-то новичками были. А вообще всё правильно делаете - с ассемблера и нужно начинать. Только рекомендую какие-нибудь примеры посмотреть что-ли. Особенно интересно смотреть на Код in r18,sreg sbrs r18,1 rjmp init1 Что можно заменить на Код brne init1 А вообще удивительно, что эта программа работает! А разная ерунда на индикатор выводится видимо из-за того, что вы при отсутствии обнуления ОЗУ, видимо и zh не обнуляли. Спасибо за развёрнутый ответ. Нет, это №2  . Кстати, как не странно, работает отлично  . Процедура очистки ОЗУ - в самом начале. Что такое zh?  Что представляет собой инициализация переменных, портов? Извините за множество вопросов. Микроконтроллеры для меня пока - зелёный лес  .
Сообщение отредактировал Kuznec9999 - May 5 2008, 17:40
|
|
|
|
|
May 5 2008, 17:52
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Kuznec9999 @ May 5 2008, 21:37)  Что такое zh? Код clr zh Вот обнуление (zh==r31). Вы командой ld r25,z пользовались, а она адрес из zh и zl берёт. ldi zl,0 вы делали,а ldi zh,0 нет. А в zh случайное число при включении процессора попадало. А всетаки посмотрите как другие-то программы пишут - поучитесь. Это самый лучший способ обучения. Ну и теорию почитайте конечно.
|
|
|
|
|
May 5 2008, 18:15
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(galjoen @ May 5 2008, 21:52)  Код clr zh Вот обнуление (zh==r31). Вы командой ld r25,z пользовались, а она адрес из zh и zl берёт. ldi zl,0 вы делали,а ldi zh,0 нет. А в zh случайное число при включении процессора попадало. А всетаки посмотрите как другие-то программы пишут - поучитесь. Это самый лучший способ обучения. Ну и теорию почитайте конечно. Ну конечно я смотрел примеры и читал теорию. Не стал бы я "из головы" писать на ассемблере  . А насчёт zh.. Я сначала подумал, что это какой-то особый оператор  . А про r30-31 даже и не подумал  . Перед использованием любого регистра его нужно инициализировать (очистить) обязательно? Не думал об этом.
Сообщение отредактировал Kuznec9999 - May 5 2008, 18:17
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|