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

Обсуждаем контроллеры компании Atmel.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Наверно не использовали две подряд идущие SBI на контроллере с тактовой частотой в 20Мгц, наверно емкость монтажа уже может привести к такому эффекту что напряжение на первом выводе не успеет изменится к моменту выполнения второй команды, это же всего какая-то сотня наносекунд...

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

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

Сообщение ploop »

Ну вот передо мной девайс (часы) год уже тикают. 20МГц, сдвиговые регистры, общая длина дорожки на входы сдвига более 30см (зигзагом). Работают. Фронт не затянут, вероятно, индуктивность дорожки больше проявляется, чем ёмкость.

Хотя там и нет двух подряд SBI... Но в любом случае я разделял любые самые короткие действия с портами NOP'ами.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вообще-то это рекомендуется DS
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Insert nop for synchronization*/
_NOP();
/* Read port pins */
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Подскажите как записать в EEPROM тиньки 2313, 4 байта подряд.
Забиваем адрес нулевой ячейку памяти.
Пишим байт, ждем пока запишится.
Далее пишим второй байт?
Или нужно указывать для него адрес?

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

; Притопали из условия по метке Write, запоминать регистры R23,R24,R25,R26
Write:
   LDI    R16,0         ; Загружаем адрес нулевой ячейки
   LDI    R17,0         ; EEPROM
   RCALL    EEWrite       ; вызываем процедуру записи.
   ret

EEWrite:   
   SBIC   EECR,EEWE      ; Ждем готовности памяти к записи. Крутимся в цикле
   RJMP   EEWrite       ; до тех пор пока не очистится флаг EEWE
                      
   OUT    EEARL,R16       ; Загружаем адрес нужной ячейки
   OUT    EEARH,R17        ; старший и младший байт адреса
   OUT    EEDR,R23       ; и сами данные, которые нам нужно загрузить
 
   SBI    EECR,EEMWE      ; взводим предохранитель
   SBI    EECR,EEWE      ; записываем байт
         
      ДАЛЕЕ МОЖНО ТАК?, ИЛИ Я СИЛЬНО ПРИВЫК К СТЕКОВЫМ ИЗВРАТАМ? ))
       
          OUT    EEDR,R24       ; и сами данные, которые нам нужно загрузить
 
   SBI    EECR,EEMWE      ; взводим предохранитель
   SBI    EECR,EEWE      ; записываем байт

          OUT    EEDR,R25       ; и сами данные, которые нам нужно загрузить
 
   SBI    EECR,EEMWE      ; взводим предохранитель
   SBI    EECR,EEWE      ; записываем байт

          OUT    EEDR,R26       ; и сами данные, которые нам нужно загрузить
 
   SBI    EECR,EEMWE      ; взводим предохранитель
   SBI    EECR,EEWE      ; записываем байт
                        
   RET             ; возврат из процедуры

Чую что надо адрес для каждого байта указывать, но если писать к примеру байт 100, страшный жеж код получится :facepalm:
Чтот не так, расскажите как это делается по Фэн-Шую
EEARH на 2313 естественно не будет
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Да адрес нужно менять, иначе будет действительна последняя запись из R26. По мне, лучше зафиксировать под регистр данных один регистр, по которому будет идти запись-чтение EEPROM.
Спойлер

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

SAVE:
   PUSH   R0
   PUSH   A
   LDI   ZL,LOW(COEFF_Co)
   CLR   YH
   LDI   YL,LOW(RAM_COEFF_Co)
E_RAM:
   RCALL   EEREAD
   LD   A,Y
   CPSE   A,R0
   RCALL   R0_A
   INC   YL
   INC   ZL
   CPI   ZL,LOW(E_END)
   BRNE   E_RAM
   POP   A
   POP   R0
   RET
;*************************************************
R0_A:
   MOV   R0,A
;*************************************************
; Запись в EEPROM
; ZH,ZL -адрес
; R0- данные
;************************************************
EEWRITE:
   SBIC   EECR,EEWE
   RJMP   EEWRITE

   OUT     EEARL,ZL
   OUT     EEDR,R0

   SBI     EECR,EEMWE
   SBI     EECR,EEWE
