Страница 19 из 400
Добавлено: Пн сен 21, 2009 16:01:49
GP1
организуй регист в котором на каждом шаге перемещай 1 по разрядам, затем с помощью лог. операци меняеш соответствующий разряд в регистре флагов.
Добавлено: Пн сен 21, 2009 16:40:57
Meteor
GP1 писал(а):организуй регист ... на каждом шаге перемещай 1 по разрядам, затем ...меняеш соответствующий разряд в регистре флагов.
Ну может и так.
Спасибо

Добавлено: Пн сен 21, 2009 16:43:13
GP1
найдеш решение лучше - поделись

Добавлено: Пн сен 21, 2009 16:50:40
Meteor
GP1 писал(а):найдеш решение лучше - поделись

Найду - поделюсь. Не найду буду пользовать твое:)
Добавлено: Пт окт 02, 2009 20:00:19
dymon
Как в ассемблерный код внедрить сишный код? Причем сишный код находится в другом файле. То что будет использоваться директива ".include" это понятно. AVRStudio вставит куда надо сишный код, но не понимает, что это язык Си и ругается мол "не знаю такую команду".
Добавлено: Пт окт 02, 2009 20:24:58
SII
Их надо транслировать независимо (ассемблерный -- транслятором ассемблера, сишный -- транслятором Си), а потом собирать в единый выполняемый модуль компоновщиком. Детали не подскажу -- самому на AVR делать не приходилось.
Добавлено: Пт окт 02, 2009 21:38:10
dymon
Было бы хорошо узнать подробности)
Добавлено: Пт окт 02, 2009 21:49:05
Yellow Tiger
dymon писал(а):Как в ассемблерный код внедрить сишный код? ... То что будет использоваться директива ".include" это понятно.
Интересная техника и, судя по всему, совершенно недокументированная - где почитать об ассемблерах, компилирующих Си?
Добавлено: Сб окт 03, 2009 00:36:57
SII
dymon писал(а):Было бы хорошо узнать подробности)
Читайте документацию, пробуйте... Проблема в том, что метода программирования, принятая на ПК, многих, так сказать, развратила. Например, любая интегрированная среда (Visual Studio, Delphi) позволяет ввести исходный текст программы на соответствующем языке (каком -- неважно) и получить на выходе готовый исполняемый файл (exe в случае Винды), при этом программисту не приходится задумываться, а как же этот файл был получен -- и многие в результате понятия не имеют, что же там происходит. Ну а на самом деле процесс, если не углубляться в детали, таков:
1) Создаются файлы с исходными текстами программы. В простом проекте, написанном на одном языке, файл обычно всего один, но в сложных их могут быть тысячи и больше, причём на разных языках.
2) Каждый файл с исходным текстом транслируется с помощью соответствующего транслятора (Си, ассемблер, Паскаль -- в принципе, неважно). На выходе, если трансляция прошла успешно (не обнаружено ошибок), получаются так называемые объектные файлы -- т.е. машинный код программы, но ещё не готовый для немедленного исполнения.
3) С помощью компоновщика (редактора связей; по-буржуйски linkage editor или linker, почему на жаргоне его часто линкером кличут) все объектные файлы объединяются в один исполняемый файл.
Для того, чтобы компоновщик мог связать разные модули, необходимо объявления переменных и подпрограмм, которые должны быть видны не только в том модуле, где они объявлены, обозначить как глобальные или публичные (в разных языках разные средства для этого; на ассемблере обычно директива PUBLIC, GLOBAL или что-то в этом роде), ну а в тех модулях, где эти переменные и подпрограммы используются, но где они не объявлены, нужно указать имена этих переменных и подпрограмм в директиве EXTERN или подобной ей. Но как точно это делается применительно к AVR, я не знаю, поскольку никогда использовать эту возможность не приходилось (пишу исключительно на ассемблере, ну а скромные возможности этих однокристаллок не позволяют реализовать на них что-нибудь настолько крутое, что потребовало бы разделения программы на множество модулей).
Добавлено: Пт окт 16, 2009 12:09:32
AndyWorld
Добрый день! Такой вопрос: При вызове подпрограммы или при прерывании адрес того места где программа находилась помещается в стек. Мне нужно до момента выхода из подрограммы или прерывания поместить в стек еще 2 значения и извлечь их после выхода. Не помешает ли это возврату? Или после команды ret или reti из стека выхватится последнее значение?
Добавлено: Пт окт 16, 2009 12:19:03
GP1
очень часто при входе в ПП или прерывание приходится сохранять значения регистров для этого есть спец команды:
PUSH - сохранить в стеке, которая
ОБЯЗАТЕЛЬНО должна иметь комплементарную команду
POP - извлечь из стека перед выходом.
и стек будет в порядке
Просю пардону, не понял вопроса
можно сделать так:
Код: Выделить всё
pop temp0 ; извлекаем адрес возврата
pop temp1 ; если адрес возврата 2х байтовый
push x ; загружаем в стек данные
push y
push temp1 ; восстанавливаем адрес возврата
push temp0
ret (reti)
.
.
.
; после выхода указатель стека на Y
pop y
pop x
.
вроде так

