реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Присваивание имени биту порта на ASM
Turnaev Sergey
сообщение Jan 24 2008, 15:34
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Только начал осваивать AVR.

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

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

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

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

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

Как всё-таки присвоить имя биту?


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jan 24 2008, 15:55
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



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

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

.equ ТХС=6


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 24 2008, 16:30
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



AVRASM2 поддерживает сишныйе директивы препроцессора. Так что можно применять #define Name PORTA,5
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Jan 24 2008, 17:53
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Цитата(=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


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 24 2008, 18:35
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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


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

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


Используется например при совтовом ШИМовании и других операциях, когда данные по портам просчитываются какое-то время и собираются в образе портов, а образы портов выводятся в порт по таймеру.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 25 2008, 09:43
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(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; иначе, снова на опрос кнопки
  ....


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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Wild007
сообщение Jan 25 2008, 09:57
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Вот пример моего определения выводов порта:

Код
;**************** Определение портов:*******************************
; порт 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


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
Guest_=VRA=_*
сообщение Jan 25 2008, 10:51
Сообщение #8





Guests






Чтобы не путать теплое с мягким, нужно раз и навсегда запомнить следующее:

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

#define Name PORTA,5 - текстовая подстановка, после которой команда sbi NAME будет трактоваться как sbi PORTA,5, что в этом конкретном случае автору корневого поста и требовалось.
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Jan 25 2008, 13:01
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Так, теперь понятно:
.equ KeyLine = 7 по сути является присваиванием имени константе, и никак не связано с конкретным битом ОЗУ.

Всем спасибо за ответы. beer.gif


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
Guest_=VRA=_*
сообщение Jan 25 2008, 15:49
Сообщение #10





Guests






Цитата
.equ KeyLine = 7 по сути является присваиванием имени константе
Строго наоборот - объявлением (созданием) символического имени _И_ присвоением ему численного значения
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Jan 25 2008, 17:00
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088



Цитата(=VRA= @ Jan 25 2008, 21:49) *
Строго наоборот - объявлением (созданием) символического имени _И_ присвоением ему численного значения

Хм, да так будет точнее. Спасибо.


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
CDT
сообщение Jan 26 2008, 11:42
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



А я так делаю в отдельном месте или файле настроек:

Код
;===  Светодиод                
#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


Легко перестраиваться, если светодиод по портам или кристалам бегать начал


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016