AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
27.06.2013, 10:49
|
#11
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Таймер на Atmega644
Сейчас до 4к, но все равно этого мало. АБ уже года 2 абсолютно бесплатный, жаль Громов его забросил и так и не добавил поддержку Хмег
|
|
|
|
27.06.2013, 12:10
|
#12
|
Частый гость
Регистрация: 19.04.2007
Сообщений: 41
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Таймер на Atmega644
полезно использовать такого рода макросы
;***************************************
.macro inr
.if ( @1 ‹ 0x60 )
in @0,@1
.else
lds @0,@1
.endif
.endm
;***************************************
.macro outr
.if ( @0 ‹ 0x60 )
out @0,@1
.else
sts @0,@1
.endif
.endm
тогда не надо задумываться в какой области памяти находится регистр
|
|
|
|
27.06.2013, 12:35
|
#13
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Таймер на Atmega644
Проще в АБ написать типа
R10 -› OUT
И он сам посмотрит, в каком пространстве находится ячейка OUT (регистр, ОЗУ, ввод-вывод) и подставит правильную команду копирования из R10 в эту ячейку. Но мы же легких путей не ищем...
|
|
|
|
28.06.2013, 00:39
|
#14
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
Re: Таймер на Atmega644
Подобная проблема убралась когда биты н-ки указывались как 16-ричные числа. Под руками нету вашого даташит, но для Attiny2313 было бы так (архитектура периферийных устройств AVR одинаковая):
TIM0_OVF: CLI
LDI temp, $02
OUT TIMSK0, temp
LDI temp, $05
OUT TCCR0B, temp
SEI
|
|
|
|
28.06.2013, 00:46
|
#15
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Таймер на Atmega644
Сообщение от svom
|
проблема убралась когда биты н-ки указывались как 16-ричные числа
|
Да, давно подмечено - когда компиляторы видят шестнадцатиричную запись, то понимают, что имеют дело с профессионалом и перестают егозить, филонить и гадить в бинарники. ![Окей](images/smilies/icon_ok.gif)
Кроме того, шестнадцатиричные числа лучше входят в регистры - без зазора. Десятичные немного болтаются, люфтят.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 28.06.2013 в 00:49.
|
|
|
|
28.06.2013, 01:33
|
#16
|
Временная регистрация
Регистрация: 09.09.2007
Сообщений: 82
Сказал спасибо: 40
Сказали Спасибо 32 раз(а) в 19 сообщении(ях)
|
Re: Таймер на Atmega644
Сообщение от svom
|
Подобная проблема убралась когда биты н-ки указывались как 16-ричные числа. Под руками нету вашого даташит, но для Attiny2313 было бы так (архитектура периферийных устройств AVR одинаковая):
|
Спасибо! Давно в цирке не был.
|
|
|
|
28.06.2013, 19:54
|
#17
|
Частый гость
Регистрация: 16.11.2005
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Таймер на Atmega644
макрозаписи, предложенные Jekane, решают проблему;
наверное, стоило написать, как их вызывать:
outr TIMSK0,temp
здесь параметр @0 - это TIMSK0
параметр @1 - регистр, который вы назвали temp
inr temp,TIMSK0
здесь наоборот, параметр @0 temp, @1 - TIMSK0
ассемблер сам определит, в какой области находится адресуемый регистр и использует соответствующую команду - out или sts, in или lds
важно, что это не вызовет увеличения числа команд/времени исполнения
----
пояснения:
для записи в регистры с адресами выше $5F вместо
OUT TIMSK0, temp
используется
sts TIMSK0, temp
для считывания вместо
in temp,TIMSK0
пишите
lds temp,TIMSK0
при перетаскивании частей ассемблерного кода из программ для "более простых" или старых МК в МК с бОльшим числом регистров при возникновении таких ошибок можно заменять out на sts и in на lds,но только там, где при ассемблировании обнаружены ошибки (!)
если регистр имеет адрес менее $60, например, TCCR0B вашего ATmega644, ошибка в записанной команде
sts TCCR0B,r16 ;(правильно out TCCR0B,r16)
обнаружена не будет (по крайней мере в AVR Studio 4),
но в симуляторе запись в регистр TCCR0B при использовании sts не выполнится
----
писать 16-ричные числа вместо имен отдельных битов регистров непрактично, при этом ошибки, возникающие при наборе, более вероятны - можно неверно пересчитать установленные биты в число,
неудобно будет и интерпретировать команды при чтении программы;
просто надо знать операторы и корректно ими пользоваться
Последний раз редактировалось bvn123; 28.06.2013 в 20:33.
|
|
|
|
28.06.2013, 21:15
|
#18
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Таймер на Atmega644
Сообщение от bvn123
|
макрозаписи, предложенные Jekane, решают проблему;
|
Не совсем - там граница указана неверная.
Сообщение от bvn123
|
наверное, стоило написать, как их вызывать:
|
А это уже сообщили - см. пост #6.
__________________
There's always more than one way to skin a cat.
|
|
|
|
29.06.2013, 00:17
|
#19
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Таймер на Atmega644
Сообщение от bvn123
|
важно, что это не вызовет увеличения числа команд/времени исполнения
|
Так таки и не вызовет?
Сообщение от bvn123
|
если регистр имеет адрес менее $60, например, TCCR0B вашего ATmega644, ошибка в записанной команде
sts TCCR0B,r16 ;(правильно out TCCR0B,r16)
обнаружена не будет (по крайней мере в AVR Studio 4),
|
Естественно - команда-то правильная.
Сообщение от bvn123
|
но в симуляторе запись в регистр TCCR0B при использовании sts не выполнится
|
Выполнится.
Вопрос - куда?
|
|
|
|
29.06.2013, 10:52
|
#20
|
Частый гость
Регистрация: 16.11.2005
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Таймер на Atmega644
›tempora Не совсем - там граница указана неверная.
по datasheet "64 I/O Registers $0020 - $005F",
в макрозаписи Jekane указано "@.. ‹ $60",
(хотя по факту адреса I/O регистров в пространстве памяти используются только до $3f);
к сожалению, в м644def.inc не видно параметра, связанного с границами памяти, со значением $3f или $40, или $5f, или $60, который можно было бы применить в качестве параметра условия
›tempora: скорее всего, пост 6 открыли и не стали разбираться, также как и с macro
›omercury: важно, что это не вызовет увеличения числа команд/времени исполнения/ Так таки и не вызовет?
не вызовет, см.дизассемблер: вместо строк 29: и 30: ассемблер подставляет соотв.строки +00000007: и +00000009: с командами sts и out:
29: outr TIMSK0,r16
+00000007: 9300006E STS 0x006E,R16 Store direct to data space
30: outr TCCR0B,r16
+00000009: BD05 OUT 0x25,R16 Out to I/O location
›omercury: но в симуляторе запись в регистр TCCR0B при использовании sts не выполнится/Выполнится.Вопрос - куда?
в регистр TCCR0B запись не выполнится,
куда выполнится:
в "Register summary" (datasheet)
0x25 (0x45) TCCR0B
0x05 (0x25) PORTB
out TCCR0B,r16 эквивалентно out $25,r16
sts $25,r16 выполнит запись в PORTB - симулятор подтверждает
если нет подвоха, почему в *def.inc не используются адреса в скобках? тогда всюду можно было бы использовать sts вместо out,
это упростило бы перенос программ на другой микроконтроллер
Последний раз редактировалось bvn123; 29.06.2013 в 11:02.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:22.
|
|