Очень нуждаюсь в алгоритме рисовании линии на ассемблере.
Интересно, конечно, где вы её (линию) будете рисовать — на бумаге? А так — формула линии из алгебры 5-го класса: y = k*x + b, т.е. реализовать на АСМе умножение и сложение, потом подставлять вместо х нужный диапазон точек.
Нее, на бумаге не рисую
я уже писал про алгебру.... повторю еще раз - этот способ меня не устраивает...
сейчас практически додумал итерационный метод... но он работает не всегда.. возможно я чтото не додумал...
кто то еще решал подобную задачу ?
мой метод: поскольку описывать долго, опишу на примере предположим нужно построить линию из 0, 0 в координаты 8, 5 сначала заполняем матрицу смещений, Для этого делим большее смещение конечной точки на меньшее последовательно до получения остатка от деления равного нулю 8 \ 5 = 1 остаток 3 - теперь используем остаток от деления =3 для нового деления 8 \ 3 = 2 остаток 2 - теперь используем остаток от деления =2 для нового деления 8 \ 2 = 4 остаток 0 - остаток 0, заполнение матрицы смещений закончено
соответственно нам нужно смещаться: на 1 точку каждый шаг, на 2 точки каждый второй шаг, и на 3 точки каждый четвертый шаг...
Построим линию: _12345 - по горизонтали (1..5) шкала шага, а по вертикали (1..8 ) - шкала смещений 1+ 2_+ 3_+ 4__+ 5___+ 6___+ 7___+ 8____+
вот где то так... но я находил некоторые примеры где этот код дает некрасивую линию ((
Может быть ктото сталкивался с другими алгоритмами ? (не алгебраическими)
p.s. а вы говорите формула по алгебре... !!!
кстати, мой кот постоянно почему то ложиться на полу на что нить... то на коврик, то на пакет, то на бумагу.. - это у него прикол такой или они все так делают ? чем ему лежать непосредственно на полу (ламинат, кафельная плитка) не нравиться?!
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт июл 05, 2011 07:27:54
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
ВитГо писал(а):
Очень нуждаюсь в алгоритме рисовании линии на ассемблере..
погуглите "алгоритм брезенхема" - реализуется только при помощи целочисленного сложения и вычитания (т.е. умножения-деления не требуется), на ассемблере - без проблем, если сумеете АЛГОРИТМ на нем изложить. для рисования линий и предназначен.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Очень нуждаюсь в алгоритме рисовании линии на ассемблере..
погуглите "алгоритм брезенхема" - реализуется только при помощи целочисленного сложения и вычитания (т.е. умножения-деления не требуется), на ассемблере - без проблем, если сумеете АЛГОРИТМ на нем изложить. для рисования линий и предназначен.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт июл 05, 2011 08:54:43
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19760 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Мастер Ломастер писал(а):
погуглите "алгоритм брезенхема"
Вот это круть
ВитГо писал(а):
кстати, мой кот постоянно почему то ложиться на полу на что нить... то на коврик, то на пакет, то на бумагу.. - это у него прикол такой или они все так делают ? чем ему лежать непосредственно на полу (ламинат, кафельная плитка) не нравиться?!
Все они так делают... так теплее. Мой, правда, пакетик рвёт на мелкие части... а вот на бумаге очень любит лежать.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
; обмен значений dx и dy в зависимости от углового коэффициента наклона отрезка CP temp5 , temp4 ; dy>dx BRLO LCD_LINE_CHANGE_0 ; обмен значений PUSH temp5 PUSH temp4 POP temp5 POP temp4 LDI temp2 , 1 ; Обмен=1 RJMP LCD_LINE_CHANGE_READY LCD_LINE_CHANGE_0: ; нет обмена LDI temp2 , 0 ; Обмен=0 LCD_LINE_CHANGE_READY: ; обмен значений dx и dy осуществлен
MOV temp3 , temp5 ; e = dy ADD temp3 , temp5 ; e = 2*dy SUB temp3 , temp4 ; e = 2*dy - dx
MOV ZL , temp4 ; ПЕРЕМЕННАЯ ЦИКЛА LCD_LINE_LOOP: ; цикл
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июл 06, 2011 08:57:39
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19760 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
ВитГо писал(а):
Ну если вдруг кому понадобится... Алгоритм рисования линии Брезенхейма
Блин, нифига себе... и это чтобы нарисовать одну единственную линию???
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
эта процедура "весит" 155 байт... о каком СИ вы говорите ?! там одна библиотека умножения деления дробных чисел будет весить за килобайт...!!!
гм.. если я скажу что уже написал кода на 8 кб и еще около 6 кб строки и настройки - то я по вашему буду вообще извращенцем чтоли ? ))
Если честно я не вижу сейчас ничего сложного чтобы переходить на Си.. даже наоборот... после написания десятка-полутора вспомогательных процедур код такой же простой как написанный на Си... но намного меньше...
эта процедура "весит" 155 байт... о каком СИ вы говорите ?! там одна библиотека умножения деления дробных чисел будет весить за килобайт...!!!
не будет: для брезенхема дробные числа не нужны. и брезенхем у меня отлично влезал в тини13 вместе со всякими вспомогательными штуками - на чистом Си а вот вы на ассемблере попробуйте умножать-делить числа с плавающей точкой
ВитГо писал(а):
гм.. если я скажу что уже написал кода на 8 кб и еще около 6 кб строки и настройки - то я по вашему буду вообще извращенцем чтоли ? ))
в свое время я и поболее писал все ништяк
ВитГо писал(а):
Если честно я не вижу сейчас ничего сложного чтобы переходить на Си..
дык вроде и не в ваш адрес было мое замечение
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Здравствуйте, хелп ми Начал изучать асм. Простейшая программа переключения светодиодов. ATMega16 на макетке, пишу в AvrStudio 4.18. Восемь светодиодов подключены к порту В, катодом на землю. Зажигать отдельные светодиоды получается. Решил попробывать с задержкой, причем с самой простейшей с условным переходом по флагу Z. При выполнении программы по первому примеру остаются включенными 4 старших светодиода. Т.е. МК выполнил программу и остановился. Вечного цикла нет.
Код:
.include "m16def.inc" ; Используем ATMega16
.def temp=R16 ; регистр для настроек .def rab=R17 ; регистр для вывода в порт
ldi temp, low(RAMEND) ; инициализация стека out SPL, temp ldi temp, high(RAMEND) out SPH, temp
ldi temp, 0xFF ; порт В на выход out DDRB, temp ldi rab, 0b00001111 out PortB, rab ;зажигаем 4 младших светика
ldi rab, 0b11110000 out PortB, rab ;зажигаем 4 старших светика
Далее вставляю в код задержку на переключение на старшие разряды, компилирую, прошиваю МК. Выполняется, сначала горят младшие, НО после задержки на мгновение вспыхивают светодиоды на старших светодиодах (на мгновение потому что нет еще одной задержки). Т.е. получается, что при использовании переходов программа компилируется таким образом, что она болтается в цикле? Я же не указал явно переход на начало программы. Мне казалось что, сначала должны гореть младшие светодиоды, через некоторые время старшие (и далее постоянно они). Без переключений. Разъясните плиз, где не догоняю-)))
Код:
.include "m16def.inc" ; Используем ATMega16
.def temp=R16 ; регистр для настроек .def rab=R17 ; регистр для вывода в порт .def razr0=R18 ;регистры для организации задержки .def razr1=R19 .def razr2=R20
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июл 06, 2011 13:16:33
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19760 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
sergy1976 писал(а):
При выполнении программы по первому примеру остаются включенными 4 старших светодиода. Т.е. МК выполнил программу и остановился. Вечного цикла нет.
А вот и не остановился. 4 младших светодиода вспыхивают на 2 такта, но вы этого не замечаете, программа выполняется в месте с тем кодом, что после вашего (если МК был стёрт, то там NOPы).
sergy1976 писал(а):
Выполняется, сначала горят младшие, НО после задержки на мгновение вспыхивают светодиоды на старших разрядах
Время вспыха как раз и есть время выполнения ~ 8 тысяч NOPов, при тактовой 1 МГц — 8 мс.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
значит не остановился? т.е. пробежал по NOPам и снова ушел на начало программы? Ведь зацикливания нет. Это основной вопрос сейчас у меня. Про два такта понял, это выполнение команд LDI и OUT
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июл 06, 2011 13:32:27
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19760 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
sergy1976 писал(а):
значит не остановился? т.е. пробежал по NOPам и снова ушел на начало программы? Ведь зацикливания нет. Это основной вопрос сейчас у меня.
Да, пробежал и пошёл заново. МК застопорится если написать rjmp PC (что аналогично строке Label: rjmp Label), где РС — счётчик команд (program counter).
sergy1976 писал(а):
Про два такта понял, это выполнение команд LDI и OUT
Да.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
добрый день, знатоки я новичок, и по немногу учу ассемблер в надежде что когда-либо и я смогу черконуть примитивную прогу для атмеги....... на данный момент мне непонятен смысл следующих команд: .CSEG и .ORG address может кто из вас в силах обяснить по доходчивей....?
.CSEG говорит компилятору, что далее идёт сегмент кода (что всё, что ниже, ему во флешь записать надо), а .ORG address - с какого адреса (например .ORG 0 - значит "пиши сначала")
.CSEG говорит компилятору, что все нижеследующие данные должны быть расположены во FLASH, т.е. открывается секция, собственно, самого кода. .DSEG указывает, что нижеследующие данные должны быть расположены в ОЗУ. Писать туда какие либо константы, естественно, нельзя. Это можно только во время выполнения. Но тут можно зарезервировать места для переменных или каких либо данных. .EESEG указывает, что нижеследующие данные должны быть располагаться в EEPROM. .ORG устанавливает адрес, откуда будут писаться нижеследующие данные или код. Применимо во всех секциях. Следует учитывать, что в FLASH адресация идут по словам (по 2 байта). В ОЗУ и EEPROM, как обычно, по байтам.
Ну вот, опередили. Короче, читай документацию по макроассемблеру AVR.
понял, пока буду переваривать а может кто из знатоков знает толково-просто-понимающийся интернет ресурс по данной тематике или книжку.....? буду весьма признателен....
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт июл 14, 2011 22:30:33
Потрогал лапой паяльник
Зарегистрирован: Пн мар 16, 2009 23:35:42 Сообщений: 383 Откуда: Украина Новоднестровск
Рейтинг сообщения:0
FreshMan писал(а):
понял, пока буду переваривать а может кто из знатоков знает толково-просто-понимающийся интернет ресурс по данной тематике или книжку.....? буду весьма признателен....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 249
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения