|
надо в ассемблере в таблице организовать базу данных |
|
|
|
Sep 20 2007, 07:09
|
Участник

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

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

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

|
Цитата(SasaVitebsk @ Sep 20 2007, 12:08)  А почему обязательно в ассемблере? Программа на писана на ассме . Тем более что мне ассм больше нравится - каждому своё .
|
|
|
|
|
Sep 20 2007, 10:00
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Для большей читабельности програим надо вводить дополнительные переменные с помощью .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) (см. хелп по Студии).
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Sep 20 2007, 10:01
|

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
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 20 2007, 11:10
|
Участник

Группа: Участник
Сообщений: 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) (см. хелп по Студии). Да наверное это выход . . . Странно как я ненодумался до такого простого переопределения . Большое спасибо
|
|
|
|
|
Sep 20 2007, 17:18
|
Участник

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

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

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

|
Цитата(Yuriy_AVR @ Sep 20 2007, 16:18)  Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чётное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую. Так что итоговый обьём будет равен обьём таблицы х2 Ну, а если так? Код .db 0b11111010,0b00001010,0b11011100,0b10111110 По-моему, наглядность еще лучше будет
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 21 2007, 04:26
|
Местный
  
Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044

|
Цитата(Yuriy_AVR @ Sep 20 2007, 10:09)  Но при записи .db надо сразу записывать 2 байта ( через запятую ) . Теоретически после записи первого байта можно поставить \n Ну, во первых не \n и не '\n', а просто \ , и то, если речь идет об Atmel AVR Assembler 2 Код .db 12, 15, $fe,\ $cd,255 Еще есть директива .dw
--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
|
|
|
|
|
Sep 21 2007, 06:06
|
Участник

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

|
Цитата(=GM= @ Sep 21 2007, 02:31)  Ну, а если так? Код .db 0b11111010,0b00001010,0b11011100,0b10111110 По-моему, наглядность еще лучше будет Наглядность чего ? чередования нулей и едениц ? При большой таблице ( у меня например 86 ) значений с большим кол-вом знаков вы запаритесь . То , что у вас записано 0b11111010 , я записываю на мой взгляд гораздо наглядней ( и с меньшей вероятностью сделать ошибку ) как (On<<Seg_A)+(On<<Seg_B)+(On<<Seg_C)+(On<<Seg_D)+(On<<Seg_E)+(Off<<Seg_F)+(On<<Seg_G)+(Off<<Seg_H). Да , запись длиннее , но мне нет необходимости выискивать среди этих едениц и нулей нужный мне сегмент . Я просто его либо включил , либо выключил . К тому же , если например ( как произошло в моём случае ) возникает необходимость сделать инверсную таблицу ( т.е например 1 это выключенное состояние , 0 - включенное , то мне ручками переписывать всю таблицу ?). При моей записи достаточно просто переопределить значение On и Off ( поменять местами одну 1 и один 0 ) и перекомпилировать . К тому - же , если меняется взаимное расположение сегментов ( в моей задачке и такое было ) , то опять ручками всю таблицу ? А сегмент А вполне может быть где- нибудь на месте D3 ли D5 . Вот тогда вы всё ручками да ручками , да без ручки с бумагой не обойтись . При моей записи вы просто переопределяете что .equ Seg_A=D5 .equ Seg_B=D7 , и т.д. И ненадо парится . Всё будет сделано за вас . Машине - машинное ( рутинное ), - человеку- человечье ( творческое )  Цитата(SasaVitebsk @ Sep 20 2007, 23:03)  Чтобы понять что больше нравится надо попробовать оба варианта. А так сложно сравнивать.
Как раз ваша задача отлично ложится на Си. Проблема которая у вас там возникла в Си просто бы не возникала. Если вы работаете в Си, то любую часть проекта (какая вам нравится) вы можете написать на ASMе. И на асме чудненько . . . Да и у меня проблема то возникла из-за собственных тормозов . А тормоза могут включится при программировании на любом из языков , и сам язык тут непричём. Я знаю вашу неприкрытую приверженность к Си , но тут каждому своё - я могу писать и на Си ( правда похуже чем на асме ) и на асме; как по мне , то мне больше нравится асм. Примерно как на самолёте летишь либо сам за штурвалом , либо самолёт ведёт автопилот , и что там у него в черепушке варится - один бог знает . К тому же , как и любая программа , Си имеет свои баги ( как говорит мой друг одессит - И оно мне надо ? ) Я и сам баги могу неплохо делать . . . А если серьёзно , то большое спасибо человеку - подсказал что достаточно просто сделать переопределение . Иногда ( как в данном случае , например ) решение под ногами , ходишь вокруг , ходишь . . . а поднять неможешь . А всё достаточно банально . . . Ещё раз большое спасибо Wild007Цитата(CDT @ Sep 21 2007, 08:26)  Ну, во первых не \n и не '\n', а просто \ , и то, если речь идет об Atmel AVR Assembler 2 Код .db 12, 15, $fe,\ $cd,255 Еще есть директива .dw Самый большой прикол заключается как раз в том , что я как раз так и начинал делать ( просто \ ). Это ведь первое что приходит в голову , да это и логично . Это уже потом , от злости начал уже всякие другие варианты ( \n , '\n' и т.д. ) Но оно не работало  , я и немог понять почему - вроде всё делаешь правильно , но не работает . . . Проверял многократно . От отчаяния и написал в конфу . А теперь собственно сам прикол - я сейчас опять откомпиллировал тот кусок и . . . - неповерил своим глазам - оно работает - а я ничего не менял ( 100 % ) . Разница лишь в том что после неудачных проб комп был перегружен . Но ведь это ахинея какая-то . В жизни никогда бы неповерил если бы сам не видел - мистика какая-то. В любом случае большое спасибо всем кто попытался помочь . . .
|
|
|
|
|
Sep 21 2007, 06:53
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Yuriy_AVR @ Sep 21 2007, 09:06)  Самый большой прикол заключается как раз в том , что я как раз так и начинал делать ( просто \ ). Это ведь первое что приходит в голову , да это и логично . Это уже потом , от злости начал уже всякие другие варианты ( \n , '\n' и т.д. ) Но оно не работало  , я и немог понять почему - вроде всё делаешь правильно , но не работает . . . Проверял многократно . От отчаяния и написал в конфу . А теперь собственно сам прикол - я сейчас опять откомпиллировал тот кусок и . . . - неповерил своим глазам - оно работает - а я ничего не менял ( 100 % ) . Разница лишь в том что после неудачных проб комп был перегружен . Но ведь это ахинея какая-то . В жизни никогда бы неповерил если бы сам не видел - мистика какая-то Проверьте в .lst файле, какие значения компилятор забросил в .DB и соответствуют ли они тому что вы хотели увидеть  .
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Sep 21 2007, 08:17
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Yuriy_AVR @ Sep 20 2007, 21:18)  Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чёное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую . Так что итоговый обьём будет равен обьём таблицы х2 .  Это всё Вы проверяли, или И ТАК знаете?
чтение 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
|
|
|
|
|
Sep 21 2007, 08:36
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Maik-vs @ Sep 21 2007, 11:17)   Это всё Вы проверяли, или И ТАК знаете? Ну тогда напишите в программе Код .DB 0 .DB 4 и потом покажите варнинги компилятора и таблицу А в вашей программе проще и нагляднее написать Код .DB "Тестовая болванка"
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Sep 21 2007, 09:22
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Wild007 @ Sep 21 2007, 12:36)  Ну тогда напишите в программе Код .DB 0 .DB 4 и потом покажите варнинги компилятора и таблицу  Да! так ставит только по чётным адресам. А DB 0,1 DB2,3 писать не судьба? Цитата А в вашей программе проще и нагляднее написать Код .DB "Тестовая болванка" А вот это у меня раньше почему-то не работало
|
|
|
|
|
Sep 21 2007, 09:58
|
Участник

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

|
Цитата(Maik-vs @ Sep 21 2007, 12:17)   Это всё Вы проверяли, или И ТАК знаете?
чтение 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 и потом покажите варнинги компилятора и таблицу А в вашей программе проще и нагляднее написать Код .DB "Тестовая болванка" Простите , непонял . . . Цитата(Maik-vs @ Sep 21 2007, 13:22)  Да! так ставит только по чётным адресам. А DB 0,1 DB2,3 писать не судьба? А вот это у меня раньше почему-то не работало  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 И . . . опять всё плохо . Опять компиллятор находит ошибку во второй строчке . Но что самое удивительное - повторное удаление комментариев уже не приводит к положительным результатам . Кто не верит может попробовать . Может у меня уже глаза "замылились " , уже сам себе не верю . Чушь какая- то .
|
|
|
|
|
Sep 21 2007, 10:04
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Yuriy_AVR @ Sep 21 2007, 12:43)  Так а что здесь может неработать ? Разве что lmp r16,Y+ нет такой команды у AVRов . В новых АВР есть команда LPM Rx,Y+ (cм. например tn2313def.inc) Цитата Простите , непонял . . . Это относилось к проге Maik-vs Код .DB 9 .DB 4 полностью соответствует совету =GM=Код .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 0,1 DB2,3 писать не судьба? Это как это ? Извените , сразу немогу ощутить глубину мысли . . . Это "совет" писать четное количество значений в строке Хотя мы это и сами знаем...
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Sep 21 2007, 11:49
|
Участник

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

|
Цитата(Wild007 @ Sep 21 2007, 14:04)  В новых АВР есть команда LPM Rx,Y+ (cм. например tn2313def.inc) Это относилось к проге Maik-vs Код .DB 9 .DB 4 полностью соответствует совету =GM=Код .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 Это "совет" писать четное количество значений в строке Хотя мы это и сами знаем... Дело в том , что в моей программе On и Seg_On суть разные вещи, и в данном случае принимают противоположные значения . Такая запись просто сокращает несколько длину строки , но не меняет принципиально подход . Оно обязано работать в таком виде : .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) и иногда работает !!! и видимо какая то проблема с компилятором существует что после обнаружения Си-шного комментария он дуреет. Видимо самый "железный" выход- сделать переопределение переменной ( как и посоветовал Wild007) . И всё работает естественно на УРА !
|
|
|
|
|
Sep 21 2007, 12:17
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Yuriy_AVR @ Sep 21 2007, 14:49)  Оно обязано работать в таком виде : .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) и иногда работает !!! и видимо какая то проблема с компилятором существует что после обнаружения Си-шного комментария он дуреет. Он "дуреет" не только от Си-шного комментария, но и от ";" после "\"
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Sep 21 2007, 19:17
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Yuriy_AVR @ Sep 21 2007, 11:58)  Но что самое удивительное - повторное удаление комментариев уже не приводит к положительным результатам . Между символом '\' и переводом строки не должно быть никаких других символов, иначе бэкслэш не маскирует перевод строки (стоит-то не перед ним!). Видать, после удаления комментариев после '\' остались пробелы, вот и все проблемы.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 22 2007, 13:00
|
Участник

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

|
Цитата(_Pasha @ Sep 21 2007, 21:24)  ...Не заметил. Это ж Вы (автор темы) намекаете на организацию вывода символов и строк на семисегментный индикатор!? Тогда рекомендую :[attachment=13897:attachment] На все вопросы отвечу. Со временем  Большое спасибо за помощь. Приведённый вами кусок программы является перепевкой предложения Wild007 , и по факту является простым переопределнием переменной ( сам немогу понять как я так протормозил что недодумался , ну быввает что тормоза включаются). Цитата(ReAl @ Sep 21 2007, 23:17)  Между символом '\' и переводом строки не должно быть никаких других символов, иначе бэкслэш не маскирует перевод строки (стоит-то не перед ним!). Видать, после удаления комментариев после '\' остались пробелы, вот и все проблемы. Большое спасибо что откликнулись на мою просьбу ( читай на мои "тормоза") . Когда я после положительного результата опять получил отрицательный, то пришёл к тому же выводу что и вы . Но удалять пробелы уже не стал - просто переопределил переменную и стал писать дальше .
|
|
|
|
|
Sep 24 2007, 10:08
|
Местный
  
Группа: Свой
Сообщений: 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
--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|