Добавлено: Пт окт 16, 2009 12:38:25
AndyWorld
Хммм. Так это понятно... Фишка в том, что я нахожусь в неком цикле в котором возникает прерывание таймера0, в нем же нюхаю кнопку по котрой я смогу вырваться из цикла и еще две кнопки которые задают значение таймеру (+,-). Так вот в какой момент сработает прерывание я не знаю. Поэтому и заморочился со стеком..))
Добавлено: Пт окт 16, 2009 12:43:33
GP1
методика решения мне не нравится ИМХО
я обычно в прерывании читаю PINx в какую-нибудь переменную, а уж в основной программе анализирую ее.
да и предложенный мной выше метод можно использовать только в ПП, т.е. где заранее известна точка входа и выхода.
Добавлено: Пт окт 16, 2009 12:50:06
AndyWorld
Да вот и я тоже думаю, что алгоритм у меня кривоват. Надо по другому все сделать.
Есть еще вопрос. У меня МЕга 16 и я использую rjmp и rcall. Все пока работает, видимо потому то я еще больше 8К программу не написал. Когда я перешагну этот предел придется переписывать на jmp и call?
Не пойму как происходит трансляция адресов при таком ветвлении.
Добавлено: Пт окт 16, 2009 12:59:48
GP1
насчет call и jmp ты прав.
в командах rcall, rjmp прописывается 12 битный код смещения относительно РС, поэтому позволяют переходить на +-2048 адресов относительно текущего значения PC
а в командах call, jmp прописывается адрес вызова/перехода, т.е. тупо в PC грузится новый адрес и в путь.
Добавлено: Пт окт 16, 2009 13:14:26
AndyWorld
Мне нужно вывести на ЖК побитно содержимое порта или ячейки памяти. Как это сделать? Я имею ввиду считать каждый бит по отдельности. Для ЖК ясно, что к каждому биту я прибавлю $30 - и в путь.
Добавлено: Пт окт 16, 2009 13:17:17
GP1
воспользуйся командами сдига через бит-СY
если CY=1 посылаеш на лсд 0х31, в противном случае 0х30
Добавлено: Пт окт 16, 2009 13:30:46
AndyWorld
Я так понимаю, не важно в какую сторону мне двигать. Флаг переноса установится в любом направлении
Добавлено: Пт окт 16, 2009 13:36:40
GP1
lsr - двигает вправо
lsl - влево
какой выбереш, без разницы, главное обеспечить, чтобы на лсд ст.разряд был слева, а мл.разряд справа.
а то потом запутаешся
зы: но я бы двигал влево...
Добавлено: Пт окт 16, 2009 13:45:20
AndyWorld
Я так понимаю, не важно в какую сторону мне двигать. Флаг переноса установится в любом направлении