EEWWAIT:
   SBIC    EECR,EEWE
   RJMP    EEWWAIT

   RET
;************************************************
; Чтение из EEPROM
; ZH,ZL-адрес
; R0-данные
;************************************************
EEREAD:
   OUT     EEARL,ZL
   SBI     EECR,EERE

   IN      R0,EEDR

   RET
Аватара пользователя
paskal
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

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

Сообщение paskal »

ILYAUL писал(а):Он хочет сказать , что в момент выполнения операции sbi или cbi считывается состояние порта , накладывается маска и возвращается обратно. Но если в этот момент произошло какое-то событие на порту изменившее состояние какого нить пина , то и после вывода на порт состояние пина изменится. Логика , где то есть . Но вот ,где это написано я не нашёл.

Нет там никакой логики!
Откройте даташит и посмотрите схематику порта. Вывод сигнала наружу и чтение уровня на ножке проходят через физически разные регистры. Вывод - это PORTx, а чтение через PINx. Более того, эти регистры расположены по разным адресам и пересекаться в одной команде чтение-модификация-запись никак не могут.
Если сказать на конкретном примере, то вы утверждаете следующее. Пусть мы управляем ножкой PA0, при этом на PA1 выводится 1, но она сидит на земле. Тогда по команде sbi/cbi porta.0, процессор считывает регистр pina по адресу 0x19,затем производит модификацию бита 0, а потом пишет новое значение в porta по адресу 0x1B. Таким образом бит pina.1 копируется в porta.1 ну не абсурд ли?

Может вы про какой то другой процессор такое слышали, но с аврами это невозможно.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Ну схему я смотрел ещё вчера. Поэтому не могу с увереностью утверждать , что команды SBI и CBI используют для чтения порта именно PINx , так как чтение
портов можно осуществлять 2 сигналами RRx и RPx. К тому же стандартное использование команды это cbi PORTx,PINx. что играет на пользу RRx. Хотя в некоторых МС, но не вовсех можно инвертировать биты PORTx через PINx. Так , что вопрос остался открытым.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Вывод сигнала наружу и чтение уровня на ножке проходят через физически разные регистры.

Чтение комадой IN - да. А вот CBI/SBI не факт. Они выполняются за два такта, так что тупое чтение/модификация/запись не катит, что-то из них комбинировано аппаратно (кстати, и код эти команды имеют разные, в отличии от кучи совпадающих - clr и ldi r,0 например). А это можно реализовать только читая физический уровень на порту.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

ILYAUL писал(а):К тому же стандартное использование команды это cbi PORTx,PINx.
Эт где так применяется и для чего? Я использовал sbi или cbi только таким образом:
sbi Port,PinNum
где Port - portx, pinx, ddrx
а PinNum - номер бита 0-7

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


Alexeyslav писал(а):Микроконтроллер не умеет физически оперировать с отдельными битами, поэтому что берет команда SBI - читает значение из регистра PINxx выполняет операцию OR <маска бита> и результат сохраняет в PORTxx
Эт чего ради контроллер берет с PINX а сохраняет в PORTX.....

Если писать SBI PORTX,PinNum то берутся данные регистра PORTX, при этом данные PINX никак не влияют.....
Если писать SBI DDRX,PinNum то берутся данные регистра DDRX.....
Если писать SBI PINX,PinNum то здесь PINX упоминается чисто формально, работа все равно идет с PORTX, а данные с порта PINX никак не используются.....
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Эт где так применяется и для чего?

PINx= 0,1,2....7 = PinNum
Эт чего ради контроллер берет с PINX а сохраняет в PORTX.....

Этот вопрос то мы и выясняем. Так как никто толком не знает внутренюю организацию проца. И он совершенно запросто может оперировать двумя сигналами , для разных команд. Единственно что можно точно сказать , что если команды используют чтение с порта PINx то ситуация описанная Alexeyslav не возможна никогда.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Что касается команд SBI и CBI то тут все просто помоему, эти команды работают с конкретным указанным регистром. Если указан PORTX то данные и берутся с PORTX, и PINX тут никаким боком не задествуется.....

