Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Возможно элементы схемы просаживают сигналы программатора. Ведь мк у вас впаян, а схемы мы не видим. Выпаяйте и попробуйте.
Docendo discimus
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Я осваиваю AVR по обучалке на нашем сайте, испытываю на Шпротеусе. созрел вопросик:

В главе "Настройка портов ввода-вывода" предлагался такой код:

Код: Выделить всё

ldi Temp,0b11010010  ;присвоение константы
out PortB,Temp         ;вывод на индикацию
автор утверждает:
Должны загореться соответствующие светодиоды. Кричим УРА, идем дальше… :)
А когда я прошил его в виртуальный контроллер, симулятор выдал ошибку: "Invalid opcode 0xFFFF ar PC=ox000A".

немного поразмыслив, я решил зациклить программу через метку:

Код: Выделить всё

Begin: ldi Temp0,0b10101010  ;присвоение константы
       out PortB,Temp0         ;вывод на индикацию
rjmp Begin
После чего соответствующие светодиоды успешно загорелись.
Так это в обучалке дан инвалидный код, и любую программу необходимо зацикливать или же это проблема симулятора, а на реальном контроллере все должно работать?
Последний раз редактировалось Vicont Чт сен 06, 2012 11:30:30, всего редактировалось 1 раз.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20140
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Vicont писал(а):виртуальный контроллер
В нём всё дело.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Ясно, попробую в дальнейшем на реальном МК этот код испытать.

И еще: что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20140
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Vicont писал(а):что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?
Да.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

В таком случае, если в дальнейшем вообще не предполагается работа с ОЗУ, на стеки можно вообще забить со спокойной совестью или все же лучше перестраховаться ?
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Если не будут использоваться подпрограммы, тогда да. Если будут - то будет использоваться ОЗУ, и стек нужен.
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Я имею в виду, что подпрограммы использоваться то будут, но они не будут работать с ОЗУ в полном смысле этого слова (из всей ОЗУ будет использоваться лишь 1 регистр для хранения адреса основной программы, на котором началась подпрограмма).
Ведь если не инициализировать стек, то адрес команды должен прописаться в ОЗУ по дефолту и должен там храниться до тех пор пока не начнется вторая подпрограмма... (конечно, в том случае, если одна ПОДпрограмма не вложена в другую ПОДпрограмму)
По крайней мере, когда я испытывал в Шпротеусе, подпрограммы работали и без указания стека. Можно ли так делать в реале?
Последний раз редактировалось Vicont Чт сен 06, 2012 12:11:18, всего редактировалось 1 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20140
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Vicont писал(а):Можно ли так делать в реале?
Нет. При вызывании подпрограмм нужно инициализировать стек.
В противном случае вы рискуете вернуться из подпрограммы совсем не в то место.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Хорошо. Делать подпрограммы без стека больше не буду.

Но все равно не могу понять куда денется тот адрес команды???

На ум приходят 3 варианта ответа:
1. Он может прописаться по дефолту в тот регистр ОЗУ, где программа его не сможет найти.
2. Он может вообще не прописаться в ОЗУ.
3. Он пропишется в регистр ОЗУ по дефолту, но сотрется по какой-то непредвиденной причине, команда его сможет найти, но в нем будет уже совсем не тот адрес.
Последний раз редактировалось Vicont Чт сен 06, 2012 12:37:11, всего редактировалось 2 раза.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20140
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Применительно к АВР...
Почти у всех АВРок по умолчанию указатель стека (SP) после ресета равен 0000.
Как известно, при вызове подпрограммы содержимое счётчика команд (РС) — адрес того места, из которого вызвана команда — 2 байта, сохраняется в стеке (на самом деле, РС+1 — адрес след. команды), следовательно получается SP = SP - 2.
Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Gudd-Head писал(а):Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и 256 байт ОЗУ.
Как адрес команды может сохраняться в разных регистрах ОЗУ? ведь к примеру в Tiny2313 ОЗУ состоит из 8-битных регистров, и если я правильно понимаю, адрес должен сохраняться целиком в одном регистре.
Почему тогда в Шпротеусе такой код прокатывал?
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Потму что шпрот это делал за Вас
Друг Кота
Аватара пользователя
Сообщения: 20140
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Vicont писал(а):Как адрес команды может сохраняться в разных регистрах ОЗУ?
Вот так. Он занимает 2 соседних байта, в которых младший и старший байты адресного слова.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

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

ploop писал(а):2 байта, кстати, независимо от размера ОЗУ.
Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Gudd-Head писал(а): Вот так. Он занимает 2 соседних байта...
Извиняюсь, я Вас не правильно понял, Вы говорили о байтах а я подумал, что о битах... :oops:
Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?

Но в статье пишут, применительно к AT90s2313:
В целях унификации кода для всех контроллеров, в 2313 у SPL оставили на конце букву L, хотя никакого SPH в данном контроллере нет и быть не может.
Получается, если старшего байта в нем вообще нет, то и потеряться ведь он не может... :roll:
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?
Я про указатель стека. У кого меньше 256 байт ОЗУ инициализируем только SPL, но SPH тоже есть, но всегда ноль,и на стек он попадает. А на стеке у нас адрес всегда двухбайтный.
Друг Кота
Аватара пользователя
Сообщения: 20140
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Vicont писал(а):Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?
Нет. Видимо, вы путаете указатель стека (1 или 2 8-ми битных регистра) и сам стек — пространство статического ОЗУ.
В ОЗУ сохраняются 2 байта счётчика команд (РС), содержимое указателя стека (SP) при этом уменьшается на 2.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Прорезались зубы
Аватара пользователя
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье

Сообщение Vicont »

Gudd-Head писал(а):Видимо, вы путаете указатель стека и сам стек...
Видимо... Потихоньку начинаю понимать.
Gudd-Head писал(а):Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
Разве AT90s2313 и ATTiny2313 нельзя отнести к их числу? В ведь по даташиту у них 128 байт SRAM + 32 РОН...
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»