Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте!
В ассемблере я новичок. Возник вопрос по поводу использования переменных на ассемблере. У меня подключены несколько датчиков 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.
Подскажите пожалуйста как улучшить алгоритм, чтобы не писать две разные процедуры под каждую ногу.
Заранее благодарен
В ассемблере я новичок. Возник вопрос по поводу использования переменных на ассемблере. У меня подключены несколько датчиков 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 в вопросах и ответах
Я бы не советовал вам директиву .set, вполне можно и без неё обойтись. Покажите код макроса.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Доброго времени суток, РадиоКоты.
В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает
.
В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
Код: Выделить всё
ldi Temp1,0
ldi Temp2,0
ldi Temp3,10
Loop: dec Temp1
brne Loop
dec Temp2
brne Loop
dec Temp3
brne LoopМне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а):Я бы не советовал вам директиву .set, вполне можно и без неё обойтись. Покажите код макроса.
Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Вот код:
Код: Выделить всё
.macro GET_TEMP
.set pin=@0 ; выставляем пин для использования в процедуре TEMP_PROC
.set mem=@1 ; а тут байт памяти куда сохранить значение температуры
push r16
push r17
rcall TEMP_PROC ; сама процедура
pop r17
pop r16
.endmRe: Ассемблер (ASM) для AVR в вопросах и ответах
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 или какую-то среду разработки которая Вам больше нравиться, и там прогнать этот код на отладке и увидеть как шаг за шагом все работает.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь. Переменные Temp2 и Temp3 - чистая "бутафория", так как не сохраняются. Вообще-то, если нужна программная задержка, то лучше написать макрос.kazaff писал(а):В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Ну тогда показывайте TEMP_PROC, короче то, где используется этот pin
Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает
Почему бесконечными? brne - переход, если предыдущая операция не вернула ноль (не установился флаг Z). Когда все переменные обнулятся цикл закончится.
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь.
Это почему не получишь? Какую надо, такую и получишь.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а):Какую надо, такую и получишь...
...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
Разумеется. Неужели ассемблер уже научился человеческие мысли понимать? "Дрыгни мне пятой ногой через... эээ... минуту и 35 секунд!"
Время такта можно заранее посчитать, константами например.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а):Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Ну тогда показывайте TEMP_PROC, короче то, где используется этот pin
Вот TEMP_PROC:
Код: Выделить всё
TEMP_PROC:
sbi ddr,pin
cbi port,pin
WaitUS 220
sbi port,pin
cbi ddr,pin
WaitUS 220
;===============Writing
ldi r17,0xCC
rcall WRITE_CMD
ldi r17,0x4e
rcall WRITE_CMD
ldi r17,0x00
rcall WRITE_CMD
ldi r17,0x00
rcall WRITE_CMD
ldi r17,0b00011111
rcall WRITE_CMD
sbi ddr,pin
cbi port,pin
WaitUS 220
sbi port,pin
cbi ddr,pin
WaitUS 220
ldi r17,0xCC
rcall WRITE_CMD
ldi r17,0x44
rcall WRITE_CMD
WaitMS 150
;=================reset
sbi ddr,pin
cbi port,pin
WaitUS 220
sbi port,pin
cbi ddr,pin
WaitUS 220
ldi r17,0xCC
rcall WRITE_CMD
ldi r17,0xBE
rcall WRITE_CMD
WaitUS 5
rcall READ_DATA
;===============
retи WRITE_CMD
Код: Выделить всё
WRITE_CMD:
push r19
ldi r19,8
wr_st:
lsr r17
brcs wr_one
rjmp wr_zero
wr_one:
WRITE_1 pin
rjmp wr_fin
wr_zero:
WRITE_0 pin
wr_fin:
dec r19
brne wr_st
pop r19
ret
где WRITE_0 и WRITE_1 выглядят так
Код: Выделить всё
macro WRITE_0
push r16
sbi ddr,@0
cbi port,@0
WaitUS 26
sbi port,@0
cbi ddr,@0
WaitUS 1
pop r16
.endm
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мда... вкурить тяжело. Я при мерно понял, что нужно, попробуйте так (пример из готового проекта)
Настроив верхнюю часть, дальше рассчитывается всё автоматически. Главное посмотреть в .inc файле контроллера, на сколько отличаются PORT, PIN, DDR (они там определены тоже как константы)
Код: Выделить всё
.equ led_auto_port = PORTD ; порт светодиода "AUTO"
.equ led_uart_port = PORTD ; порт светодиода "UART"
...
.equ btn_auto_port = PORTD ; порт кнопки "AUTO"
.equ btn_uart_port = PORTD ; порт кнопки "UART"
...
.equ led_auto_bit = 4 ; бит светодиода "AUTO"
.equ led_uart_bit = 3 ; бит светодиода "UART"
...
.equ btn_auto_bit = 6 ; бит кнопки "AUTO"
.equ btn_uart_bit = 5 ; бит кнопки "UART"
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.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 (они там определены тоже как константы)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот для примера макрос опроса кнопки из того-же проекта:
Код: Выделить всё
.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:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А мне так никто и не помог 
А проблема то пустяковая...
А проблема то пустяковая...
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а):Это почему не получишь? Какую надо, такую и получишь.
... делать задержку таким способом - удел мазохистов.
... тому подтверждение..в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.ploop писал(а):Какую надо, такую и получишь...
...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
... а в отладчике самому проверить нельзя?ЮТ писал(а):А мне так никто и не помог
А проблема то пустяковая...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Аэто как?...
Я пару дней только живу в авр студио...
Я пару дней только живу в авр студио...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
делать задержку таким способом - удел мазохистов.
Ёш твою медь, а константы и макросы на что?
Или в обучалку добавить аналогию RTOS на таймерах и прерываниях?
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop писал(а):Ёш твою медь, а константы и макросы на что?
... просто нужно читать внимательней
... а в приводимом примере макросов и духу нет.......ChipKiller писал(а):Вообще-то, если нужна программная задержка, то лучше написать макрос.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ЮТ писал(а):Аэто как?...
Я пару дней только живу в авр студио...
Debug - Start debbuging. (или Ctrl+shift+alt+f5). и потом каждый шаг - f11.
to ploop
Пробовал таким методом, но не получаеться. пока просто создал вложенные макросы, и поместил в процедуры, чтобы не засорять программу.
Код: Выделить всё
temp_home:
GET_TEMP PB4,t_room
ret
temp_heater:
GET_TEMP PB5,t_heater
ret
Re: Ассемблер (ASM) для AVR в вопросах и ответах
... а в приводимом примере макросов и духу нет.......
Ааа, виноват, просмотрел.
Но для обучалки это лишнее. Если чел поймёт, как работает задержка, то без проблем напишет макрос (или намучается с отладкой, потом догадается)