Пост N: 110
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск, Мурманской обл.
Рейтинг:
1
Отправлено: 20.06.07 15:17. Заголовок: Re:
Пётр пишет:
цитата:
Нужна ли "решётка"
Насколько я понял, наличие или отсутствие решётки не изменяет и не влияет на результат компиляции программы. Поэтому - как кому удобно, можно ставить решётку, можно не ставить... (IMHO)
Пост N: 23
Зарегистрирован: 21.10.07
Откуда: Россия, Иркутск
Рейтинг:
0
Отправлено: 18.01.08 18:05. Заголовок: Диалог на форуме Мик..
Диалог на форуме Микрочипа навел меня на мысль развить тему по использованию (конечно не в ущерб оптимизации) директив MPASM. Если есть положительный опыт с обращением к этой "медвежей услуги"(директивам). Прошу высказаться.
Пост N: 25
Зарегистрирован: 21.10.07
Откуда: Россия, Иркутск
Рейтинг:
0
Отправлено: 18.01.08 18:34. Заголовок: Медвежей потому, чт..
Медвежей потому, что некоторые начинающие пикоманы желая "облегчить себе жизнь", используют директивы как попало, не думая об оптимизации кода, и рациональности их применения.
Пост N: 496
Зарегистрирован: 26.12.06
Откуда: Россия, Заозерск, Мурманской обл.
Рейтинг:
1
Отправлено: 18.01.08 18:41. Заголовок: Так с умом-же надо....
Так с умом-же надо... А с дуру можно и сломать. Удобная директива CBLOCK. Указал начальный адрес, перечислил все используемые регистры. Нет смысла объявлять адрес для каждого регистра.
Пост N: 242
Зарегистрирован: 06.05.07
Откуда: Россия, Липецк
Рейтинг:
3
Отправлено: 18.01.08 21:58. Заголовок: Следует четко разг..
Следует четко разграничивать директивы, "прописанные" в "шапке" программы (на объем программы не влияют. Удобство "в чистом виде") и директивы, "прописанные" в "рабочей" части программы (до директивы end). В последнем случае, каждая директива имеет свое разложение на команды, которого нет в тексте программы, но которое можно увидеть в окне ROM. Это и есть истинная "масса" директивы. Из этого следует то, что в тексте программы, директиву можно заменить на ее разложение на команды, и в памяти программ, после этого, ровным счетом ничего не изменится. Вот и весь "глубинный смысл".
Пост N: 31
Зарегистрирован: 21.10.07
Откуда: Россия, Иркутск
Рейтинг:
0
Отправлено: 21.01.08 14:03. Заголовок: А вот пример исполь..
А вот пример использования директив MACRO ,ENDM (макрос) WHILE, ENDW(цикл)
LIST P=16F84A INCLUDE P16F84A.INC
;****** Макрос . Добавить количество NOP
Set_NOP macro Count_NOP ; Определить тело макроса с аргументом Count_NOP (Количество NOP) variable i ; Объявляем локальную переменную (i) i = 0 ; Присвоить "стартовое" значение локальной переменной i = 0 while i < Count_NOP ; Тело цикла с условием: ; код в теле цикла (while --- endw) повторяется до тех пор, ; пока локал. переменная i меньше аргумента Count_NOP NOP ; Исполняемый код в теле цикла i ++ ; Инкремент локал. переменной (i) endw ; Конец цикла endm ; Конец макроса
Start: ;...... Инициализация..... ;...... тело программы.... Set_NOP 4 ; Вызов макроса с заданием значения аргумента Count_NOP в нашем случае 4 команды NOP. ;...... продолжение кода.. ;......................... end
Немного разобрался сам с этим вопросом. Директивами IF и ELSE удобно пользоваться в тех случаях, когда подразумевается несколько вариантов (сценариев) реализации программы или куска кода, и в зависимости от определённых условий (версии программы, конфигурация, модель контроллера и т. д.) С помощью заданного условия можно сконфигурировать(в памяти программ!) именно тот код, который в конкретном случае необходим. Остальные варианты исполняемого кода остаются за "кадром".
Например:
LIST P=16F84A INCLUDE P16F84A.INC ;*****Пример формирования альтернативного блока программы*****
Demo SET 0 ; Определение константы Demo =0 (Демо версия программы) Full SET 1 ; Определение константы Full=1 (Полная версия программы) Version SET Full ; Установка версии (Демо или полная) в нашем случае полная IF Version == Full ; Блок условий (версия демо или полная?), в нашем случае полная Config_full: ; Исполняемый код при истинном (1)значении (Version == Full) .......................... ELSE ; Если значение ложно, то Config_demo: ; Исполняемый код при ложном (0)значении (Version == Demo) .......................... ENDIF ; Конец блока условий ..........................
end
В память программ помещается именно тот код, который определен условием.
Пост N: 100
Зарегистрирован: 27.04.07
Откуда: Россия, Воркута
Рейтинг:
0
Фото:
Отправлено: 18.02.08 07:56. Заголовок: Тут хотел оптимизиро..
Тут хотел оптимизировать программу, по работе с датчиками DS18B20, но чтото не получается. Например, при работе с датчиком указывается PortC,DQ , где DQ - номер вывода микроконтроллера. Всего 5 датчиков, которые висят на разных выводах микроконтроллера. Я пробовал применить команду DQ set 1, DQ set 2 и т.д. В Mplab работает подмена DQ, а в железе нет. В чём может быть проблема?
Пост N: 61
Зарегистрирован: 21.10.07
Откуда: Россия, Иркутск
Рейтинг:
0
Отправлено: 18.02.08 08:13. Заголовок: Директива SET анало..
Директива SET аналогична EQU, но SET позволяет изменить значение (в вашем случае DQ). Посмотрите, как выглядит код после ассемблирования в окне Programm Memory ? Например:
Пост N: 1
Зарегистрирован: 02.01.09
Откуда: Россия, г. Таганрог
Рейтинг:
0
Отправлено: 02.01.09 23:20. Заголовок: Директива MPASM- SET
Перенесена из "Обсуждение открытой части "Самоучителя..." RW1ZK
На форум пишу впервые. Самоучитель и практикум изучаю уже 5 месяцев. Очень благодарен Евгению Александровичу за его труд. Все понятно и систематизировано. На базе программы терморегулятора termo_24 ( папка «Взлом») написал программу для двух датчиков. Показания температуры выводятся на двухразрядный индикатор. На освободившийся RA7 поцепил второй датчик. Процедура 1WIRE-протокола опрашивает порт RA4. По примеру Евгения Александровича хотел для краткости и красоты программы подправить процедуру, как универсальную. К примеру вместо «4» поставить допустим переменную «Y». А в процессе исполнения программы, подставляя вместо «Y» допустим "7" или "4", опрашивать первый или второй датчик. Повторно перечитывая самоучитель, ничего подходящего в моем случае я не нашел. Поэтому для получения результата пришлось написать две абсолютно одинаковые процедуры с той лишь разницей, что в одной обращение идет к RA4, а во втором к RA7. Не по хозяйски я потратил объем памяти программ. Перенимая настойчивость нашего мэтра, хотел докопаться до самой сути сам. Извилистая тропинка меня привела к директиве макроассемблера MPASM –«SET», которая както обделена вниманием. Начал работать с этой тёмной лошадкой, чтобы получить результат. На данный момент вот такая зарисовка у меня работает как в LAB так и в PIC Simulator IDE. Но её надо заставить работать с пользой. Может быть я ошибаюсь и эта тропинка тупиковая? Подскажите. ;================================================================================ ; Определение названий и положений регистров общего назачения. ;================================================================================ Top equ 20h ; ;================================================================================ ; Определение места размещения результатов операций. ;================================================================================ W equ 0 ; Результат направить в аккумулятор. F equ 1 ; Результат направить в регистр. N set 3 ; ;================================================================================ ; Присваивание битам названий. ;================================================================================ C equ 0 ; Флаг переноса-заема. Z equ 2 ; Флаг нулевого результата. ;================================================================================ org 0 ; Начальная "точка отсчета" в PC - нулевой ; адрес. ; -------------------------- "РАБОЧАЯ" ЧАСТЬ ПРОГРАММЫ ----------------------- START clrf Top ; В регистре Top ‘00000000’ ;-------------------------------------------------------------------------------- bsf Top,N ; В регистре Top ‘00001000’ N set (N+1) ; Директива MPASM с матем. выражением bsf Top,N ; В регистре Top ‘00011000’ N set (N+1) ; Директива MPASM с матем. выражением bsf Top,N ; В регистре Top ‘00111000’ bcf Top,N ; В регистре Top ‘00011000’ N set 4 ; Директива MPASM bcf Top,N ; В регистре Top ‘00001000’ N set 3 ; Директива MPASM bcf Top,N ; В регистре Top ‘00000000’ end ;Конец программы
Пост N: 602
Зарегистрирован: 14.01.07
Откуда: Россия, Лиски
Рейтинг:
2
Фото:
Отправлено: 03.01.09 00:11. Заголовок: Есть в самоучителе, ..
Есть в самоучителе, пример опроса более одного датчика. Если память не изменяет, там применяется вычисляемый переход. А если работать с не более чем двумя датчиками, то можно просто опрашивать нулевой бит регистра. Так называемая проверка на чётность. (бит=0 - опрос 1-го датчика, бит=1 - опрос 2-го датчика). А с диррективой SET, честно говоря незнаком. Наверное пригодится когда нибудь.
" Директива SET эквивалентна директиве EQU за исключением того, что значение присвоенное метке этой директивой, впоследствии может быть изменено другой директивой SET." После компиляции Вашего текста и перевода в АСМ, вот что получилось. Получается SET не был увиден компилятором. Но это не так, ошибок не было. Просто это почти, EQU. CLRF Top BSF Top , 03 BSF Top , 04 BSF Top , 05 BCF Top , 05 BCF Top , 04 BCF Top , 03 Мне кажется так проще и наглядней, то что Вы написали. Но наверно в некоторых случаях без директивы SET не обойтись. Ведь это смена определения в программе. Предлагаю попробывать еще раз все проанализировать и выложить в "Обмене". Многие на нее даже не глядели. Будет ценная информация. Еще один инструмент в руках.
Пост N: 1087
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
3
Награды:
Отправлено: 03.01.09 00:58. Заголовок: Век живи, век учись...
Век живи, век учись. MAZ пишет:
цитата:
проще и наглядней, то что Вы написали
проще-то проще, но я только что тоже попробовал в MPLAB'е, получается что действительно можно при некоторых операциях память программ сэкономить. Надо еще попробовать, но мне уже понравилось.
Пост N: 538
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг:
1
Фото:
Отправлено: 03.01.09 01:27. Заголовок: Могу вас всех разоча..
Могу вас всех разочаровать. Директива SET не сработает при опросе таким способом двух датчиков с разных битов порта. Допустим делаете такую конструкцию: N set 1 подпрограмма опроса датчика DS.... N set N+1 goto подпрограмма опроса датчика DS.... грубо говоря в такой конструкции вторая инструкция сет просто напросто не увидится в контроллере! Ведь память то уже прошита и 1 никак не может быть заменена на 2. Лаб у меня не возражал против такой компиляции, а надо бы возмущаться. Colorit пишет:
цитата:
bsf Top,N ; В регистре Top ‘00001000’ N set (N+1) ; Директива MPASM с матем. выражением bsf Top,N ; В регистре Top ‘00011000’ N set (N+1) ; Директива MPASM с матем. выражением bsf Top,N ; В регистре Top ‘00111000’ bcf Top,N ; В регистре Top ‘00011000’ N set 4 ; Директива MPASM bcf Top,N ; В регистре Top ‘00001000’ N set 3 ; Директива MPASM bcf Top,N ; В регистре Top ‘00000000’
Данная конструкция действительно будет нормально работать, ведь здесь нет вышеуказанного противоречия. Colorit В вашем случае же проще будет организовать одновременный опрос сразу 2 датчиков. Для этого достаточно считывать сразу весь порт и распихивать данные сразу в два разных регистра. У меня таким образом организован одновременным опрос сразу трех датчиков, и все работает без каких либо проблем. Вот вам и унификация программы. Для большего количества датчиков не пробовал пока, нет необходимости...
Пост N: 539
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг:
1
Фото:
Отправлено: 03.01.09 01:39. Заголовок: Alberto Именно здесь..
Alberto Именно здесь в твоем коде и кроется противоречие в подпрограмме Q_1. У тебя здесь должна прошится 2, при втором проходе компилятор переопределит константу и там будет portb,2. В первой части после сет 0 будет ноль, после сет (д+2) будет действительно 2. а вот после метки Q_1 будет тоже 2. Вот такая физика, компилятор не обманешь. Такое можно сморозить только программно перепрошивая память программ контроллера. В некоторых контроллерах такое возможно, но проще сделать как я сказал выше.
Пост N: 1090
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
3
Награды:
Отправлено: 03.01.09 02:58. Заголовок: Алексей пишет: Albe..
Алексей пишет:
цитата:
Alberto Именно здесь в твоем коде и кроется противоречие
я ж и говорю что лоханулся , просто я думал что MPLAB сам создаст два одинаковых куска кода с разными переменными (ведь понятно что всякие там имена/буковки только в MPLAB'е, а в МК нолики с единичками которые не меняются в процессе работы), но увы... нужно работать (набивать коды) ручками .
Пост N: 540
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг:
1
Фото:
Отправлено: 03.01.09 11:43. Заголовок: Да я в свое время то..
Да я в свое время тоже с этой директивой ковырялся, настолько было заманчиво дармовщинкой попользоваться, но увы, фокусы с ней не прокатывают. Хотя есть идейка, пофокусничать со стеком. Если у нас в стеке только 8 уровней, то почему бы его не расширить? Интересно прокатит доступ к стеку через косвенную адресацию?
Что касается терморегулятора, большое спасибо за совет Алексею! Производя инициализацию, а потом опрашивая сразу два датчика, я экономлю время на многокилометровых паузах. В таком варианте процедура опроса будет явно не в два раза длинее во времени. По теме директивы «SET» я очень признателен всем кто откликнулся. С большим вниманием и интересом я прочел все ответы. Причина которая меня толкнула к экспериментам над командой (BSF f,b) это попробовать гибкое управление символом «b». Согласно материалам самоучителя я могу поставить число которое соответствует номеру бита или название бита , присвоенное директивой EQU. Меня терзает мысль, а могу ли я в этом месте (вместо «b») использовать содержимое какого нибудь регистра. Именно содержимое регистра, а не его адрес. Попытки подставить на это место любой из регистов специального назначения с адресами от 00h до 06h дают положительный результат . К примеру : BSF PortA, 05 равносильна BSF PortA, PortA BSF PortA, 03 равносильна BSF PortA, Status и т. д. Я пробовал определить регистр общего назначения например (Top equ 10h), положить в него число 05 и прогнать в ЛАБе. Компилятор работает с числом 16=10h но никак ни с 05. Подскажите отсюда тоже нет никакого выхода? Честно говоря этот шаг у меня был первым. А вот на втором шаге я дошел до директивы «SET»
Все даты в формате GMT
3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет