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

Обсуждаем контроллеры компании Atmel.
Ответить
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

SBI - дословно - "Set Bit I/O",это ИЛИ между значением в адресе и константой
SBI PORTC, 3 - означает Установить 3-й Бит РВВ портС, где вместо "PORTC",на самом деле компилятор подставит константу-адрес порта и вместо 3 на самом деле подставит (1<<3)

В случае если вы хотите переменную загонять в порт,то есть такие команды IN/OUT.
Допустим в R16 храним переменную - желаемое значение,которое должно попасть на ноги контроллера,
Делаем так:
OUT PORTC, R16 ;дословно: скопировать нафиг наружу из РОН r16 в РВВ портС
Если нужно с ножек что-то прочесть в РОН16,то делаем наоборот:
IN R16,PORTC
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15790
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

vek писал(а): OUT PORTC, R16 ;дословно: скопировать нафиг наружу из РОН r16 в РВВ портС
Если нужно с ножек что-то прочесть в РОН16,то делаем наоборот:
IN R16,PORTC
Насколько склероз не изменяет "с ножек что-то прочесть" в данном случае будет in r16,PINC
8)
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Ой :oops: Ну,да :oops:
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Мучитель микросхем
Аватара пользователя
Сообщения: 444
Зарегистрирован: Вс ноя 28, 2010 15:18:52
Откуда: Минск

Сообщение ANALOG »

vek писал(а):SBI PORTC, 3 - означает Установить 3-й Бит РВВ портС, где вместо "PORTC",на самом деле компилятор подставит константу-адрес порта и вместо 3 на самом деле подставит (1<<3)
Ну вообще-то не совсем так, вместо PORTC компилятор на самом деле подставит адрес, а вот 3 так и запишет, ничего вместо нее не подставляя, вот кусок из assembler help'а: :write:

16-bit Opcode:
1001 1010 AAAA Abbb

где
10011010 - уникальный ID команды
ААААА - та самая константа-адрес порта
bbb - номер бита

видим, что под номер бита выделено всего три бита в коде команды (что логично, т.к. 8 было бы избыточно), поэтому туда запишется именно номер бита, а не результат сдвига (1 << 3), который занял бы 8 бит в коде.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 2
Зарегистрирован: Вт ноя 19, 2013 17:00:12
Откуда: Челябинская область

Сообщение Ванюшка »

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

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

;Мой код

.include "m8535def.inc" ;Подключение библиотеки контроллера AVR ATMega8535
.cseg                   ;Начало сегмента кода
.org 0                  ;Начальный адрес программы

;Инициализация портов
ldi r16,$00
ldi r17,$FF
out DDRA,r16            ;Порт A на ввод
out DDRC,r17            ;Порт C на вывод
out PORTA,r17           ;Устанавливаем подтягивающий резистор на порт А

;Основная программа
main:
 in r16,PINA
 mov r17,r16
 mov r18,r16
 andi r16,$08             ;Выделение РА3 в r16
 andi r17,$10             ;Выделение РА4 в r17
 andi r18,$20             ;Выделение РА5 в r18
 ;Сдвигаем все переменные на 3-ий бит
 lsr r18
 lsr r18
 lsr r17
 mov r19,r16              ;Копирование значения из регистра r16, в регистр r19
 and r19,r17              ;Выполняется логическое умножение (and - и) r19=r19*r17
 andi r19,$08               
 com r19                ;Выполняется инверсия значения записанного в регистре r19
 andi r19,$08
 or r19,r18             ;Выполняется логическое сложение r19=r19+r18
 andi r19,$08
 ;Сдвигаем значение регистра r19 на 3 бита вправо
 lsr r19                ;
 lsr r19                ;
 lsr r19                ;
 out PORTC,r19          ;Вывод результата из регистра r19 на порт C
 rjmp main              ;Возвращение на метку main
У меня почему-то "0" на выходе только в одном случае: PA3 - "1", PA4 - "1", PA5 - "0". Во всех остальных случаях PC0 - "1"
Если в коде есть "тупейшие" ошибки, не судите меня строго, это моя первая программа.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

У меня почему-то "0" на выходе только в одном случае: PA3 - "1", PA4 - "1", PA5 - "0". Во всех остальных случаях PC0 - "1"
Все правильно, так и должно быть.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Не "почему-то", а так и должно быть. Вы таблицу истинности-то составьте. :))
Docendo discimus
Контактная информация:
Родился
Сообщения: 19
Зарегистрирован: Вс окт 27, 2013 14:07:37

Сообщение Black_Wolf »

Ванюшка писал(а): У меня почему-то "0" на выходе только в одном случае: PA3 - "1", PA4 - "1", PA5 - "0". Во всех остальных случаях PC0 - "1"
Если в коде есть "тупейшие" ошибки, не судите меня строго, это моя первая программа.
Изображение
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

вот так проще наверное в Вашем случае?

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

.equ Input = ((1<<PA3)|(1<<PA4)|(1<<PA5))
.equ Condition = ((1<<PA3)|(1<<PA4))
.equ Output = PORTC

loop:
	in	r16, PINA
	andi	r16, Input
	cpi	r16, Condition
	breq	set_to_zero
	sbi	Output, 0
	rjmp	loop
set_to_zero:
	cbi	Output, 0
	rjmp	loop
Ставим плюсы: )
Родился
Сообщения: 2
Зарегистрирован: Вт ноя 19, 2013 17:00:12
Откуда: Челябинская область

Сообщение Ванюшка »

Всем огромнейшее СПАСИБО. Я не правильно высчитывал таблицу истинности. :oops:
ibiza11 спасибо за код, в котором, я хотя многих инструкций еще не знаю и приемов не понимаю, т.к. я только-только начинающий, думаю разобраться.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

есть некая незамысловатая ф-ция :))

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

;*************************************************************************
; delay half period
; For I2C in normal mode (100kHz), use T/2 > 5us
; For I2C in fast mode (400kHz),   use T/2 > 1.3us
;*************************************************************************
	.stabs	"",100,0,0,i2c_delay_T2
	.stabs	"i2cmaster.S",100,0,0,i2c_delay_T2
	.func i2c_delay_T2	; delay 5.0 microsec with 4 Mhz crystal	
i2c_delay_T2:        ; 4 cycles
	rjmp 1f      ; 2   "
1:	rjmp 2f      ; 2   "
2:	rjmp 3f      ; 2   "
3:	rjmp 4f      ; 2   "
4:	rjmp 5f      ; 2   "
5: 	rjmp 6f      ; 2   "
6:	nop          ; 1   "
	ret          ; 3   "
	.endfunc     ; total 20 cyles = 5.0 microsec with 4 Mhz crystal 


;*************************************************************************
что значат данные строки ?

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

.stabs	"",100,0,0,i2c_delay_T2
.stabs	"i2cmaster.S",100,0,0,i2c_delay_T2
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

В AVR-ассемблере встроенном в студию (4) я таких директив не видел...
7.54 .stabd, .stabn, .stabs
Эти три директивы, начинающиеся с .stab, формируют символы (смотрите главу 5 "Символы") для использования их в символических отладчиках. Эти символы не входят в hash-таблицу as: на них не может быть как-либо ссылок в исходном файле
источник
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

почему в выше нриведенной ф-ции написано так

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

1:
2:
3:
а не

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

1f:
2f:
3f:
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Фиг его знает, нужно читать хелп к этому ассемблеру. Может быть из-за того, что это какая-то функция (похожа на макрос в обычном AVR-ассемблере) и суффикс f стоит как указатель на то, что это не абсолютная метка, а метка в конкретно этой функции.
Короче нужно выяснить что это за ассемблер, а там видно будет...
Друг Кота
Аватара пользователя
Сообщения: 15790
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

похоже на самодельно определенные макросы...
только вот явно не avrasm... :shock:
предположительно
rjmp 2f обращается к выполнению какого-то фрагмента 2f(1f,3f,4f,5f), которого в вышеприведенном тексте нету... а чего в тех фрагментах нарисовано, только их автору ведомо.
текущие метки 1: и иже сними отношение к 1f и остальным имеют через пока неведомый кусочек.
или определение "локальной метки" (у каждого компилятора по-своему) :roll:
А чего на самом деле только справка по тому компилятору поможет.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Сообщение ploop »

похоже на самодельно определенные макросы...
Я бы сказал больше похоже на листинг какого-то компилятора...
Родился
Сообщения: 2
Зарегистрирован: Пн дек 02, 2013 20:30:52

Сообщение tohafox »

Помогите решить простые задачки на ассемблере (типо лабораторная работа)
1) Задать 9 однобайтовых чисел расположенных в EEPROM, начиная с адреса 0x0B05. Найти отрицательные элементы массива и записать их в ОЗУ начиная с адреса 0x0D99. Для адресации использовать индексные регистры.


2) Произвести вычисление следующего выражения R=4*x2*x3+x1^4-3*x3 операнды целые однобайтные числа находящиеся в ОЗУ, начиная с адреса 0x0220. Результат заносится в память, начиная с адреса 0x0228.


3) К порту B подключено 8 светодиодов. Необходимо включить 0 и 1 биты на 0,2 мс, выключить их на 0,1 мс, снова включить их на 0,3 мс и выключить.

По идее все элементарно...
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

tohafox писал(а):По идее все элементарно...
Я тоже так думаю.
Все будет только лучше, в крайнем случае - хуже.
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Сообщение SmarTrunk »

tohafox
Напишите, что получилось, мы Вас поправим, если что.
Ответить

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