реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Mega1281. Адресация памяти.
adc
сообщение Jun 8 2008, 06:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Ув. форумчане прошу помочь с вопросом: Почему в даташите на 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


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 8 2008, 07:50
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



В даташите есть такая глава:
Цитата
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".


Анатолий.
Go to the top of the page
 
+Quote Post
domowoj
сообщение Jun 8 2008, 08:02
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



В Mega1281 регистр WDTCSR находится по адресу $60
и обращаться к нему (как и к многим другим) можно только как к ячейке памяти.
См. даташит.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
ae_
сообщение Jun 8 2008, 08:15
Сообщение #4


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Вопрос по тому же примеру из первого сообщения:
Код
...
andi r16, (0xff & (0<<WDRF))
...
ldi r16, (0<<WDE)
...

Для чего используют такие выражения, если результат не зависит от WDRF и WDE, и всегда = 0 ?
Go to the top of the page
 
+Quote Post
adc
сообщение Jun 8 2008, 08:41
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



to aesok:Спасибо!
Странно?! неужели атмеловцам сложно экземплы перекроить под описываемый девайс?!.. Иногда это добавляет путаницы.


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Amper25
сообщение Jun 8 2008, 08:41
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



ldi r16, (0<<WDE)

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

Хотя можно просто написать ldi r16,0
Но тогда не совсем понятно будет что именно обнуляем.
Go to the top of the page
 
+Quote Post
adc
сообщение Jun 8 2008, 08:50
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



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

Так мы обнуляем все. альтернатива clr r16


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Amper25
сообщение Jun 8 2008, 11:09
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Ну ldi r16, (0<<WDE) вобщем тоже обнуляет все.
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 9 2008, 04:47
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



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

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

Есть у хороших исходников такое свойство - самодокументируемость.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
ae_
сообщение Jun 9 2008, 08:57
Сообщение #10


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(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) используется как единственный результат? в чём смысл?

Сообщение отредактировал ae_ - Jun 9 2008, 08:58
Go to the top of the page
 
+Quote Post
adc
сообщение Jun 9 2008, 09:14
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



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

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

Да в том, что видно для чего делается операция стирания регистра.


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 09:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016