Здравствуйте. Помогите пожалуйста разобраться с проблемой:
Написал я прогу под atmega16. В протэусе работает идеально. Зашил в МК (программатор ChipProg Phyton). При включении питания МК то работает, то не работает, причем нет определенной закономерности его глюка (включая, выключаю - раз 5 не глючит, затем 6-8-??? глючит)) ). Во время глюка, на определенных линиях портов выдаются "неведомые" мной сигналы(я их по идее вообще не трогаю). Пробовал заменить МК на другой, идентичный, но тщетно. Источник питания вроде стабилизированный. От помех по питанию стоит конденсатор 0.1мкф.
Биты конфигураций:
CKSEL3-0=1111
SUT=11
CKPOT=1
JTAGEN=1
OCDEN=0
BODEN=0
BODLEVEL=0
BOTRST=0
BOTSZ1=0
BOTSZ0=0
Использую внешний кварц на 4Мгц.
Проблема может быть (а это скорее всего) в прошивке. по питанию еще не помешал бы электролит на 10...47 мкФ. И вообще без схемы и прошивки как можно советовать что-то?
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Вообще не трогаете, т.е. даже не проводите инициализации в момент загрузки? Или после нее не изменяете состояния?
Покажите кусок инициализации всего и вся после RESET'а.
На счет схемы: Я отсоединил МК от "периферии" т.е. оставил только питание, но глюк все равно остался (проверял осциллографом). На всякий случай оставлю схему.
А порты я конечно "настраиваю" в начале.
Начало программы:
.include "m16def.inc" ; Присоединение файла описаний
.list ; Включение листинга
ldi temp1, low(RAMEND) ; Выбор вершины стека
out SPL, temp1 ; Запись его в регистр стека
ldi temp1, high(RAMEND) ; Выбор вершины стека
out SPH, temp1 ; Запись его в регистр стека
;--------Настройка таймера 1 (прерывание по переполнению)
ldi temp1, 0x05
out TCCR1B, temp1
;--------Определение маски прерывания
ldi temp1,0x04 ; Разрешение прерывания по переполнению таймер 1
out TIMSK, temp1 ; Запись маски
;---------Инициализация коипаратора
ldi temp1, 0x80 ; Выключение компаратора
out ACSR, temp1
;---------Инициализация портов
ldi temp1, 0x03
out DDRA, temp1
ldi temp1, 0x7C
out DDRD, temp1
ldi temp1, 0xff
out PORTD, temp1
;---------Инициализация USART--------------------
ldi temp1, 0x00
out UCSRA, temp1
ldi temp1, 0x90
out UCSRB, temp1
ldi temp1, 0x86
out UCSRC, temp1
ldi temp1, 0x00
out UBRRH,temp1
ldi temp1, 0x19
out UBRRL,temp1
А кто Вас так учил RESET заводить?
Поставьте резистор между выводом RESET и Vcc порядка 10кОм, и конденсатор не помешает порядка 0,1мкФ на землю от RESET (эти меры дают "удлинение" внутреннего Сброса).
Конденсаторы С11 и С12 не великоваты 27пФ? В datasheet'е рекомендуется до 22пФ...
Последний раз редактировалось mr.Kirill Ср дек 16, 2009 22:47:08, всего редактировалось 2 раза.
AVCC и AGND так и висят в воздухе? надо бы их на место присоединить: к питанию и общему соответственно. И вход RESET к VCC обычно через резистор около 10кОм присоединяют.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Помнится на работе был следующий случай: припаял МК. У него питание по цифровой части и по аналоговой было с перемычкой. Перемычку запаивать не стал - аналоговая часть не использовалась на момент отладки моей части устройства. Включил - кварц не запустился... замена кварца, промывка платы и прочие шаманства не помогали. Пока не подключил питание на аналоговую часть МК не заводился...
МК был не АВР... но на размышление навело. С тех пор я в своих конструкциях питание подключаю всегда. )) Попробуйте.
Всем спасибо за участие!)) Проблема решена. Причем решена самым неожиданным образом. Я последовал вашим советам и соединил все так как подобает, но все таки мой глюк повторялся снова и снова))). Оказывается дело было в регистре косвенного указателя Z в программе.
Я использовал только младшую его "часть", не задумываясь о старшей. Так вот, как только я обнулил ZH в начале программы (до использования ZL) глюк прекратился. Вероятно по включению питания в него записывается "random" ну и конечно временами нужный для меня "0" . И вот теперь сижу и думаю - как это может быть и прав ли я вообще(ну другого просто не вижу)?. В литературе, на форумах я советов обнулять старший регистр не встречал.
Не пишут потому как это само собой разумеется. Значение регистра при подаче питания - явление уникальное и не всегда равное ожидаемому 0. А при обращении по 16 битной адресации без учета состояния старшего байта можно куда угодно угодить. Так что догадки правильные
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
ernestto писал(а):В литературе, на форумах я советов обнулять старший регистр не встречал.
Обнулять (присваивать начальные значения) переменным и регистрам при инициализации это самое первое правило. Про обнуление старшего регистра никто и не будет писать, это самособой разумеющееся.