Мелкие вопросы по МК и ПЛИС.
Возможно элементы схемы просаживают сигналы программатора. Ведь мк у вас впаян, а схемы мы не видим. Выпаяйте и попробуйте.
Docendo discimus
- Реклама
Я осваиваю 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 раз.
В нём всё дело.Vicont писал(а):виртуальный контроллер
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ясно, попробую в дальнейшем на реальном МК этот код испытать.
И еще: что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?
И еще: что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?
Да.Vicont писал(а):что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
В таком случае, если в дальнейшем вообще не предполагается работа с ОЗУ, на стеки можно вообще забить со спокойной совестью или все же лучше перестраховаться ?
Если не будут использоваться подпрограммы, тогда да. Если будут - то будет использоваться ОЗУ, и стек нужен.
Я имею в виду, что подпрограммы использоваться то будут, но они не будут работать с ОЗУ в полном смысле этого слова (из всей ОЗУ будет использоваться лишь 1 регистр для хранения адреса основной программы, на котором началась подпрограмма).
Ведь если не инициализировать стек, то адрес команды должен прописаться в ОЗУ по дефолту и должен там храниться до тех пор пока не начнется вторая подпрограмма... (конечно, в том случае, если одна ПОДпрограмма не вложена в другую ПОДпрограмму)
По крайней мере, когда я испытывал в Шпротеусе, подпрограммы работали и без указания стека. Можно ли так делать в реале?
Ведь если не инициализировать стек, то адрес команды должен прописаться в ОЗУ по дефолту и должен там храниться до тех пор пока не начнется вторая подпрограмма... (конечно, в том случае, если одна ПОДпрограмма не вложена в другую ПОДпрограмму)
По крайней мере, когда я испытывал в Шпротеусе, подпрограммы работали и без указания стека. Можно ли так делать в реале?
Последний раз редактировалось Vicont Чт сен 06, 2012 12:11:18, всего редактировалось 1 раз.
Нет. При вызывании подпрограмм нужно инициализировать стек.Vicont писал(а):Можно ли так делать в реале?
В противном случае вы рискуете вернуться из подпрограммы совсем не в то место.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Хорошо. Делать подпрограммы без стека больше не буду.
Но все равно не могу понять куда денется тот адрес команды???
На ум приходят 3 варианта ответа:
1. Он может прописаться по дефолту в тот регистр ОЗУ, где программа его не сможет найти.
2. Он может вообще не прописаться в ОЗУ.
3. Он пропишется в регистр ОЗУ по дефолту, но сотрется по какой-то непредвиденной причине, команда его сможет найти, но в нем будет уже совсем не тот адрес.
Но все равно не могу понять куда денется тот адрес команды???
На ум приходят 3 варианта ответа:
1. Он может прописаться по дефолту в тот регистр ОЗУ, где программа его не сможет найти.
2. Он может вообще не прописаться в ОЗУ.
3. Он пропишется в регистр ОЗУ по дефолту, но сотрется по какой-то непредвиденной причине, команда его сможет найти, но в нем будет уже совсем не тот адрес.
Последний раз редактировалось Vicont Чт сен 06, 2012 12:37:11, всего редактировалось 2 раза.
Применительно к АВР...
Почти у всех АВРок по умолчанию указатель стека (SP) после ресета равен 0000.
Как известно, при вызове подпрограммы содержимое счётчика команд (РС) — адрес того места, из которого вызвана команда — 2 байта, сохраняется в стеке (на самом деле, РС+1 — адрес след. команды), следовательно получается SP = SP - 2.
Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
Почти у всех АВРок по умолчанию указатель стека (SP) после ресета равен 0000.
Как известно, при вызове подпрограммы содержимое счётчика команд (РС) — адрес того места, из которого вызвана команда — 2 байта, сохраняется в стеке (на самом деле, РС+1 — адрес след. команды), следовательно получается SP = SP - 2.
Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Как адрес команды может сохраняться в разных регистрах ОЗУ? ведь к примеру в Tiny2313 ОЗУ состоит из 8-битных регистров, и если я правильно понимаю, адрес должен сохраняться целиком в одном регистре.Gudd-Head писал(а):Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и 256 байт ОЗУ.
Почему тогда в Шпротеусе такой код прокатывал?
Вот так. Он занимает 2 соседних байта, в которых младший и старший байты адресного слова.Vicont писал(а):Как адрес команды может сохраняться в разных регистрах ОЗУ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
2 байта, кстати, независимо от размера ОЗУ. Если адрес однобайтовый, там старший просто равен нулю.
Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?ploop писал(а):2 байта, кстати, независимо от размера ОЗУ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Извиняюсь, я Вас не правильно понял, Вы говорили о байтах а я подумал, что о битах...Gudd-Head писал(а): Вот так. Он занимает 2 соседних байта...
Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?
Но в статье пишут, применительно к AT90s2313:
Получается, если старшего байта в нем вообще нет, то и потеряться ведь он не может...В целях унификации кода для всех контроллеров, в 2313 у SPL оставили на конце букву L, хотя никакого SPH в данном контроллере нет и быть не может.
Я про указатель стека. У кого меньше 256 байт ОЗУ инициализируем только SPL, но SPH тоже есть, но всегда ноль,и на стек он попадает. А на стеке у нас адрес всегда двухбайтный.Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?
Нет. Видимо, вы путаете указатель стека (1 или 2 8-ми битных регистра) и сам стек — пространство статического ОЗУ.Vicont писал(а):Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?
В ОЗУ сохраняются 2 байта счётчика команд (РС), содержимое указателя стека (SP) при этом уменьшается на 2.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Видимо... Потихоньку начинаю понимать.Gudd-Head писал(а):Видимо, вы путаете указатель стека и сам стек...
Разве AT90s2313 и ATTiny2313 нельзя отнести к их числу? В ведь по даташиту у них 128 байт SRAM + 32 РОН...Gudd-Head писал(а):Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).


