Зарегистрирован: Пн мар 08, 2010 14:16:51 Сообщений: 12
Рейтинг сообщения:0
Здравствуйте! В ассемблере я новичок. Возник вопрос по поводу использования переменных на ассемблере. У меня подключены несколько датчиков DS18b20, один на ноге PB2, другой на ноге PB3. Нужно считать сначала с одной ноги, потом со второй. Есть макрос считывания температуры, GET_TEMP, где переменная @0 это нога. то есть GET_TEMP PB3 - считать температуру с PB3. Внутри макроса: .... .set pin=@0 ; пытаюсь установить значение переменной пин на текущее значение переданное в макрос, чтобы потом ; использовать в процедуре rcall TEMP_PROC - само измерение, где производятся операции с текущей ножкой вроде sbi PORTC,pin .... Дело в том что значение pin не меняется, а остается то, которое последний раз упоминалось в коде. То есть если код ....... GET_TEMP PB3 GET_TEMP PB2 ....... То считывается оба раза с PB2. Подскажите пожалуйста как улучшить алгоритм, чтобы не писать две разные процедуры под каждую ногу. Заранее благодарен
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2011 10:36:08
Родился
Зарегистрирован: Пн мар 08, 2010 14:16:51 Сообщений: 12
Рейтинг сообщения:0
ploop писал(а):
Я бы не советовал вам директиву .set, вполне можно и без неё обойтись. Покажите код макроса.
Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Вот код:
Код:
.macro GET_TEMP
.set pin=@0 ; выставляем пин для использования в процедуре TEMP_PROC .set mem=@1 ; а тут байт памяти куда сохранить значение температуры
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2011 10:44:43
Родился
Зарегистрирован: Пн мар 08, 2010 14:16:51 Сообщений: 12
Рейтинг сообщения:0
kazaff писал(а):
Доброго времени суток, РадиоКоты.
В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
Код:
ldi Temp1,0 ldi Temp2,0 ldi Temp3,10
Loop: dec Temp1 brne Loop
dec Temp2 brne Loop
dec Temp3 brne Loop
Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает .
Код:
ldi Temp1,0 ldi Temp2,0 ; загружаем значения в регистры ldi Temp3,10
Loop: dec Temp1 ; уменьшаем значение Temp1 на 1. Если там ноль то 0-1=255, тогда крутимся тут ещё 255 раз brne Loop ; условный переход - если значение в temp1 не равно нулю, то переходим к метке Loop.
dec Temp2 ; тоже самое brne Loop
dec Temp3 ; и тут. но когда в temp3 будет ноль - программа выйдет из цикла. brne Loop
Советую скачать AVRstudio или какую-то среду разработки которая Вам больше нравиться, и там прогнать этот код на отладке и увидеть как шаг за шагом все работает.
В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь. Переменные Temp2 и Temp3 - чистая "бутафория", так как не сохраняются. Вообще-то, если нужна программная задержка, то лучше написать макрос.
Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Ну тогда показывайте TEMP_PROC, короче то, где используется этот pin
Цитата:
Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает
Почему бесконечными? brne - переход, если предыдущая операция не вернула ноль (не установился флаг Z). Когда все переменные обнулятся цикл закончится.
Цитата:
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь.
Это почему не получишь? Какую надо, такую и получишь.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2011 13:55:07
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19640 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
ploop писал(а):
Какую надо, такую и получишь...
...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2011 14:05:46
Родился
Зарегистрирован: Пн мар 08, 2010 14:16:51 Сообщений: 12
Рейтинг сообщения:0
ploop писал(а):
Цитата:
Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Ну тогда показывайте TEMP_PROC, короче то, где используется этот pin
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .equ led_auto_ddr = led_auto_port-1 ; А вот так вычисляем DDR .equ led_uart_ddr = led_uart_port-1 .. .equ led_prog_pin = led_prog_port-2 ; А так PIN .equ led_auto_pin = led_auto_port-2 ...
Настроив верхнюю часть, дальше рассчитывается всё автоматически. Главное посмотреть в .inc файле контроллера, на сколько отличаются PORT, PIN, DDR (они там определены тоже как константы)
Вот для примера макрос опроса кнопки из того-же проекта:
Код:
.MACRO test_uart_btn sbic btn_uart_pin, btn_uart_bit rjmp ml07 ; пропуск, если бит не установлен (кн. нажата) inc r_btn_uart ; если нажата - увеличиваем счетчик mov tr0,r_btn_uart cpi tr0, btn_delay ; счетчик досчитал? brne ml07 ; если нет - уходим clr r_btn_uart ; если да - сбрасываем счетчик ori r_btn_press,(1<<BUF_flag) ; устанавливаем флаг нажатия ori r_tasks,(1<<BUT_flag) ; устанавливаем флаг действия rjmp ml08 ml07: ; кнопка не нажата или нажатие отработано sbrs r_btn_press,BUF_flag ; проверяем, установлен ли флаг нажатия rjmp ml08 clr r_btn_uart ; если да, сбрасываем счетчик sbis btn_uart_pin, btn_uart_bit ; проверяем снова кнопку rjmp ml08 ; если нажата - выходим andi r_btn_press,~(1<<BUF_flag) ; если нет - сбрасываем бит нажатия ml08:
... а в приводимом примере макросов и духу нет.......
Ааа, виноват, просмотрел. Но для обучалки это лишнее. Если чел поймёт, как работает задержка, то без проблем напишет макрос (или намучается с отладкой, потом догадается)
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения