-
- Вставлю свои 5 копеек (по "trablset2.asm") : argus98(639 знак., 15.10.2012 16:02)
- Да, команды есть 2 и 4 байтные. Поэтому забудьте rjmp PC-1 или rjmp PC+2. Иначе получите непонятное поведение программы, так как не учли, что команды могут быть 4 байтные. Нужно делать переход на метки. mazur(259 знак., 14.10.2012 21:07)
- Нет, в макросах PC+2 как раз уместно: нет метки - нет ошибки "Duplicate label". - maik-vs(15.10.2012 16:20)
- Кстати, еще потенциальный глюк: иаровский асм считает в байтах, авровский в словах. Налетел когда-то на это. - Andreas(15.10.2012 17:32)
- Смотрим скриншоты: mazur(15.10.2012 16:30)
- Посмотрел. И что? - maik-vs(15.10.2012 17:02)
- Нет ошибки "Duplicate label". - mazur(15.10.2012 17:29)
- То есть о нас уже позаботились... Не знал, спасибо. - maik-vs(16.10.2012 10:41)
- Нет ошибки "Duplicate label". - mazur(15.10.2012 17:29)
- Посмотрел. И что? - maik-vs(15.10.2012 17:02)
- Нет, в макросах PC+2 как раз уместно: нет метки - нет ошибки "Duplicate label". - maik-vs(15.10.2012 16:20)
- .dseg ilyaul(46 знак., 14.10.2012 20:58)
- Садись, двойка. Завтра с родителями к завучу - на второй год останешься - MBedder(14.10.2012 21:02)
- Ну пусть использует глобальные, пусть хоть что-то напишет! - Vladimir Ljaschko(14.10.2012 21:26)
- поясните - ilyaul(14.10.2012 21:16)
- параметры, традиционно передаются через регистры или ячейки памяти (можно и через стек, но это уже "нетрадиционно" :)) Переменные располагаются там же. Adept(119 знак., 14.10.2012 21:22)
- Если быть более точным, то Bill(91 знак., 14.10.2012 22:36)
- Не понял. Я и расположил VAR1 и Var2 в области SRAM назначив адрес их расположения 0х60 и 0х61 соответственно. Конечно в общем случае ,.org не нужен. Компилятор сам определит начало SRAM, но здесь вроде как частный случай. - ilyaul(14.10.2012 21:34)
- то, что Вы ячейки памяти обозвали как "VAR", переменными их не сделало. Adept(151 знак., 14.10.2012 21:44)
- Ну почему же не сделало? Я ведь могу Bill(51 знак., 14.10.2012 22:32)
- Зачем использовать 4 байтную команду, если можно проще?: mazur(34 знак., 14.10.2012 22:42)
- VAR1 - это регистр? - Apтём(14.10.2012 22:51)
- Да. У ilyaul VAR1 = 0. 0 адрес у регистра r0. - mazur(14.10.2012 22:54)
- Ну если регистр...но адрес тут нипричём - mov с адресами SRAM не работает - Apтём(14.10.2012 22:56)
- На. mazur(14.10.2012 23:01)
- Куды там смотреть-то? - Apтём(14.10.2012 23:04)
- Туды. mazur(14.10.2012 23:14)
- А ...но там sts, а не mov... Apтём(88 знак., 15.10.2012 00:01)
- Э-э-э... MBedder лучше объяснит. Я сам с его примеров поднатаскивался. Ну не только, конечно. Тут есть еще мэтры. Просто MBedder был инженером по AVR микроконтроллерам. И у него много хитрых приемчиков на асме. Главное, конечно, знание нюансов mazur(204 знак., 15.10.2012 00:08 - 00:11)
- >>А 0 адрес в памяти данных у r0. На регистры можно смотреть как на память данных. Apтём(67 знак., 15.10.2012 00:32)
- А вы можете привести пример МК семейства AVR, для которого это не так? - Bill(15.10.2012 09:32)
- XMEGA - Apтём(15.10.2012 13:29)
- Вообще-то мой пример был для ATTINY2313. Специально тини взял. mazur(89 знак., 15.10.2012 08:59)
- А вы можете привести пример МК семейства AVR, для которого это не так? - Bill(15.10.2012 09:32)
- >>А 0 адрес в памяти данных у r0. На регистры можно смотреть как на память данных. Apтём(67 знак., 15.10.2012 00:32)
- Э-э-э... MBedder лучше объяснит. Я сам с его примеров поднатаскивался. Ну не только, конечно. Тут есть еще мэтры. Просто MBedder был инженером по AVR микроконтроллерам. И у него много хитрых приемчиков на асме. Главное, конечно, знание нюансов mazur(204 знак., 15.10.2012 00:08 - 00:11)
- А ...но там sts, а не mov... Apтём(88 знак., 15.10.2012 00:01)
- Туды. mazur(14.10.2012 23:14)
- Куды там смотреть-то? - Apтём(14.10.2012 23:04)
- На. mazur(14.10.2012 23:01)
- Ну если регистр...но адрес тут нипричём - mov с адресами SRAM не работает - Apтём(14.10.2012 22:56)
- Да. У ilyaul VAR1 = 0. 0 адрес у регистра r0. - mazur(14.10.2012 22:54)
- А я-то думал, что вы ассемблер знаете. А оно вон как. :( - Bill(14.10.2012 22:46)
- Ничего криминального - просто VAR1 заранее сделана регистровой - MBedder(14.10.2012 22:50)
- Если регистр, то все нормально. Но я написал явно Bill(136 знак., 14.10.2012 22:57 - 22:59)
- ТС их так "объявил", что VAR1 стала R0, а VAR2 - R1, такштаа твой код неправ, а мазура - прав - MBedder(14.10.2012 23:03)
- Ну... Чья школа? :))) - mazur(14.10.2012 23:04)
- Ну, коли так, то я, действительно, неправ. - Bill(14.10.2012 23:05)
- ТС их так "объявил", что VAR1 стала R0, а VAR2 - R1, такштаа твой код неправ, а мазура - прав - MBedder(14.10.2012 23:03)
- Я про это и написал. - mazur(14.10.2012 22:52)
- А я Bill'у именно это и пояснил - MBedder(14.10.2012 22:54)
- Угу. :) - mazur(14.10.2012 22:55)
- А я Bill'у именно это и пояснил - MBedder(14.10.2012 22:54)
- Если регистр, то все нормально. Но я написал явно Bill(136 знак., 14.10.2012 22:57 - 22:59)
- Стоп. Вы написали lds r16, VAR1. У ilyaul VAR1 = 0. 0 адрес у регистра r0. Или вы что-то другое имели в виду\хотели написать? mazur(14.10.2012 22:50)
- Ничего криминального - просто VAR1 заранее сделана регистровой - MBedder(14.10.2012 22:50)
- VAR1 - это регистр? - Apтём(14.10.2012 22:51)
- Запишется число ,которое вы присвоили VAR1. - ilyaul(14.10.2012 22:40)
- :))) - MBedder(14.10.2012 22:43)
- Ну да , у него там lds тогда всё хитрей , зависит от значения VAR. - ilyaul(14.10.2012 22:55)
- :))) - MBedder(14.10.2012 22:43)
- Зачем использовать 4 байтную команду, если можно проще?: mazur(34 знак., 14.10.2012 22:42)
- Ну , да . Врубился. - ilyaul(14.10.2012 22:19)
- Ну почему же не сделало? Я ведь могу Bill(51 знак., 14.10.2012 22:32)
- то, что Вы ячейки памяти обозвали как "VAR", переменными их не сделало. Adept(151 знак., 14.10.2012 21:44)
- параметры, традиционно передаются через регистры или ячейки памяти (можно и через стек, но это уже "нетрадиционно" :)) Переменные располагаются там же. Adept(119 знак., 14.10.2012 21:22)
- Садись, двойка. Завтра с родителями к завучу - на второй год останешься - MBedder(14.10.2012 21:02)
- директива SET не создает исполняемого процессором кода, а только присваивает символу численное значение на этапе трансляции(ассемблирования). К моменту загрузки в R16 "но на самом деле p1 всегда равно 3" в полном соответствии с последней Вл.Шарнин(92 знак., 14.10.2012 16:37)
- Я уже догадался, что SET не мне поможет - в учебнике я прочитал, EQU создает константы, а SET переменные, вот я и повелся. По сути мне нужно выполнить следующую задачу - установить или сбросить определенный бит в регистре - sbr FLAG,1<<p1 в p1 я tvi(259 знак., 14.10.2012 17:36)
- Вы, видимо, не тот учебник прочитали. Ни .equ, ни .set не создают переменных в памяти. Разница между ними Bill(853 знак., 14.10.2012 22:28)
- В.Трамперт AVR-RISC микроконтроллеры. Но, думаю, это переводчики меня ввели в заблуждение, да я и сам плохо разбираюсь в архитектуре и принципах организации памяти в МК, каюсь, грешен! tvi(255 знак., 15.10.2012 19:45)
- Ассемблер в момент обработки строки текста "sbr FLAG,RegToConst(r17)" никак не может знать какое значение будет иметь регистр микроконтроллера R17 в момент исполнения этой команды, значит константу вычислить не может. - Вл.Шарнин(15.10.2012 20:56)
- Не нужно забывать, что ассемблер транслирует Bill(77 знак., 15.10.2012 20:50)
- В.Трамперт AVR-RISC микроконтроллеры. Но, думаю, это переводчики меня ввели в заблуждение, да я и сам плохо разбираюсь в архитектуре и принципах организации памяти в МК, каюсь, грешен! tvi(255 знак., 15.10.2012 19:45)
- Второй операнд инструкции sbr должен быть константой. Позицию бита по значению можно вычислить, можно определить серией сравнений исходного значения, можно взять из таблицы... - Вл.Шарнин(14.10.2012 18:04)
- Вы, видимо, не тот учебник прочитали. Ни .equ, ни .set не создают переменных в памяти. Разница между ними Bill(853 знак., 14.10.2012 22:28)
- Я уже догадался, что SET не мне поможет - в учебнике я прочитал, EQU создает константы, а SET переменные, вот я и повелся. По сути мне нужно выполнить следующую задачу - установить или сбросить определенный бит в регистре - sbr FLAG,1<<p1 в p1 я tvi(259 знак., 14.10.2012 17:36)
- set для компилятора. Напишите, что вы хотите сделать. Для чего такой изврат с set. - mazur(14.10.2012 16:04)
- У меня есть задача контролировать напряжение на 3-х входах и выполнять определенные действия в зависимости от величины этих напряжений, а т.к. действия для каждого канала однотипны я написал подпрограмму в которой пытаюсь менять ссылки на tvi(201 знак., 14.10.2012 16:25)
- Почему на СИ всё это не сделать? - Apтём(14.10.2012 22:22)
- Tip: ключевое слово для тебя - bitmask - MBedder(14.10.2012 21:06)
- Вот переписал прогу, в которой для передачи параметров использую регистры - все работает! Всем спасибо за подсказки и дельные советы! И все-таки я до конца не понял разницу между директивами EQU - SET tvi(15.10.2012 11:23)
- Не знаю, что делает ваша программа. Но даже я, когда начинал, не извращался так. Что за программа, что она делает, что вы хотите получить? - mazur(15.10.2012 11:44)
- Программы написаны только для наглядности моих затруднений - первая, где я пытался создать переменные и с их помощью передать параметры в подпрограмму - вы все мне объяснили, что таким образом это сделать невозможно и подсказали, что параметры tvi(498 знак., 15.10.2012 12:24)
- Если нам нужно записать флаг, тогда это будет команда ldi: mazur(477 знак., 15.10.2012 16:04)
- Думаю, вы так и не поняли о чем я спрашивал изначально, а как устанавливать/сбрасывать флаги по одному или скопом я знаю. И я не пойму смысла ваших макросов - зачем они нужны? tvi(118 знак., 15.10.2012 23:57)
- Я не раз делал ошибку со стрелками. Один раз даже отправил заказчику программу с одной такой ошибкой. Извращался с определением констант. Запарился. Наткнулся на эти макросы, с тех пор использую и не парюсь. mazur(283 знак., 16.10.2012 14:12)
- Ваш макрос работает только с одним битом. А sbr FLAGS,(1<<FLG1)|(1<<FLG2)|(1<<FLG3)? Или например sbr R16,(3<<WGM12)|(5<<CS10) - maik-vs(16.10.2012 15:57)
- Тут да, согласен. Предложите варианты. - mazur(16.10.2012 16:15)
- Ваш макрос работает только с одним битом. А sbr FLAGS,(1<<FLG1)|(1<<FLG2)|(1<<FLG3)? Или например sbr R16,(3<<WGM12)|(5<<CS10) - maik-vs(16.10.2012 15:57)
- Нет, sbr FLAGS,FLG1 это фактически OR с константой. В отличие от sbi port,bit. :0 C битами работаем так: maik-vs(403 знак., 16.10.2012 10:24)
- sbr Rd,K - это ORI Rd,K. А про defы я не понял, к чему это вы? В программе trablset2.asm я допустил ошибку - поставил две метки с одинаковыми именами lDelay, а поскольку одна из них стоит в макросе, ассемблер промолчал, как и предупреждал mazur. tvi(45 знак., 16.10.2012 11:14)
- Про .def-ы это совет. Неприятно видеть программы с бесконечными R16 R17 R23 и держать в мозге кто для чего. - maik-vs(16.10.2012 11:38)
- sbr Rd,K - это ORI Rd,K. А про defы я не понял, к чему это вы? В программе trablset2.asm я допустил ошибку - поставил две метки с одинаковыми именами lDelay, а поскольку одна из них стоит в макросе, ассемблер промолчал, как и предупреждал mazur. tvi(45 знак., 16.10.2012 11:14)
- А я у вас спрашивал, что делает ваша программа. Что вы хотите получить. Вы не ответили, а передача параметров и ваш код это не ответ. Очень возможно, что все можно сделать по другому. - mazur(16.10.2012 06:43)
- Посылаю вам упрощенную версию (для облегчения восприятия) моей работающей программы с 3-мя однотипными блоками, которую я для облегчения отладки решил переписать, используя подпрограмму. Но наткнулся на проблему с использовавшимися в старой версии tvi(650 знак., 16.10.2012 16:02 - 16:06)
- Вы тоже снова меня не поняли. Я посмотрю примеры. Мне нужно знать, что вы хотите реализовать. Не программным кодом, а что-то вроде ТЗ. Типа: вот такой-то девас. Он должен делать то-то и то-то. И когда то-то и то-то, должно происходить вот это и mazur(137 знак., 16.10.2012 16:21)
- Сколько программистов и столько же решений любого ТЗ, не так ли? Программа уже 3 года нормально работает, а этот блок программы самый сложный, в смысле алгоритма и трогать что то в ней опасно, поскольку я уже сам не все помню. Лучшее, враг tvi(745 знак., 16.10.2012 18:33)
- Вы тоже снова меня не поняли. Я посмотрю примеры. Мне нужно знать, что вы хотите реализовать. Не программным кодом, а что-то вроде ТЗ. Типа: вот такой-то девас. Он должен делать то-то и то-то. И когда то-то и то-то, должно происходить вот это и mazur(137 знак., 16.10.2012 16:21)
- Посылаю вам упрощенную версию (для облегчения восприятия) моей работающей программы с 3-мя однотипными блоками, которую я для облегчения отладки решил переписать, используя подпрограмму. Но наткнулся на проблему с использовавшимися в старой версии tvi(650 знак., 16.10.2012 16:02 - 16:06)
- Я не раз делал ошибку со стрелками. Один раз даже отправил заказчику программу с одной такой ошибкой. Извращался с определением констант. Запарился. Наткнулся на эти макросы, с тех пор использую и не парюсь. mazur(283 знак., 16.10.2012 14:12)
- Вариант с + тяжелее чем с | отлаживать, если случайно одинаковые FLG1 и FLG2 сделал. Особенно, когда флагов много. - Andreas(15.10.2012 16:28)
- Думаю, вы так и не поняли о чем я спрашивал изначально, а как устанавливать/сбрасывать флаги по одному или скопом я знаю. И я не пойму смысла ваших макросов - зачем они нужны? tvi(118 знак., 15.10.2012 23:57)
- Если нам нужно записать флаг, тогда это будет команда ldi: mazur(477 знак., 15.10.2012 16:04)
- Программы написаны только для наглядности моих затруднений - первая, где я пытался создать переменные и с их помощью передать параметры в подпрограмму - вы все мне объяснили, что таким образом это сделать невозможно и подсказали, что параметры tvi(498 знак., 15.10.2012 12:24)
- EQU -- это навсегда, то есть до завершения обработки текста ассемблером. Значение константы, обьявленное директивой SET, можно изменять последующими директивами SET. Успехов! - Вл.Шарнин(15.10.2012 11:38)
- Не знаю, что делает ваша программа. Но даже я, когда начинал, не извращался так. Что за программа, что она делает, что вы хотите получить? - mazur(15.10.2012 11:44)
- Да, намек понятен - команды sbr и cbr я уже придумал заменить командами OR и AND. tvi(47 знак., 14.10.2012 22:07)
- test и breq Apтём(64 знак., 14.10.2012 22:20)
- Команда and меняет флаг Z. tst - не нужен - ilyaul(14.10.2012 22:43)
- А вот и еще один двоешник подтянулся :)) - MBedder(14.10.2012 22:40)
- Вторая команда здесь явно лишняя. Bill(10 знак., 14.10.2012 22:30)
- Да, tst - лишняя команда. Давно на асме не писал - забыл. - Apтём(14.10.2012 22:46)MBedder
- Я знал одного студента, который перед выполнением какой-либо инструкции всегда сбрасывал интересующий его флаг, хотя Bill(134 знак., 15.10.2012 09:44)
- "Не знал, но забыл"(с) :)) - MBedder(14.10.2012 22:53)
- Да, tst - лишняя команда. Давно на асме не писал - забыл. - Apтём(14.10.2012 22:46)MBedder
- test и breq Apтём(64 знак., 14.10.2012 22:20)
- Вот переписал прогу, в которой для передачи параметров использую регистры - все работает! Всем спасибо за подсказки и дельные советы! И все-таки я до конца не понял разницу между директивами EQU - SET tvi(15.10.2012 11:23)
- Если всего для 3-х входов - проще сделать три ветки где в каждой в R16 будет заноситься 1,2 или 3. Hobo(652 знак., 14.10.2012 18:01 - 18:10)
- В реальности то у меня так и есть - написано три блока однотипных, которые проходят последовательно по кольцу. Код то в них одинаковый, только каждый блок работает со своими флагами (их три в каждом блоке). Все бы хорошо, но программа еще не tvi(1067 знак., 14.10.2012 20:16)
- Никак не определит. VAR1 это просто число под названием VAR1. Вообще опасно назначать переменные в ОЗУ директивами EQU. Что-то неправильно подсчитал, вылез за рамки или неправильно назначил адреса. Я с определенного момента стал делать так: есть mazur(814 знак., 14.10.2012 20:55)
- Хорошо , если в данном массиве мне нужно обратится к определённой переменной , да ещё прямой адресацией.Чем плоха такая роспись ilyaul(376 знак., 14.10.2012 23:17)
- Тем что, при ручном нумеровании легко ошибиться. mazur(446 знак., 14.10.2012 23:29)
- Красиво. Возьму на заметку - ilyaul(14.10.2012 23:37)
- Ручное нумерование полезно для уменьшения кода. Но нужно тщательно следить. mazur(195 знак., 15.10.2012 00:00)
- Каким образом задание адресов вручную уменьшает код? - maik-vs(15.10.2012 16:24)
- Ручное нумерование полезно для уменьшения кода. Но нужно тщательно следить. mazur(195 знак., 15.10.2012 00:00)
- Красиво. Возьму на заметку - ilyaul(14.10.2012 23:37)
- В данном случае у вас вообще нет Bill(222 знак., 14.10.2012 23:27 - 23:29)
- Так не надо. maik-vs(686 знак., 15.10.2012 16:13 - 16:17)
- sts (BUFDS1337+dsHr),temp всё что нужно сделать в основном коде - ilyaul(14.10.2012 23:35)
- На самом деле в моем случае можно написать просто Bill(63 знак., 14.10.2012 23:41)
- По моему мнению -теже яйца , только вид в профиль. Мне понравился вариант mazura , т.к. было что ошибался при нумерации . - ilyaul(15.10.2012 07:00)
- Совершенно верно. Обычно я тоже так пишу. Только я подкорректировал именно ваш вариант. - Bill(15.10.2012 07:22)
- По моему мнению -теже яйца , только вид в профиль. Мне понравился вариант mazura , т.к. было что ошибался при нумерации . - ilyaul(15.10.2012 07:00)
- На самом деле в моем случае можно написать просто Bill(63 знак., 14.10.2012 23:41)
- Тем что, при ручном нумеровании легко ошибиться. mazur(446 знак., 14.10.2012 23:29)
- Не "опасно", а "безграмотно" - MBedder(14.10.2012 22:56)
- Хорошо , если в данном массиве мне нужно обратится к определённой переменной , да ещё прямой адресацией.Чем плоха такая роспись ilyaul(376 знак., 14.10.2012 23:17)
- Никак не определит. VAR1 это просто число под названием VAR1. Вообще опасно назначать переменные в ОЗУ директивами EQU. Что-то неправильно подсчитал, вылез за рамки или неправильно назначил адреса. Я с определенного момента стал делать так: есть mazur(814 знак., 14.10.2012 20:55)
- В реальности то у меня так и есть - написано три блока однотипных, которые проходят последовательно по кольцу. Код то в них одинаковый, только каждый блок работает со своими флагами (их три в каждом блоке). Все бы хорошо, но программа еще не tvi(1067 знак., 14.10.2012 20:16)
- У меня есть задача контролировать напряжение на 3-х входах и выполнять определенные действия в зависимости от величины этих напряжений, а т.к. действия для каждого канала однотипны я написал подпрограмму в которой пытаюсь менять ссылки на tvi(201 знак., 14.10.2012 16:25)