Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mega1281. Адресация памяти.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
adc
Ув. форумчане прошу помочь с вопросом: Почему в даташите на M1281 инициализация вачдоктаймера выглядит так:
Код
WDT_off:
; Turn off global interrupt
cli
; Reset Watchdog Timer
wdr
; Clear WDRF in MCUSR
in r16, MCUSR
andi r16, (0xff & (0<<WDRF))
out MCUSR, r16
; Write logical one to WDCE and WDE
; Keep old prescaler setting to prevent unintentional time-out
in r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)
out WDTCSR, r16
; Turn off WDT
ldi r16, (0<<WDE)
out WDTCSR, r16
; Turn on global interrupt
sei
ret

А студия ругается на операнды в команде "out"?
Код
(614): error: Operand 1 out of range: 0x60
aesok
В даташите есть такая глава:
Цитата
5. About Code Examples
This documentation contains simple code examples that briefly show how to use various parts of
the device. Be aware that not all C compiler vendors include bit definitions in the header files
and interrupt handling in C is compiler dependent. Please confirm with the C compiler documentation
for more details.
These code examples assume that the part specific header file is included before compilation.
For I/O registers located in extended I/O map, "IN", "OUT", "SBIS", "SBIC", "CBI", and "SBI"
instructions must be replaced with instructions that allow access to extended I/O. Typically
"LDS" and "STS" combined with "SBRS", "SBRC", "SBR", and "CBR".


Анатолий.
domowoj
В Mega1281 регистр WDTCSR находится по адресу $60
и обращаться к нему (как и к многим другим) можно только как к ячейке памяти.
См. даташит.
ae_
Вопрос по тому же примеру из первого сообщения:
Код
...
andi r16, (0xff & (0<<WDRF))
...
ldi r16, (0<<WDE)
...

Для чего используют такие выражения, если результат не зависит от WDRF и WDE, и всегда = 0 ?
adc
to aesok:Спасибо!
Странно?! неужели атмеловцам сложно экземплы перекроить под описываемый девайс?!.. Иногда это добавляет путаницы.
Amper25
ldi r16, (0<<WDE)

Какое то бредовое применение. Означает сдвинуть 0 на бит под номером WDE и записать это все в R16.
Такой вид судя по всему сделан для сохранения общего стиля.
Если ldi r16,(1<<WDE) означает поставить 1 в бит WDE, то
ldi r16, (0<<WDE) - поставить 0.

Хотя можно просто написать ldi r16,0
Но тогда не совсем понятно будет что именно обнуляем.
adc
Цитата(Amper25 @ Jun 8 2008, 12:41) *
Хотя можно просто написать ldi r16,0
Но тогда не совсем понятно будет что именно обнуляем.

Так мы обнуляем все. альтернатива clr r16
Amper25
Ну ldi r16, (0<<WDE) вобщем тоже обнуляет все.
vet
Цитата(ae_ @ Jun 8 2008, 12:15) *
Вопрос по тому же примеру из первого сообщения:
Код
...
andi r16, (0xff & (0<<WDRF))
...
ldi r16, (0<<WDE)
...

Для чего используют такие выражения, если результат не зависит от WDRF и WDE, и всегда = 0 ?

Есть у хороших исходников такое свойство - самодокументируемость.
ae_
Цитата(vet @ Jun 9 2008, 13:47) *
Есть у хороших исходников такое свойство - самодокументируемость.

давайте разберём этот хороший исходник:
Код
; Clear WDRF in MCUSR
in r16, MCUSR
andi r16, (0xff & (0<<WDRF))
out MCUSR, r16

первой инструкцией ЧИТАЕМ регистр MCUSR
затем только что прочитанное значение затираем нулём
и выводим обратно в порт.

Мне одному кажется, что первая операция лишняя?
тогда вот не менее самодокументированный код:
Код
clr r16
out MCUSR, r16


Может быть изначально подразумевалось вот так:
Код
; Clear WDRF in MCUSR
in r16, MCUSR
andi r16, (0xff & ~(1<<WDRF))
out MCUSR, r16

я понимаю, когда для читаемости кода используют (1<<bit3)|(0<<bit2)|(1<<bit1)|(0<<bit0), но когда (0<<N) используется как единственный результат? в чём смысл?
adc
Цитата(ae_ @ Jun 9 2008, 12:57) *
давайте разберём этот хороший исходник:
Код
; Clear WDRF in MCUSR
in r16, MCUSR
andi r16, (0xff & (0<<WDRF))
out MCUSR, r16

(0<<N) используется как единственный результат? в чём смысл?

Да в том, что видно для чего делается операция стирания регистра.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.