Ситуация с принудительным изменением уровня на ножке актуальна только если поступить так например:
ldi r16,0
out portx,r16
......
ldi r16,1
out portx,r16
in r16,pinx
Вот если на ножке порта висит большая емкость, то не факт что после чтения порта, у нас считается 1.....

В AVR-ках для этого и введен дополнительный регистр PORTX, он исключает влияние внешних факторов на выводимые в порт данные.

В ZILOG-ах например, нет такого регистра, и там мне приходилось отводить отдельный регистр чтобы хранить там выводимые в порт данные. Иначе при необходимости модифицировать данные порта, была опасность модифицировать уже модифицированные внешним воздействием данные. О как.....


paskal вообщето уже все объяснил.....
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вообще-то в AVR регистр PINx и заложен для того чтобы считывать истинное состояние порта, особенно если порт находится на грани перехода 0-1-0, но пришлось пожертвовать скоростью введя синхронизатор. И что-то мне подсказывает , что считывать напрямую AVR себе не позволит , тогда зачем столько мучений.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Моё мнение такое, что команды SBI и CBI используют 3-х битный дешифратор номера бита, соответственно SBI складывает результат дешифратора с регистром PORTx, а CBI умножает инвертированный результат дешифратора с регистром PORTx.
Что касается PINx, так это своего рода обратная связь регистра PORTx, регистр PORTx выдает данные на внешний буферный регистр, выходами которого являются именно ноги МК, а вот регистр PINx и показывает состояние этих ног, т.е. он читает выхода этого самого внешнего буферного регистра.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Единственно что можно точно сказать , что если команды используют чтение с порта PINx то ситуация описанная Alexeyslav не возможна никогда.

Так C/SBI так же успешно работает и с PINx (инвертирует ногу), так что вряд ли при обращении к конкретно PORTx затрагивается PINx. Вообще у атмела есть документация на эту тему, но лень искать среди ночи.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

не во всех мс такое есть. Написал вопрос в ATMEL , посмотрим , что ответят. К томуже C/SBI - это команды чтения- модификация - запись , так что , что происходит на этапе чтения нам вот пока и не ясно.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Этапа чтения нет у С/SBI, все происходит аппаратно за один такт, на втором такте результат отправляется в порт, скорей всего это (второй такт) связано с выборкой адресного пространства.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Написал вопрос в ATMEL , посмотрим , что ответят.

Круто. Напишите потом :)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

zero648 писал(а):Этапа чтения нет у С/SBI, все происходит аппаратно за один такт, на втором такте результат отправляется в порт, скорей всего это (второй такт) связано с выборкой адресного пространства.

Угу... :)))
Чтение без чтения... :)))
All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports.
This means that the direction of one port pin can be changed without unintentionally changing
the direction of any other pin with the SBI and CBI instructions. The same applies when changing
drive value (if configured as output) or enabling/disabling of pull-up resistors (if configured as
input).
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

ILYAUL писал(а):...так как чтение портов можно осуществлять 2 сигналами RRx и RPx
Думаю, что ответ может дать эксперимент. И результат может быть неожиданным :)

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

ldi  r16,0
out  porta, r16
sbi  porta,3

out  portb, r16
nop
sbi  portb,3
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

HHIMERA писал(а):Угу... :)))
Чтение без чтения... :)))
All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports.
This means that the direction of one port pin can be changed without unintentionally changing
the direction of any other pin with the SBI and CBI instructions. The same applies when changing
drive value (if configured as output) or enabling/disabling of pull-up resistors (if configured as
input).

Очень смешно :))) , Вы хоть бы потрудились перевести, что здесь написано, а именно, что Все порты ввода/вывода в AVR имеют функции чтения-модификации-записи, которое может меняться регистрами конфигурации портов DDR (direction), как весь порт, так и отдельные пины с помощью команд CBI и SBI.
Ответить

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