Вопросы начинающих PIC ASM
- Реклама
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Кое-чего добился. Простите, но я снова без кода...
Есть в главном цикле часть кода, которая прекрасно работает и делает то, что мне нужно. Следом написал еще одну часть кода точно такую же, только переменная другая. Внутри используется команда сдвига вправо через перенос. Так вот, эта часть совсем не работает, в то время как аналогичная сверху прекрасно пашет.
Ставил индикаторные светодиоды "контрольки", проверил, что все приходит туда. Но сложилось впечатление, что переменная, которую отправляю в эту часть программы приходит нулевая, т.к. после ее сдвига ничего не появляется в флаге С и программа уходит на начало. (проверял тоже индиктором светодиодом, вставив в программе соответствующую строку).
Решил не отправлять через переменную, а жестко задать константу прямо в этой части программы (которая отказывается работать). Тот же результат. После команд сдвига флаг С получается все время пустой и результат работы выходит на новый круг (на начало)...
Что за ???
И еще не понравилось, когда напоролся на команду call. Она работает в ограниченном диапазоне адресов.
Простите за глупые вопросы, но я только изучаю их еще... потому и тупой.
Есть в главном цикле часть кода, которая прекрасно работает и делает то, что мне нужно. Следом написал еще одну часть кода точно такую же, только переменная другая. Внутри используется команда сдвига вправо через перенос. Так вот, эта часть совсем не работает, в то время как аналогичная сверху прекрасно пашет.
Ставил индикаторные светодиоды "контрольки", проверил, что все приходит туда. Но сложилось впечатление, что переменная, которую отправляю в эту часть программы приходит нулевая, т.к. после ее сдвига ничего не появляется в флаге С и программа уходит на начало. (проверял тоже индиктором светодиодом, вставив в программе соответствующую строку).
Решил не отправлять через переменную, а жестко задать константу прямо в этой части программы (которая отказывается работать). Тот же результат. После команд сдвига флаг С получается все время пустой и результат работы выходит на новый круг (на начало)...
Что за ???
И еще не понравилось, когда напоролся на команду call. Она работает в ограниченном диапазоне адресов.
Простите за глупые вопросы, но я только изучаю их еще... потому и тупой.
Станислав
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Может, любезный Станислав, Вы приведете ту часть кода, которая вызвала Ваши трудности.
Заодно и с CALL разберемся... Что то я не припомню, чтобы я сталкивался с ограничениями этой команды...
Что за контроллер у Вас нынче?
Заодно и с CALL разберемся... Что то я не припомню, чтобы я сталкивался с ограничениями этой команды...
Что за контроллер у Вас нынче?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы начинающих PIC ASM
Ну как же, стек то аппаратный, глубиной 8 адресов вроде. Только такой глубины ухода в подпрограммы более чем достаточно, как мне кажется.КРАМ писал(а):Что то я не припомню, чтобы я сталкивался с ограничениями этой команды...
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Приведу код завтра, т.к. приходится все делать у друга. У меня на компе не стоит программное обеспечение, да и программатора для ПИКов нету. Благодарю, что откликнулись.
А как же она на стек то??? У меня вызов подпрограммы, которая выбирает из таблицы значение цифры индиктора, т.е. сдвигается по ней и тут же выходит с занесением этого значения в аккумулятор. Разве можно этим стек переполнить?
Станислав
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Если честно, то я догадался, что речь шла о табличном чтении.
Но проблема тут совсем не в команде CALL. Эта команда исполняется во всем поле адресов, потому что она занимает 2 слова команды.
Проблема тут в том, что Вы не понимаете смысл вычисляемого перехода в 8 разрядной машине.
Команда addwf PCL, F прибавляет к счетчику команд значение аккумулятора. Но аккумулятор 8 разрядный, а счетчик команд в общем случае 21 разрядный. То есть прежде чем прибавлять к МЛАДШЕМУ байту программного счетчика (PCL) и тем самым вызывать немедленный переход по вычисленному адресу, следовало бы посчитать и старшие байты (в этом контроллере только один старший байт счетчика команд) и ПРЕДВАРИТЕЛЬНО его записать в защелку PCLATH. Тогда ОДНОВРЕМЕННО с записью в младший PCL будет перезаписан и старший байт из PCLATH в PCH.
Ну либо побеспокоиться о неизменности PCH.
И стек здесь совсем не причем. Ошибка в вычислении перехода приводит к непредсказуемому ходу исполнения флеша.
Но проблема тут совсем не в команде CALL. Эта команда исполняется во всем поле адресов, потому что она занимает 2 слова команды.
Проблема тут в том, что Вы не понимаете смысл вычисляемого перехода в 8 разрядной машине.
Команда addwf PCL, F прибавляет к счетчику команд значение аккумулятора. Но аккумулятор 8 разрядный, а счетчик команд в общем случае 21 разрядный. То есть прежде чем прибавлять к МЛАДШЕМУ байту программного счетчика (PCL) и тем самым вызывать немедленный переход по вычисленному адресу, следовало бы посчитать и старшие байты (в этом контроллере только один старший байт счетчика команд) и ПРЕДВАРИТЕЛЬНО его записать в защелку PCLATH. Тогда ОДНОВРЕМЕННО с записью в младший PCL будет перезаписан и старший байт из PCLATH в PCH.
Ну либо побеспокоиться о неизменности PCH.
И стек здесь совсем не причем. Ошибка в вычислении перехода приводит к непредсказуемому ходу исполнения флеша.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
А можно подробнее? как же я определю, что их пора считать уже?КРАМ писал(а):следовало бы посчитать и старшие байты
Станислав
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
В том виде, в котором Вы написали, и сама команда вызова и табличный переход обязаны уместиться в пределах ОДНОЙ СТРАНИЦЫ (256 байт). Не важно какой, нулевой или какой другой. Важно, что при таком вычислении старший байт меняться не имеет права.
А если Вы желаете их разместить В РАЗНЫХ страницах, но не пересекая границу страниц самим телом таблицы, то можно вместо
применить конструкцию:
Или вообще так, без вычислений, прямым присвоением:
А если Вы желаете их разместить В РАЗНЫХ страницах, но не пересекая границу страниц самим телом таблицы, то можно вместо
Код: Выделить всё
addwf PCL, FКод: Выделить всё
clrf PCLATH
incf PCLATH, F
addwf PCL, F
.........
.........Код: Выделить всё
clrf PCLATH
incf PCLATH, F
movwf PCL
............
............
org 0x100
retlw ...
retlw ...
Последний раз редактировалось КРАМ Вт май 03, 2016 08:56:16, всего редактировалось 3 раза.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
А если эту таблицу разместить сразу где-то после .org0? По сути она же не будет никуда улетать при увеличении кода. Значит ее адресация останется неизменной в пределах одной страницы.
Ткните носом еще, где можно доступно и просто почитать про организацию памяти ПИК.
Ткните носом еще, где можно доступно и просто почитать про организацию памяти ПИК.
Станислав
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
А зачем таблицу размещать сверху? Это же неудобно. Там вектор сброса и прерываний.
Наоборот, ее нужно засунуть куда нибудь в конец. По последнему варианту с прямым присвоением.
Тогда не нужно вообще думать о пересечении страниц, потому что сама таблица (retlw подряд) будет привязана метакомандами org.
Прочитать проще всего в даташите или в его переводе на http://www.microchip.ru/lit/?mid=1x0
Например: http://www.microchip.ru/files/d-sheets-rus/pic16_6.pdf
Наоборот, ее нужно засунуть куда нибудь в конец. По последнему варианту с прямым присвоением.
Тогда не нужно вообще думать о пересечении страниц, потому что сама таблица (retlw подряд) будет привязана метакомандами org.
Прочитать проще всего в даташите или в его переводе на http://www.microchip.ru/lit/?mid=1x0
Например: http://www.microchip.ru/files/d-sheets-rus/pic16_6.pdf
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Прошу прощения, но задам еще один глупый вопрос...
Можно ли как-то затереть стек? Ну или, если быть точнее, то выкинуть последней адрес, который в него положили и сдвинуть его.
Т.е. сделать вид, как будто мы не уходили по команде call?
З.Ы. не спрашивайте, зачем мне это надо...
Можно ли как-то затереть стек? Ну или, если быть точнее, то выкинуть последней адрес, который в него положили и сдвинуть его.
Т.е. сделать вид, как будто мы не уходили по команде call?
З.Ы. не спрашивайте, зачем мне это надо...
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы начинающих PIC ASM
Нет уж, расскажитеСКАЗОЧНИК писал(а):З.Ы. не спрашивайте, зачем мне это надо...
Стек и указатель стека куда-то зарыты в МК и программного доступа к ним нет.
Ну сделайте аналоги командам вызова и возврата из нескольких других.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
А в АВР же есть... Там сам указываешь вершину стека... Блин, жалко.Z_h_e писал(а):Стек и указатель стека куда-то зарыты в МК и программного доступа к ним нет.
Есть у меня друг, ему 42 года. Он меня подсадил на ПИК контроллеры, а так как сам он раньше не занимался программированием и микроконтроллерами, то жутко БЫДЛОКОДИТ.Z_h_e писал(а):Нет уж, расскажите
Я ему помогаю время от времени прерывание на них написать или опрос какой и т.д. Поэтому и сам в них начал понимать уже.
Он читает даташит и ничего не может вкурить. Поэтому звонит мне. Я к нему еду и сам читаю даташит и конфигурирую то, что надо. Также говорю как надо было сделать.
А он упертый.
И сделал вызов подпрограммы задержки, а в подпрограмме задержки сделал опрос кнопки и выход не по RET... , а goto куда ему надо.
Я сказал ему, что есть такое понятие, как стек, и что его будет сносить, а микроконтроллер виснуть. У него еще и прерывание есть в этой программе.
А он уперся, что все работает! И показывает мне эмуляцию в Протеусе. (Еще раз я убедился, что Протеус это тоже зло в руках дилетантов).
На что ему был дан совет собрать всю эту лабуду в железе, а потом застрелиться, но не звонить мне, что бы я приехал и помог разобраться.
З.Ы. Вопрос задал так, на всякий случай. Вдруг он меня все же достанет.
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Вопросы начинающих PIC ASM
Ну если он решил выпрыгивать из подпрограммы обычным переходом, то пускай в нее этим же методом и запрыгивает.
Очень даже может быть, что Протеус параллельно кучей ошибок плюется, он же ведет лог во время симуляции.все работает! И показывает мне эмуляцию в Протеусе
Последний раз редактировалось Z_h_e Сб май 07, 2016 20:21:41, всего редактировалось 1 раз.
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Вмешиваться в стек - худшее, что можно придумать. Кнопки в прерывании - не многим лучше.
Так зачем множить глупости?
Так зачем множить глупости?
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Вопросы начинающих PIC ASM
Не. это уже другая программа и другой МК.КРАМ писал(а):Кнопки в прерывании - не многим лучше.
Здесь в прерывании мы просто по таймеру TMR1 мигаем светодиодиком.
А так... многие на своих граблях учатся, даже если им и сказали истину, все равно ошибок нарисуют... Видимо натура такая.
Станислав
Re: Вопросы начинающих PIC ASM
Приветствую, такой вопросик, когда начинаете писать код на асме, начинаете с чистого файла или у вас уже есть какой-либо заготовленный шаблон, со всеми опциями и структурой файла(функциями) и вы лишь комментируете или убираете лишнее? Если есть такой шаблрн, поделитесь, а ... охота поглядеть, да себе для пользы сохранить 
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопросы начинающих PIC ASM
Шаблон конечно имеется.
Все зависит от наличия аналогичного проекта. Если ничего подобного еще не было, то просто повторяется типовая шапка.
Какой АСМ интересует? Есть MPASM для 8-разрядных ПИКов и ASM30 для 16-разрядных PIC24/dsPIC30/dsPIC33.
Все зависит от наличия аналогичного проекта. Если ничего подобного еще не было, то просто повторяется типовая шапка.
Какой АСМ интересует? Есть MPASM для 8-разрядных ПИКов и ASM30 для 16-разрядных PIC24/dsPIC30/dsPIC33.
Re: Вопросы начинающих PIC ASM
Интересует MPASM для 8-разрядных пиков, ибо я ни с чем, более pic16f... не работал(в принципе и их хвататет) да и работаю с ними не часто, а щаблона до сих пор никакого нет, думаю, наверняка у народа есть, дай спрошу 



