Ассемблер (ASM) для AVR в вопросах и ответах
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Наверно не использовали две подряд идущие SBI на контроллере с тактовой частотой в 20Мгц, наверно емкость монтажа уже может привести к такому эффекту что напряжение на первом выводе не успеет изменится к моменту выполнения второй команды, это же всего какая-то сотня наносекунд...
Оно и понятно, довольно редко встречается такой способ работы с портом на таких скоростях. Но соблазн никуда не девается. особенно при желании выдать импульс чуть-чуть позже установления уровней на других выводах.
Оно и понятно, довольно редко встречается такой способ работы с портом на таких скоростях. Но соблазн никуда не девается. особенно при желании выдать импульс чуть-чуть позже установления уровней на других выводах.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну вот передо мной девайс (часы) год уже тикают. 20МГц, сдвиговые регистры, общая длина дорожки на входы сдвига более 30см (зигзагом). Работают. Фронт не затянут, вероятно, индуктивность дорожки больше проявляется, чем ёмкость.
Хотя там и нет двух подряд SBI... Но в любом случае я разделял любые самые короткие действия с портами NOP'ами.
Хотя там и нет двух подряд SBI... Но в любом случае я разделял любые самые короткие действия с портами NOP'ами.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вообще-то это рекомендуется 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 в вопросах и ответах
Подскажите как записать в EEPROM тиньки 2313, 4 байта подряд.
Забиваем адрес нулевой ячейку памяти.
Пишим байт, ждем пока запишится.
Далее пишим второй байт?
Или нужно указывать для него адрес?
Чую что надо адрес для каждого байта указывать, но если писать к примеру байт 100, страшный жеж код получится
Чтот не так, расскажите как это делается по Фэн-Шую
EEARH на 2313 естественно не будет
Забиваем адрес нулевой ячейку памяти.
Пишим байт, ждем пока запишится.
Далее пишим второй байт?
Или нужно указывать для него адрес?
Код: Выделить всё
; Притопали из условия по метке 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, страшный жеж код получится
Чтот не так, расскажите как это делается по Фэн-Шую
EEARH на 2313 естественно не будет
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да адрес нужно менять, иначе будет действительна последняя запись из 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 в вопросах и ответах
ILYAUL писал(а):Он хочет сказать , что в момент выполнения операции sbi или cbi считывается состояние порта , накладывается маска и возвращается обратно. Но если в этот момент произошло какое-то событие на порту изменившее состояние какого нить пина , то и после вывода на порт состояние пина изменится. Логика , где то есть . Но вот ,где это написано я не нашёл.
Нет там никакой логики!
Откройте даташит и посмотрите схематику порта. Вывод сигнала наружу и чтение уровня на ножке проходят через физически разные регистры. Вывод - это PORTx, а чтение через PINx. Более того, эти регистры расположены по разным адресам и пересекаться в одной команде чтение-модификация-запись никак не могут.
Если сказать на конкретном примере, то вы утверждаете следующее. Пусть мы управляем ножкой PA0, при этом на PA1 выводится 1, но она сидит на земле. Тогда по команде sbi/cbi porta.0, процессор считывает регистр pina по адресу 0x19,затем производит модификацию бита 0, а потом пишет новое значение в porta по адресу 0x1B. Таким образом бит pina.1 копируется в porta.1 ну не абсурд ли?
Может вы про какой то другой процессор такое слышали, но с аврами это невозможно.
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну схему я смотрел ещё вчера. Поэтому не могу с увереностью утверждать , что команды SBI и CBI используют для чтения порта именно PINx , так как чтение
портов можно осуществлять 2 сигналами RRx и RPx. К тому же стандартное использование команды это cbi PORTx,PINx. что играет на пользу RRx. Хотя в некоторых МС, но не вовсех можно инвертировать биты PORTx через PINx. Так , что вопрос остался открытым.
портов можно осуществлять 2 сигналами RRx и RPx. К тому же стандартное использование команды это cbi PORTx,PINx. что играет на пользу RRx. Хотя в некоторых МС, но не вовсех можно инвертировать биты PORTx через PINx. Так , что вопрос остался открытым.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вывод сигнала наружу и чтение уровня на ножке проходят через физически разные регистры.
Чтение комадой IN - да. А вот CBI/SBI не факт. Они выполняются за два такта, так что тупое чтение/модификация/запись не катит, что-то из них комбинировано аппаратно (кстати, и код эти команды имеют разные, в отличии от кучи совпадающих - clr и ldi r,0 например). А это можно реализовать только читая физический уровень на порту.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Эт где так применяется и для чего? Я использовал sbi или cbi только таким образом:ILYAUL писал(а):К тому же стандартное использование команды это cbi PORTx,PINx.
sbi Port,PinNum
где Port - portx, pinx, ddrx
а PinNum - номер бита 0-7
т.е. установить или сбросить соответствующий бит необходимого порта, и тут соседние биты порта никак не влияют на результат.....
Эт чего ради контроллер берет с PINX а сохраняет в PORTX.....Alexeyslav писал(а):Микроконтроллер не умеет физически оперировать с отдельными битами, поэтому что берет команда SBI - читает значение из регистра PINxx выполняет операцию OR <маска бита> и результат сохраняет в PORTxx
Если писать SBI PORTX,PinNum то берутся данные регистра PORTX, при этом данные PINX никак не влияют.....
Если писать SBI DDRX,PinNum то берутся данные регистра DDRX.....
Если писать SBI PINX,PinNum то здесь PINX упоминается чисто формально, работа все равно идет с PORTX, а данные с порта PINX никак не используются.....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Эт где так применяется и для чего?
PINx= 0,1,2....7 = PinNum
Эт чего ради контроллер берет с PINX а сохраняет в PORTX.....
Этот вопрос то мы и выясняем. Так как никто толком не знает внутренюю организацию проца. И он совершенно запросто может оперировать двумя сигналами , для разных команд. Единственно что можно точно сказать , что если команды используют чтение с порта PINx то ситуация описанная Alexeyslav не возможна никогда.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Что касается команд 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 вообщето уже все объяснил.....
Ситуация с принудительным изменением уровня на ножке актуальна только если поступить так например:
ldi r16,0
out portx,r16
......
ldi r16,1
out portx,r16
in r16,pinx
Вот если на ножке порта висит большая емкость, то не факт что после чтения порта, у нас считается 1.....
В AVR-ках для этого и введен дополнительный регистр PORTX, он исключает влияние внешних факторов на выводимые в порт данные.
В ZILOG-ах например, нет такого регистра, и там мне приходилось отводить отдельный регистр чтобы хранить там выводимые в порт данные. Иначе при необходимости модифицировать данные порта, была опасность модифицировать уже модифицированные внешним воздействием данные. О как.....
paskal вообщето уже все объяснил.....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вообще-то в AVR регистр PINx и заложен для того чтобы считывать истинное состояние порта, особенно если порт находится на грани перехода 0-1-0, но пришлось пожертвовать скоростью введя синхронизатор. И что-то мне подсказывает , что считывать напрямую AVR себе не позволит , тогда зачем столько мучений.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Моё мнение такое, что команды SBI и CBI используют 3-х битный дешифратор номера бита, соответственно SBI складывает результат дешифратора с регистром PORTx, а CBI умножает инвертированный результат дешифратора с регистром PORTx.
Что касается PINx, так это своего рода обратная связь регистра PORTx, регистр PORTx выдает данные на внешний буферный регистр, выходами которого являются именно ноги МК, а вот регистр PINx и показывает состояние этих ног, т.е. он читает выхода этого самого внешнего буферного регистра.
Что касается PINx, так это своего рода обратная связь регистра PORTx, регистр PORTx выдает данные на внешний буферный регистр, выходами которого являются именно ноги МК, а вот регистр PINx и показывает состояние этих ног, т.е. он читает выхода этого самого внешнего буферного регистра.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Единственно что можно точно сказать , что если команды используют чтение с порта PINx то ситуация описанная Alexeyslav не возможна никогда.
Так C/SBI так же успешно работает и с PINx (инвертирует ногу), так что вряд ли при обращении к конкретно PORTx затрагивается PINx. Вообще у атмела есть документация на эту тему, но лень искать среди ночи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
не во всех мс такое есть. Написал вопрос в ATMEL , посмотрим , что ответят. К томуже C/SBI - это команды чтения- модификация - запись , так что , что происходит на этапе чтения нам вот пока и не ясно.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Этапа чтения нет у С/SBI, все происходит аппаратно за один такт, на втором такте результат отправляется в порт, скорей всего это (второй такт) связано с выборкой адресного пространства.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Написал вопрос в ATMEL , посмотрим , что ответят.
Круто. Напишите потом
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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).
"Я не даю готовых решений, я заставляю думать!"(С)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Думаю, что ответ может дать эксперимент. И результат может быть неожиданнымILYAUL писал(а):...так как чтение портов можно осуществлять 2 сигналами RRx и RPx
Код: Выделить всё
ldi r16,0
out porta, r16
sbi porta,3
out portb, r16
nop
sbi portb,3
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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).
Очень смешно