реклама на сайте
подробности

 
 
> надо в ассемблере в таблице организовать базу данных
Yuriy_AVR
сообщение Sep 20 2007, 07:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Всем Привет !
Есть малюсенькая задачка - Прикрепленный файл  _____________________.doc ( 20.5 килобайт ) Кол-во скачиваний: 267
надо в ассемблере в таблице организовать базу данных для сегментовПрикрепленный файл  _____________________.doc ( 20.5 килобайт ) Кол-во скачиваний: 267
в виде , показанном в приложении.
Суть проблемы - каждая цифра должна быть записана в ассемблере на своей строчке ( иначе получается очень длинная запись , и не видна по ширине экрана . Но при записи .db надо сразу записывать 2 байта ( через запятую ) . Теоретически после записи первого байта можно поставить \n
и перейти на следующую строку и всё должно быть хорошо , но ассемблер ругается :

error: syntax error, unexpected '('

с уазанием на ошибку во втором байте ( почему не отрабатывает \n ? или я чтото не так делаю ?

Если кто знает как решить проблему , помогите плиз . 07.gif
Прикрепленный файл  _____________________.doc ( 20.5 килобайт ) Кол-во скачиваний: 267
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Sep 20 2007, 08:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А почему обязательно в ассемблере?
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 20 2007, 08:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(SasaVitebsk @ Sep 20 2007, 12:08) *
А почему обязательно в ассемблере?


Программа на писана на ассме .
Тем более что мне ассм больше нравится - каждому своё .
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 20 2007, 10:01
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Yuriy_AVR @ Sep 20 2007, 07:29) *
Программа написана на ассме

Или так
Код
.DB (On<<D7)+(On<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);0
.DB (Of<<D7)+(Of<<D6)+(Of<<D5)+(Of<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);1
.DB (On<<D7)+(On<<D6)+(Of<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(Of<<D1)+(Of<<D0);2
. . . . .
.DB (On<<D7)+(Of<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(On<<D1)+(Of<<D0);9


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 20 2007, 11:10
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(=GM= @ Sep 20 2007, 14:01) *
Или так
Код
.DB (On<<D7)+(On<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);0
.DB (Of<<D7)+(Of<<D6)+(Of<<D5)+(Of<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);1
.DB (On<<D7)+(On<<D6)+(Of<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(Of<<D1)+(Of<<D0);2
. . . . .
.DB (On<<D7)+(Of<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(On<<D1)+(Of<<D0);9


Да понятно что так можно сделать , но при таком подходе памяти для таблицы будет ровно в 2 раза больше расходоваться . . .

Цитата(Wild007 @ Sep 20 2007, 14:00) *
Для большей читабельности програим надо вводить дополнительные переменные с помощью .equ, например:
Код
.equ S1 = (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)

.equ S2 = (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)


а в .db уже использовать их названия, например:
Код
.DB S1,S2,.........


Сочетание '\n' компилятор воспринимает не как перевод строки, а присваивает ему значение Newline (ASCII LF 0x0a) (см. хелп по Студии).

Да наверное это выход . . .
Странно как я ненодумался до такого простого переопределения . Большое спасибо
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 20 2007, 16:13
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Yuriy_AVR @ Sep 20 2007, 10:10) *
Да понятно что так можно сделать , но при таком подходе памяти для таблицы будет ровно в 2 раза больше расходоваться . . .

Да? Это почему же?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 20 2007, 17:18
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(=GM= @ Sep 20 2007, 20:13) *
Да? Это почему же?

Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чёное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую .
Так что итоговый обьём будет равен обьём таблицы х2 .
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Sep 21 2007, 08:17
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Yuriy_AVR @ Sep 20 2007, 21:18) *
Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чёное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую .
Так что итоговый обьём будет равен обьём таблицы х2 .


07.gif Это всё Вы проверяли, или И ТАК знаете?

Прикрепленное изображение

чтение IDent32:
ldi Yh,high(IDent32)
ldi Yl,low(IDent32)
shl Yl
ror Yh

cyc: lmp r16,Y+
st X+,r16
CPI16 X,C_MsgTable
brlo cyc

(где CPI16 16-разрядное сравнение.)

Объясните, почему у меня это работает?

Сообщение отредактировал Maik-vs - Sep 21 2007, 08:27
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 21 2007, 09:58
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(Maik-vs @ Sep 21 2007, 12:17) *
07.gif Это всё Вы проверяли, или И ТАК знаете?

Прикрепленное изображение

чтение IDent32:
ldi Yh,high(IDent32)
ldi Yl,low(IDent32)
shl Yl
ror Yh

cyc: lmp r16,Y+
st X+,r16
CPI16 X,C_MsgTable
brlo cyc

(где CPI16 16-разрядное сравнение.)

Объясните, почему у меня это работает?


Так а что здесь может неработать ? Разве что lmp r16,Y+ нет такой команды у AVRов . Выборка из памяти программ производится только через регистровую пару Z ( см. описание системы команд ).
Всё в рамках того , что я и писал .
shl Yl я так понимаю описка , должно быть по идее lsl . Гораздо проще записать так
ldi Yh,high(IDent32 х2)
ldi Yl,low(IDent32 х2)
и нет необходимости в лишних 2 строчках ( lsl Yl и ror Yh )
Так и что вы делаете ? Вы загружаете указатель чётным значением адреса на базу данных , а затем просто инкрементируете указатель , и естественно он будет последовательно выбирать из таблицы правильные значения ( как чётные так и нечётные ) . Но речь то о другом - у вас есть указатель на базу данных и вам необходимо выбрать произвольное значение по этой базе данных ( т.е смещение от начала базы данных ). Ну и как вы будете делать ? например так ? :

ldi Yh,high(IDent32)
ldi Yl,low(IDent32)
shl Yl
ror Yh
add Yl,temp1
clr temp1
adc yh,temp1
lpm temp1,Y
где temp1 - произвольное смещение по таблице
И по вашему вы будете правильно получать значения из базы данных ? Тогда попробуйте , убедитесь в своей неправоте .






Цитата(Wild007 @ Sep 21 2007, 12:36) *
Ну тогда напишите в программе
Код
.DB 0
.DB 4

и потом покажите варнинги компилятора и таблицу smile.gif smile.gif smile.gif

А в вашей программе проще и нагляднее написать
Код
.DB "Тестовая болванка"

Простите , непонял . . .

Цитата(Maik-vs @ Sep 21 2007, 13:22) *
Да! так ставит только по чётным адресам. А DB 0,1 DB2,3 писать не судьба?
А вот это у меня раньше почему-то не работало smile.gif


DB 0,1 DB2,3 писать не судьба?
Это как это ? Извените , сразу немогу ощутить глубину мысли . . .

Цитата(Yuriy_AVR @ Sep 21 2007, 13:41) *
Так а что здесь может неработать ? Разве что lmp r16,Y+ нет такой команды у AVRов . Выборка из памяти программ производится только через регистровую пару Z ( см. описание системы команд ).
Всё в рамках того , что я и писал .
shl Yl я так понимаю описка , должно быть по идее lsl . Гораздо проще записать так
ldi Yh,high(IDent32 х2)
ldi Yl,low(IDent32 х2)
и нет необходимости в лишних 2 строчках ( lsl Yl и ror Yh )
Так и что вы делаете ? Вы загружаете указатель чётным значением адреса на базу данных , а затем просто инкрементируете указатель , и естественно он будет последовательно выбирать из таблицы правильные значения ( как чётные так и нечётные ) . Но речь то о другом - у вас есть указатель на базу данных и вам необходимо выбрать произвольное значение по этой базе данных ( т.е смещение от начала базы данных ). Ну и как вы будете делать ? например так ? :

ldi Yh,high(IDent32)
ldi Yl,low(IDent32)
shl Yl
ror Yh
add Yl,temp1
clr temp1
adc yh,temp1
lpm temp1,Y
где temp1 - произвольное смещение по таблице
И по вашему вы будете правильно получать значения из базы данных ? Тогда попробуйте , убедитесь в своей неправоте .
Простите , непонял . . .
DB 0,1 DB2,3 писать не судьба?
Это как это ? Извените , сразу немогу ощутить глубину мысли . . .


Да , в приведённом мной тексте конечно же необходимо заменить Y на Z


Продолжаем прикол .
Так вот , после того , как база данных была записана в необходимом для меня виде :
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\
(Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_Off<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_Off<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_Off<<D1)+(Seg_Off<<D0),\
(Seg_On<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)
.DB (Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_On<<D5)+(Seg_Off<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\
(Seg_On<<D7)+(Seg_Off<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_Off<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_Off<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\
(Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\
(Seg_On<<D7)+(Seg_Off<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)
.DB (Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_Off<<D4)+(Seg_Off<<D3)+(Seg_Off<<D2)+(Seg_Off<<D1)+(Seg_Off<<D0),\
0
и откомпиллирована , а также успешно проверена работоспособность программы , затем в конце каждой строчки были добавлены комментарии ( // ля ля ля ) .

.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\ //
(Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_Off<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0) //
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_Off<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_Off<<D1)+(Seg_Off<<D0),\ //
(Seg_On<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0) //
.DB (Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_On<<D5)+(Seg_Off<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\ //
(Seg_On<<D7)+(Seg_Off<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_Off<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0) //
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_Off<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\ //
(Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0) //
.DB (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0),\ //
(Seg_On<<D7)+(Seg_Off<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_On<<D2)+(Seg_On<<D1)+(Seg_Off<<D0) //
.DB (Seg_Off<<D7)+(Seg_Off<<D6)+(Seg_Off<<D5)+(Seg_Off<<D4)+(Seg_Off<<D3)+(Seg_Off<<D2)+(Seg_Off<<D1)+(Seg_Off<<D0),\ //
0

И . . . опять всё плохо . Опять компиллятор находит ошибку во второй строчке . Но что самое удивительное - повторное удаление комментариев уже не приводит к положительным результатам . Кто не верит может попробовать . Может у меня уже глаза "замылились " , уже сам себе не верю . Чушь какая- то . sad.gif sad.gif wacko.gif
Go to the top of the page
 
+Quote Post
CDT
сообщение Sep 24 2007, 10:08
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



Цитата(Yuriy_AVR @ Sep 21 2007, 12:58) *
DB 0,1 DB2,3 писать не судьба?

Судьба, если читал:
Код
AVRASM2 allows multiple instructions and directives per line, but its use is not recommended. It is needed to support expansion of multiline preprocessor macros.

и понимать, что выше приведенная запись приведет к сообщению "Unknown instruction or macro", а в правильном написании абсолютно эквивалентна
Код
DB 0,1
DB 2,3


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Yuriy_AVR   надо в ассемблере в таблице организовать базу данных   Sep 20 2007, 07:09
||- - =GM=   Цитата(Yuriy_AVR @ Sep 20 2007, 16:18) Да...   Sep 20 2007, 22:31
|||- - Yuriy_AVR   Цитата(=GM= @ Sep 21 2007, 02:31) Ну, а е...   Sep 21 2007, 06:06
|||- - Wild007   Цитата(Yuriy_AVR @ Sep 21 2007, 09:06) Са...   Sep 21 2007, 06:53
|||- - Сергей Борщ   Цитата(Yuriy_AVR @ Sep 21 2007, 09:06) К ...   Sep 21 2007, 07:51
||- - Wild007   Цитата(Maik-vs @ Sep 21 2007, 11:17)...   Sep 21 2007, 08:36
|||- - Maik-vs   Цитата(Wild007 @ Sep 21 2007, 12:36) Ну т...   Sep 21 2007, 09:22
||- - Wild007   Цитата(Yuriy_AVR @ Sep 21 2007, 12:43) Та...   Sep 21 2007, 10:04
|||- - Yuriy_AVR   Цитата(Wild007 @ Sep 21 2007, 14:04) В но...   Sep 21 2007, 11:49
|||- - Wild007   Цитата(Yuriy_AVR @ Sep 21 2007, 14:49) Он...   Sep 21 2007, 12:17
|- - SasaVitebsk   Цитата(Yuriy_AVR @ Sep 20 2007, 11:29) Пр...   Sep 20 2007, 19:03
- - Wild007   Для большей читабельности програим надо вводить до...   Sep 20 2007, 10:00
- - CDT   Цитата(Yuriy_AVR @ Sep 20 2007, 10:09) Но...   Sep 21 2007, 04:26
- - _Pasha   А вот лично я такие таблицы со сложными зависимост...   Sep 21 2007, 16:46
|- - SasaVitebsk   Цитата(_Pasha @ Sep 21 2007, 19:46) А вот...   Sep 21 2007, 17:04
- - _Pasha   ...Не заметил. Это ж Вы (автор темы) намекаете на...   Sep 21 2007, 17:24
|- - Yuriy_AVR   Цитата(_Pasha @ Sep 21 2007, 21:24) ...Не...   Sep 22 2007, 13:00
- - ReAl   Цитата(Yuriy_AVR @ Sep 21 2007, 11:58) Но...   Sep 21 2007, 19:17


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016