Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Присваивание имени биту порта на ASM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Turnaev Sergey
Только начал осваивать AVR.

Итак проблема:
Не получается присвоить имя биту порта, с байтом всё нормально, а вот биту - никак.

Пробовал делать по аналогии с 51:

.equ NAME=PORTA0
после этого команды sbi и cbi выдают ошибку, дескать слишком много аргументов.

.equ NAME=PORTA,0
а так - директива equ ругается на неожиданную запятую.

В документации как ни странно, ничего вразумительного не нашел.

Как всё-таки присвоить имя биту?
=GM=
Цитата(Turnaev Sergey @ Jan 24 2008, 15:34) *
Не получается присвоить имя биту порта, с байтом всё нормально, а вот биту - никак

Попробуйте вот так

.equ ТХС=6
Qwertty
AVRASM2 поддерживает сишныйе директивы препроцессора. Так что можно применять #define Name PORTA,5
Turnaev Sergey
Цитата(=GM= @ Jan 24 2008, 21:55) *
Попробуйте вот так

.equ ТХС=6

Насколько я понял под TXC вы подразумеваете имя, а 6 - бит. Не понятно как ассемблер определит какому регистру принадлежит этот бит, кстати в inc файлах делают также как вы:
.equ PORTA1 = 1 ; Port A Data Register bit 1
Поясните, пожалуйста.


Цитата(Qwertty @ Jan 24 2008, 22:30) *
AVRASM2 поддерживает сишныйе директивы препроцессора. Так что можно применять #define Name PORTA,5

Ваш способ работает, спасибо. biggrin.gif
SasaVitebsk
Цитата(Turnaev Sergey @ Jan 24 2008, 21:53) *
Не понятно как ассемблер определит какому регистру принадлежит этот бит, кстати в inc файлах делают также как вы:
.equ PORTA1 = 1 ; Port A Data Register bit 1
Поясните, пожалуйста.


А он и не связан с портом. После х51 я тоже страдал, а потом выяснил, что это можно даже использовать. Редко правда.

например
in xPortA,PORTA
sbrs xPorta, RTS


Используется например при совтовом ШИМовании и других операциях, когда данные по портам просчитываются какое-то время и собираются в образе портов, а образы портов выводятся в порт по таймеру.
haker_fox
Цитата(Turnaev Sergey @ Jan 25 2008, 01:53) *
Насколько я понял под TXC вы подразумеваете имя, а 6 - бит. Не понятно как ассемблер определит какому регистру принадлежит этот бит

Бит может принадлежать любому регистру.
Ведь символическое имя бита, в данном примере TXC, это всего лишь номер разряда, в нашем случае 6.
Разряд 6 может также принадлежать любому регистру, а вот с каким именно работать, указывает программист.

Например:
Код
.equ KeyLine = 7

  ....
cbi DDRA, KeyLine; настроить линию порта, к которой подключена кнопка, на вход

_scan_key:
  sbic PINA, KeyLine; если кнопку нажали, то на линии лог. 0, пропустить одну команду и идти дальше
  rjmp _scan_key; иначе, снова на опрос кнопки
  ....


Как видите, один и тот же бит используется для разных регистров. И это очень удобно. Разумеется это лишь частный случай, бит может использоваться и для одного регистра.
Wild007
Вот пример моего определения выводов порта:

Код
;**************** Определение портов:*******************************
; порт D
.equ CONTROL    = PORTD    ; ПОРТ ВЫВОДА УПРАВЛЯЮЩИХ СИГНАЛОВ
.equ CONTROL_DIR    = CONTROL-1; ПОРТ ВЫВОДА УПРАВЛЯЮЩИХ СИГНАЛОВ
.equ CONTROL_IN    = CONTROL-2; ПОРТ ЧТЕНИЯ УПРАВЛЯЮЩИХ СИГНАЛОВ
;.equ TCS    = 0    ; выход сигнала выбора микросхемы памяти
;.equ T45    = 1    ; вход сигнала BUSY от микросхемы памяти
.equ UCS    = 2    ; выход выбора источника для данных (0 -- PDIUSB, 1 -- LCD)  
.equ UIN    = 3    ; вход сигнала прераывния от PDIUSB
.equ URD    = 4    ; выход строба чтения для PDIUSB
.equ UWR    = 5    ; выход строба записи для PDIUSB
.equ UA0    = 6    ; выход сигнала управления для PDIUSB
=VRA=
Чтобы не путать теплое с мягким, нужно раз и навсегда запомнить следующее:

.equ - численное присваивание, поэтому .equ NAME = PORTA.0 не имеет смысла, т.к. PORTA.0 не может быть выражено одним числом. Кроме того, синтаксически сама конструкция PORTA.0 некорректна для AVR Assembler(2).

#define Name PORTA,5 - текстовая подстановка, после которой команда sbi NAME будет трактоваться как sbi PORTA,5, что в этом конкретном случае автору корневого поста и требовалось.
Turnaev Sergey
Так, теперь понятно:
.equ KeyLine = 7 по сути является присваиванием имени константе, и никак не связано с конкретным битом ОЗУ.

Всем спасибо за ответы. beer.gif
=VRA=
Цитата
.equ KeyLine = 7 по сути является присваиванием имени константе
Строго наоборот - объявлением (созданием) символического имени _И_ присвоением ему численного значения
Turnaev Sergey
Цитата(=VRA= @ Jan 25 2008, 21:49) *
Строго наоборот - объявлением (созданием) символического имени _И_ присвоением ему численного значения

Хм, да так будет точнее. Спасибо.
CDT
А я так делаю в отдельном месте или файле настроек:

Код
;===  Светодиод                
#define bLed 2
#define prt_Led portC,bLed
#define ddr_Led ddrC,bLed
#define pin_Led pinC,bLed


А потом:
Код
sbi ddr_Led
cbi prt_Led

sbis pin_Led


Легко перестраиваться, если светодиод по портам или кристалам бегать начал
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.