Страница 80 из 400

Добавлено: Сб мар 26, 2011 22:24:27
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.
Подскажите пожалуйста как улучшить алгоритм, чтобы не писать две разные процедуры под каждую ногу.
Заранее благодарен

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

Добавлено: Вс мар 27, 2011 08:53:22
ploop
Я бы не советовал вам директиву .set, вполне можно и без неё обойтись. Покажите код макроса.

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

Добавлено: Вс мар 27, 2011 10:09:25
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
Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает :( .

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

Добавлено: Вс мар 27, 2011 10:36:08
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

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

Добавлено: Вс мар 27, 2011 10:44:43
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 или какую-то среду разработки которая Вам больше нравиться, и там прогнать этот код на отладке и увидеть как шаг за шагом все работает.

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

Добавлено: Вс мар 27, 2011 12:46:50
ChipKiller
kazaff писал(а):В статье Обучалки Бегущий огонек v1.0 приводится пример задержки с использование такого цикла:
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь. Переменные Temp2 и Temp3 - чистая "бутафория", так как не сохраняются. Вообще-то, если нужна программная задержка, то лучше написать макрос.

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

Добавлено: Вс мар 27, 2011 13:48:02
ploop
Я как раз об этом, но ничего кроме как вложения макросов в макрос не приходит. Но тогда как я представляю, так как макрос вставляется прямо в код, будет весьма громоздко.
Ну тогда показывайте TEMP_PROC, короче то, где используется этот pin
Мне, как паскальщику, этоти циклы кажутся бесконечными, объясните как оно работает, пиво уже не помогает
Почему бесконечными? brne - переход, если предыдущая операция не вернула ноль (не установился флаг Z). Когда все переменные обнулятся цикл закончится.
пример ИМХО не совсем удачный, потому что точную задержку с его помощью не получишь.
Это почему не получишь? Какую надо, такую и получишь.

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

Добавлено: Вс мар 27, 2011 13:55:07
Gudd-Head
ploop писал(а):Какую надо, такую и получишь...
...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.

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

Добавлено: Вс мар 27, 2011 14:01:02
ploop
.в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
Разумеется. Неужели ассемблер уже научился человеческие мысли понимать? "Дрыгни мне пятой ногой через... эээ... минуту и 35 секунд!" :)

Время такта можно заранее посчитать, константами например.

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

Добавлено: Вс мар 27, 2011 14:05:46
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


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

Добавлено: Вс мар 27, 2011 14:58:44
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 (они там определены тоже как константы)

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

Добавлено: Вс мар 27, 2011 15:00:44
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:

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

Добавлено: Вс мар 27, 2011 15:05:46
ЮТ
А мне так никто и не помог :(
А проблема то пустяковая...

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

Добавлено: Вс мар 27, 2011 15:12:30
ChipKiller
ploop писал(а):Это почему не получишь? Какую надо, такую и получишь.
... делать задержку таким способом - удел мазохистов.
..в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
ploop писал(а):Какую надо, такую и получишь...
...в машинных тактах. А уже зная частоту, на котором работает МК, можно задержку перевести в секунды.
... тому подтверждение :))) . а если поменялась частота кварца или нужно изменить задержку - считать "ручками" заново?

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

Добавлено: Вс мар 27, 2011 15:14:35
ChipKiller
ЮТ писал(а):А мне так никто и не помог :(
А проблема то пустяковая...
... а в отладчике самому проверить нельзя?

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

Добавлено: Вс мар 27, 2011 15:15:32
ЮТ
Аэто как?...
Я пару дней только живу в авр студио...

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

Добавлено: Вс мар 27, 2011 15:20:54
ploop
делать задержку таким способом - удел мазохистов.
Ёш твою медь, а константы и макросы на что?
Или в обучалку добавить аналогию RTOS на таймерах и прерываниях?

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

Добавлено: Вс мар 27, 2011 15:25:06
ChipKiller
ploop писал(а):Ёш твою медь, а константы и макросы на что?
... просто нужно читать внимательней
ChipKiller писал(а):Вообще-то, если нужна программная задержка, то лучше написать макрос.
... а в приводимом примере макросов и духу нет.......

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

Добавлено: Вс мар 27, 2011 15:30:10
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


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

Добавлено: Вс мар 27, 2011 15:33:20
ploop
... а в приводимом примере макросов и духу нет.......
Ааа, виноват, просмотрел.
Но для обучалки это лишнее. Если чел поймёт, как работает задержка, то без проблем напишет макрос (или намучается с отладкой, потом догадается)