Глюк по включению питания Atmega16

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 3
Зарегистрирован: Вт дек 15, 2009 18:51:16

Сообщение ernestto »

Здравствуйте. Помогите пожалуйста разобраться с проблемой:

Написал я прогу под 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Мгц.

Заранее спасибо).
Реклама
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Проблема может быть (а это скорее всего) в прошивке. по питанию еще не помешал бы электролит на 10...47 мкФ. И вообще без схемы и прошивки как можно советовать что-то?
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

ernestto писал(а):(я их по идее вообще не трогаю)
Вообще не трогаете, т.е. даже не проводите инициализации в момент загрузки? Или после нее не изменяете состояния?
Покажите кусок инициализации всего и вся после RESET'а.
[color=#0000BF]"Какой тоской душа не сражена - быть твердым заставляют времена"© "Король Лир" У.Шекспир.[/color]
Родился
Сообщения: 3
Зарегистрирован: Вт дек 15, 2009 18:51:16

Сообщение ernestto »

На счет схемы: Я отсоединил МК от "периферии" т.е. оставил только питание, но глюк все равно остался (проверял осциллографом). На всякий случай оставлю схему.

А порты я конечно "настраиваю" в начале.
Начало программы:
.include "m16def.inc" ; Присоединение файла описаний
.list ; Включение листинга



.def temp1 = R16 ; Аккумулятор 1
.def temp2 = R17 ; Аккумулятор 2
.def inter = R18 ; Аккумулятор обработчика прерывании по таймеру1
.def count = R19 ; Счетчик в цикле пробежки по светодиодам
.equ led_delay = 150 ; Коэфициент задержки для индикатора
.equ led_delay1 = 200
.equ led_delay2 = 200
.equ SLAVE_ADRESS = 0x01

;---------Резервирование ячеек памяти

.dseg ; Сеггмент данных
.org 0x70 ; Установка текущего адреса в сегменте данных

invert: .byte 1 ; Один байт для хранения рабочего значения(адрес 0х76)
shift_counter: .byte 1
code_bufer: .byte 1
push_button: .byte 1
bufer_km: .byte 1
X_buffer: .byte 2
push_counter: .byte 1

F_UDR_TX: .byte 1
UDR_TX_COUNTER: .byte 1
CS_TX: .byte 1
C: .byte 1
I: .byte 1
; еще зарезервированно 19 0x8А - 9В под массив приема пакета

.org 0x9E
_3A_TRUE: .byte 1 ; Флаг фиксирующий прием 3А
UDR_BUFFER: .byte 1 ; Буфер для хранения значения регистра UDR
UART_ADRESS_TRUE: .byte 1 ; Флаг фиксирующий прием адреса
F_READY: .byte 1 ; флаг готовности HEX байта
BYTE_COUNTER: .byte 1 ; счетчик принятых байтов в подпрограмме ASCII_HEX
BYTE_HEX: .byte 1 ; Буфер HEX байта
ADRESS_COUNTER: .byte 1 ; счетчик буфера приема пакета
CS: .byte 1
UART_RECIVE_TRUE: .byte 1

.org 0xAD
HEX_BUFFER_IN: .byte 1 ; Входная переменная с HEX байтом (HEX_ASCII)
HEX_BUFFER_OUT1: .byte 1 ; Выходная переменная с HEX байтом1 (HEX_ASCII)
HEX_BUFFER_OUT2: .byte 1 ; Выходная переменная с HEX байтом2 (HEX_ASCII)



;---------Начало программного кода

.cseg ; Сегмент кода
.org 0 ; Установка текущего адреса в сегменте кода

;---------Переопределение векторов прерывания


rjmp main ; Переход на начало программы


.org 0x10
rjmp timer1
.org 0x16
rjmp UART_RXC






;-------Модуль инициализации

main:

clr temp1
ldi XL, 0x60
CLRS:
st X+, temp1
cpse XL, temp2
rjmp CLRS
ldi temp1, 0xff
sts invert, temp1 ; Инициализация инвертной переменной
ldi temp1, 0xA7
sts I, temp1

;-------Инициализация стека


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

;------Инициализация данных

ldi count,0x00 ; Сброс счетчика
ldi ZL, 0x60 ; Запись в косв. регистр начало адреса массива
ldi temp1, 0x01
sts shift_counter, temp1
rcall set_timer1 ;Вызов подрограммы инициализации счетного регистра таймера 1
ldi temp1, 0x00
sts BYTE_COUNTER, temp1


;------Цикл пробежки по светодиодам

start:

и т.д и т.п
Вложения
Shema.jpg
(76.03 КБ) 505 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

А кто Вас так учил RESET заводить?
Поставьте резистор между выводом RESET и Vcc порядка 10кОм, и конденсатор не помешает порядка 0,1мкФ на землю от RESET (эти меры дают "удлинение" внутреннего Сброса).
Конденсаторы С11 и С12 не великоваты 27пФ? В datasheet'е рекомендуется до 22пФ...
Последний раз редактировалось mr.Kirill Ср дек 16, 2009 22:47:08, всего редактировалось 2 раза.
[color=#0000BF]"Какой тоской душа не сражена - быть твердым заставляют времена"© "Король Лир" У.Шекспир.[/color]
Реклама
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

AVCC и AGND так и висят в воздухе? :shock: надо бы их на место присоединить: к питанию и общему соответственно. И вход RESET к VCC обычно через резистор около 10кОм присоединяют.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Помнится на работе был следующий случай: припаял МК. У него питание по цифровой части и по аналоговой было с перемычкой. Перемычку запаивать не стал - аналоговая часть не использовалась на момент отладки моей части устройства. Включил - кварц не запустился... замена кварца, промывка платы и прочие шаманства не помогали. Пока не подключил питание на аналоговую часть МК не заводился...

МК был не АВР... но на размышление навело. С тех пор я в своих конструкциях питание подключаю всегда. )) Попробуйте. ;)
Today fine night...
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Между прочим, в ДШ на меги пишут, что AVCC нужно подключать ОБЯЗАТЕЛЬНО, даже если АЦП не используем. А если используем, то нужно еще и фильтровать.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Родился
Сообщения: 3
Зарегистрирован: Вт дек 15, 2009 18:51:16

Сообщение ernestto »

Всем спасибо за участие!)) Проблема решена. Причем решена самым неожиданным образом. Я последовал вашим советам и соединил все так как подобает, но все таки мой глюк повторялся снова и снова))). Оказывается дело было в регистре косвенного указателя Z в программе.
Я использовал только младшую его "часть", не задумываясь о старшей. Так вот, как только я обнулил ZH в начале программы (до использования ZL) глюк прекратился. Вероятно по включению питания в него записывается "random" ну и конечно временами нужный для меня "0" . И вот теперь сижу и думаю - как это может быть и прав ли я вообще(ну другого просто не вижу)?. В литературе, на форумах я советов обнулять старший регистр не встречал.
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Не пишут потому как это само собой разумеется. Значение регистра при подаче питания - явление уникальное и не всегда равное ожидаемому 0. А при обращении по 16 битной адресации без учета состояния старшего байта можно куда угодно угодить. Так что догадки правильные
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

ernestto писал(а):В литературе, на форумах я советов обнулять старший регистр не встречал.
Обнулять (присваивать начальные значения) переменным и регистрам при инициализации это самое первое правило. Про обнуление старшего регистра никто и не будет писать, это самособой разумеющееся.
[color=#0000BF]"Какой тоской душа не сражена - быть твердым заставляют времена"© "Король Лир" У.Шекспир.[/color]
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»