Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
nopal
Родился
Сообщения: 12
Зарегистрирован: Пн мар 08, 2010 14:16:51

Сообщение nopal »

Здравствуйте!
В ассемблере я новичок. Возник вопрос по поводу использования переменных на ассемблере. У меня подключены несколько датчиков 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.
Подскажите пожалуйста как улучшить алгоритм, чтобы не писать две разные процедуры под каждую ногу.
Заранее благодарен
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Я бы не советовал вам директиву .set, вполне можно и без неё обойтись. Покажите код макроса.
Аватара пользователя
kazaff
Родился
Сообщения: 4
Зарегистрирован: Вс мар 27, 2011 09:22:49

Re: Ассемблер (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

Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает :( .
nopal
Родился
Сообщения: 12
Зарегистрирован: Пн мар 08, 2010 14:16:51

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nopal »

ploop писал(а):Я бы не советовал вам директиву .set, вполне можно и без неё обойтись. Покажите код макроса.


Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.

Вот код:

Код: Выделить всё

.macro GET_TEMP

 .set pin=@0    ; выставляем пин для использования в процедуре TEMP_PROC
 .set mem=@1 ; а тут байт памяти куда сохранить значение температуры

 push r16
 push r17

 rcall TEMP_PROC ; сама процедура

 pop r17
 pop r16
.endm
nopal
Родился
Сообщения: 12
Зарегистрирован: Пн мар 08, 2010 14:16:51

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nopal »

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 в вопросах и ответах

Сообщение ChipKiller »

kazaff писал(а):В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь. Переменные Temp2 и Temp3 - чистая "бутафория", так как не сохраняются. Вообще-то, если нужна программная задержка, то лучше написать макрос.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.

Ну тогда показывайте TEMP_PROC, короче то, где используется этот pin

Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает

Почему бесконечными? brne - переход, если предыдущая операция не вернула ноль (не установился флаг Z). Когда все переменные обнулятся цикл закончится.

пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь.

Это почему не получишь? Какую надо, такую и получишь.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

ploop писал(а):Какую надо, такую и получишь...

...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

.в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.

Разумеется. Неужели ассемблер уже научился человеческие мысли понимать? "Дрыгни мне пятой ногой через... эээ... минуту и 35 секунд!" :)

Время такта можно заранее посчитать, константами например.
nopal
Родился
Сообщения: 12
Зарегистрирован: Пн мар 08, 2010 14:16:51

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nopal »

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

Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Мда... вкурить тяжело. Я при мерно понял, что нужно, попробуйте так (пример из готового проекта)

Код: Выделить всё

.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 (они там определены тоже как константы)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Вот для примера макрос опроса кнопки из того-же проекта:


Код: Выделить всё

.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:
Аватара пользователя
ЮТ
Вымогатель припоя
Сообщения: 623
Зарегистрирован: Чт июн 11, 2009 07:25:24
Откуда: СПб

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ЮТ »

А мне так никто и не помог :(
А проблема то пустяковая...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

ploop писал(а):Это почему не получишь? Какую надо, такую и получишь.

... делать задержку таким способом - удел мазохистов.
..в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
ploop писал(а):Какую надо, такую и получишь...

...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
... тому подтверждение :))) . а если поменялась частота кварца или нужно изменить задержку - считать "ручками" заново?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

ЮТ писал(а):А мне так никто и не помог :(
А проблема то пустяковая...
... а в отладчике самому проверить нельзя?
Аватара пользователя
ЮТ
Вымогатель припоя
Сообщения: 623
Зарегистрирован: Чт июн 11, 2009 07:25:24
Откуда: СПб

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ЮТ »

Аэто как?...
Я пару дней только живу в авр студио...
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

делать задержку таким способом - удел мазохистов.

Ёш твою медь, а константы и макросы на что?
Или в обучалку добавить аналогию RTOS на таймерах и прерываниях?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

ploop писал(а):Ёш твою медь, а константы и макросы на что?

... просто нужно читать внимательней
ChipKiller писал(а):Вообще-то, если нужна программная задержка, то лучше написать макрос.
... а в приводимом примере макросов и духу нет.......
nopal
Родился
Сообщения: 12
Зарегистрирован: Пн мар 08, 2010 14:16:51

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение nopal »

ЮТ писал(а):Аэто как?...
Я пару дней только живу в авр студио...

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

Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

... а в приводимом примере макросов и духу нет.......

Ааа, виноват, просмотрел.
Но для обучалки это лишнее. Если чел поймёт, как работает задержка, то без проблем напишет макрос (или намучается с отладкой, потом догадается)
Ответить

Вернуться в «AVR»