Кое-чего добился. Простите, но я снова без кода...
Есть в главном цикле часть кода, которая прекрасно работает и делает то, что мне нужно. Следом написал еще одну часть кода точно такую же, только переменная другая. Внутри используется команда сдвига вправо через перенос. Так вот, эта часть совсем не работает, в то время как аналогичная сверху прекрасно пашет.
Ставил индикаторные светодиоды "контрольки", проверил, что все приходит туда. Но сложилось впечатление, что переменная, которую отправляю в эту часть программы приходит нулевая, т.к. после ее сдвига ничего не появляется в флаге С и программа уходит на начало. (проверял тоже индиктором светодиодом, вставив в программе соответствующую строку). Решил не отправлять через переменную, а жестко задать константу прямо в этой части программы (которая отказывается работать). Тот же результат. После команд сдвига флаг С получается все время пустой и результат работы выходит на новый круг (на начало)...
Что за ???
И еще не понравилось, когда напоролся на команду call. Она работает в ограниченном диапазоне адресов.
Простите за глупые вопросы, но я только изучаю их еще... потому и тупой.
Может, любезный Станислав, Вы приведете ту часть кода, которая вызвала Ваши трудности. Заодно и с CALL разберемся... Что то я не припомню, чтобы я сталкивался с ограничениями этой команды... Что за контроллер у Вас нынче?
Приведу код завтра, т.к. приходится все делать у друга. У меня на компе не стоит программное обеспечение, да и программатора для ПИКов нету. Благодарю, что откликнулись.
А как же она на стек то??? У меня вызов подпрограммы, которая выбирает из таблицы значение цифры индиктора, т.е. сдвигается по ней и тут же выходит с занесением этого значения в аккумулятор. Разве можно этим стек переполнить?
Если честно, то я догадался, что речь шла о табличном чтении. Но проблема тут совсем не в команде CALL. Эта команда исполняется во всем поле адресов, потому что она занимает 2 слова команды. Проблема тут в том, что Вы не понимаете смысл вычисляемого перехода в 8 разрядной машине. Команда addwf PCL, F прибавляет к счетчику команд значение аккумулятора. Но аккумулятор 8 разрядный, а счетчик команд в общем случае 21 разрядный. То есть прежде чем прибавлять к МЛАДШЕМУ байту программного счетчика (PCL) и тем самым вызывать немедленный переход по вычисленному адресу, следовало бы посчитать и старшие байты (в этом контроллере только один старший байт счетчика команд) и ПРЕДВАРИТЕЛЬНО его записать в защелку PCLATH. Тогда ОДНОВРЕМЕННО с записью в младший PCL будет перезаписан и старший байт из PCLATH в PCH. Ну либо побеспокоиться о неизменности PCH. И стек здесь совсем не причем. Ошибка в вычислении перехода приводит к непредсказуемому ходу исполнения флеша.
В том виде, в котором Вы написали, и сама команда вызова и табличный переход обязаны уместиться в пределах ОДНОЙ СТРАНИЦЫ (256 байт). Не важно какой, нулевой или какой другой. Важно, что при таком вычислении старший байт меняться не имеет права. А если Вы желаете их разместить В РАЗНЫХ страницах, но не пересекая границу страниц самим телом таблицы, то можно вместо
Код:
addwf PCL, F
применить конструкцию:
Код:
clrf PCLATH incf PCLATH, F addwf PCL, F ......... .........
Или вообще так, без вычислений, прямым присвоением:
А если эту таблицу разместить сразу где-то после .org0? По сути она же не будет никуда улетать при увеличении кода. Значит ее адресация останется неизменной в пределах одной страницы. Ткните носом еще, где можно доступно и просто почитать про организацию памяти ПИК.
А зачем таблицу размещать сверху? Это же неудобно. Там вектор сброса и прерываний. Наоборот, ее нужно засунуть куда нибудь в конец. По последнему варианту с прямым присвоением. Тогда не нужно вообще думать о пересечении страниц, потому что сама таблица (retlw подряд) будет привязана метакомандами org. Прочитать проще всего в даташите или в его переводе на http://www.microchip.ru/lit/?mid=1x0 Например: http://www.microchip.ru/files/d-sheets-rus/pic16_6.pdf
Стек и указатель стека куда-то зарыты в МК и программного доступа к ним нет.
А в АВР же есть... Там сам указываешь вершину стека... Блин, жалко.
Z_h_e писал(а):
Нет уж, расскажите
Есть у меня друг, ему 42 года. Он меня подсадил на ПИК контроллеры, а так как сам он раньше не занимался программированием и микроконтроллерами, то жутко БЫДЛОКОДИТ. Я ему помогаю время от времени прерывание на них написать или опрос какой и т.д. Поэтому и сам в них начал понимать уже. Он читает даташит и ничего не может вкурить. Поэтому звонит мне. Я к нему еду и сам читаю даташит и конфигурирую то, что надо. Также говорю как надо было сделать. А он упертый. И сделал вызов подпрограммы задержки, а в подпрограмме задержки сделал опрос кнопки и выход не по RET... , а goto куда ему надо. Я сказал ему, что есть такое понятие, как стек, и что его будет сносить, а микроконтроллер виснуть. У него еще и прерывание есть в этой программе. А он уперся, что все работает! И показывает мне эмуляцию в Протеусе. (Еще раз я убедился, что Протеус это тоже зло в руках дилетантов). На что ему был дан совет собрать всю эту лабуду в железе, а потом застрелиться, но не звонить мне, что бы я приехал и помог разобраться.
З.Ы. Вопрос задал так, на всякий случай. Вдруг он меня все же достанет.
Приветствую, такой вопросик, когда начинаете писать код на асме, начинаете с чистого файла или у вас уже есть какой-либо заготовленный шаблон, со всеми опциями и структурой файла(функциями) и вы лишь комментируете или убираете лишнее? Если есть такой шаблрн, поделитесь, а ... охота поглядеть, да себе для пользы сохранить
Шаблон конечно имеется. Все зависит от наличия аналогичного проекта. Если ничего подобного еще не было, то просто повторяется типовая шапка. Какой АСМ интересует? Есть MPASM для 8-разрядных ПИКов и ASM30 для 16-разрядных PIC24/dsPIC30/dsPIC33.
Интересует MPASM для 8-разрядных пиков, ибо я ни с чем, более pic16f... не работал(в принципе и их хвататет) да и работаю с ними не часто, а щаблона до сих пор никакого нет, думаю, наверняка у народа есть, дай спрошу
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения