Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Вы в железе или в симуляторе смотрите?
Кстати, в ДШ тоже непонятная фигня с адресами SRAM:
Изображение
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

Я смотрю в симуляторе. Сделал новый проект, и то-же мой код (и ваш тоже) перестал выдавать ошибку.
В картинке вроде для 168PA третье значение. непонятное мне.
Вроде не было варнингов, а появились.
AVR Simulator: Invalid opcode 0xffff at address 0x000008
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

barok22 писал(а):AVR Simulator: Invalid opcode 0xffff at address 0x000008
Это у вас в симуляторе код закончился на 8-й команде. Чтобы такого не было, зацикливайте программу в конце командой
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

Варнинги исчезли, все в порядке, спасибо.
Значения в картинке не совпадают с текстом:
The 32 general purpose working registers, 64 I/O Registers, 160 Extended I/O Registers, and
the 512/1024/1024/2048 bytes of internal data SRAM in the ATmega48PA/88PA/168PA/328P
are all accessible through all these addressing modes.
Как узнать, сколько же памяти в моей 168PA?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

barok22 писал(а):Как узнать, сколько же памяти в моей 168PA?
Найти даташит без опечаток :idea:
А вообще килобайт там...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Просмотреть не только даташит, не и ерраты! 8)
И самое главное выбрать соответствующие *.inc фйлы для исходника (или их подкорректировать).
Последний раз редактировалось BOB51 Пт фев 28, 2014 12:28:16, всего редактировалось 1 раз.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Engineer_Keen писал(а):Найти даташит без опечаток
Да. В посл. ДШ исправлено.
SRAM с адреса 100h по 4FFh — 1024 байта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

"В ранних версиях применялся микроконтроллер ATmega168 с меньшими объемами памяти: память программ - 16 К (2 К заняты загрузчиком), ОЗУ - 1 Кбайт, EEPROM - 512 байт."
http://freeduino.ru/arduino/spec.html

У меня как раз 168PA. Как бы проверить, сколько на самом деле?
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

barok22 писал(а):память программ - 16 К (2 К заняты загрузчиком), ОЗУ - 1 Кбайт, EEPROM - 512 байт.
Так и осталось.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

Я не понимаю: если у нас стек в конце памяти, то он должен начинаться в конце 16k памяти? т.е. с адреса 3FFF . почему ему назначили 4FF ? т.е. гораздо ближе?
akl
Друг Кота
Сообщения: 4472
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Стек, как правило, устанавливается в конец оперативной памяти (RAM), т.е. 0x4FF.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Вы окончательно запутались в мягком и тёплом: у МК 3 (ТРИ!!!) вида памяти:
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

а 16к памяти это память с медленным доступом? почему не туда засунуть стек?
В книжках пишут, что стек может затереть программы, поэтому мне и кажется, что стек в старших адресах, заполняясь достигает младших адресов, и может затереть программу. если же он в младших адресах, то программу он не затрет никак.
Последний раз редактировалось barok22 Пт фев 28, 2014 13:12:33, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

barok22 писал(а):а 16к памяти это память с медленным доступом?
Это флэш память, она стирается постранично и у неё ресурс ограничен на уровне 10000 записей, у EEPROM побольше — 100000 стираний. А ОЗУ вообще можно перезаписывать побайтно бесконечно. Учите матчасть, как грится.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

barok22, ещё раз прочитайте, что написал Gudd-Head.
Gudd-Head писал(а):у МК 3 (ТРИ!!!) вида памяти:
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
И добавьте к этому тот факт, что эти "памяти" находятся отдельно друг от друга, на разных шинах адреса.
Т.е. если вы адресуете FLASH, то вы никак там в RAM или EEPROM не попадёте.
Это три разных вида памяти каждая в своём адресном пространстве.
barok22 писал(а):В книжках пишут, что стек может затереть программы
Это возможно в архитектурах, где память программ и данных общая (тынц).
У AVR-ок она раздельная (тынц).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Kavka писал(а):Это возможно в архитектурах, где память программ и данных общая (тынц).
А вот попортить значение переменной стек может (и наоборот). Если граница стека пересечет границу, где располагаются переменные и массивы, то возможно 2 варианта:
1) Стек запишет что-то в переменную, тогда при чтении этого адреса вместо переменной просто получите хрень (например кусок адреса возврата).
2) Программа запишет что-то в переменную, тогда при чтении этого адреса стек получит вместо адреса возврата значение переменной и программа перескочит по произвольному адресу (что скорее всего повлечет за собой сброс).
Так что учтите, что ваш килобайт на самом деле не килобайт, а немного меньше!
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

Значит не может случиться так, что программа сама изменяет данные во флеш памяти(та что большая, 16к), и может превысить лимит на перезапись в 10 000раз? Например:
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Для изменения памяти программ в цикле программы нужна специальная команда SPM.
Если в коде она не будет её трогать, то память будет в порядке.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Сообщение Andrew Martin »

barok22 писал(а):Значит не может случиться так, что программа сама изменяет данные во флеш памяти(та что большая, 16к), и может превысить лимит на перезапись в 10 000раз? Например:
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
Это не пример. Запись в память программ может делать либо программатор при прошивке, либо сама программа (инструкцией SPM, как это делает например бутлодырь), но это сложная процедура с массой ограничений.
Ещё раз - учите матчасть и читайте даташиты. Самопрограммирование МК - это не такая простая процедура, как кажется, и "случайно" записать что-либо в память программ (FLASH) у вас никак не получится.
Родился
Аватара пользователя
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

Сообщение barok22 »

Спасибо.
Ответить

Вернуться в «AVR»