Alexeyslav писал(а):
Ага, таймер останавливается потому что микроконтроллер переходит в глубокий сон с остановкой тактового генератора, я точно не помню но атмеловске контроллеры имеют несколько режимов сна и они как-то настраиваются. Среди них есть такие режимы которые не останавливают переферию и тактовый генератор, например режим сна для минимизации шумов на время измерения АЦП который останавливает только ядро.
Регистр MCUCR биты SM2..0 определяют режим сна. Тебе поидее нужен режим 000 - Idle.
Ну они ж вроде по умолчанию стоят в нулях, я их и не трогаю. а ладно, со сном буду позже разбираться, тут вполне прокатывает бесконечный цикл.
Не прокатывает потому что SBI работает только с нижней частью портов. увы.
Но ничто не мешает вам прописать ту конструкцию как макрос и вызывать одной короткой строчкой.
Где-то тут я уже видел универсальные макросы с условной компиляцией, которые используют SBI к младшим регистрам и более сложную конструкцию для старших портов.
Но его несложно самому написать, в хелпе прочитать про директиву .macro и директивы условной компиляции.
ага. Значит и флаг сработки компаратора только через макрос смогу очищать? Или тут еще все хуже? Хотя нет... флаг разрешения прерывания компаратора я же могу выставить прямо. Тогда почему не могу очистить флаг срабатывания?
Надо читать даташит по этому поводу. Поидее, он сбрасывается записью туда "1", биты равные нулю просто игнорируются.
Из даташита:
• Bit 4 – ACI: Analog Comparator Interrupt Flag
This bit is set by hardware when a comparator output event triggers the interrupt mode defined
by ACIS1 and ACIS0. The Analog Comparator Interrupt routine is executed if the ACIE bit is set
and the I-bit in SREG is set. ACI is cleared by hardware when executing the corresponding inter-
rupt Handling Vector. Alternatively, ACI is cleared by writing a logic one to the flag.
Бит признака прерывания очищается аппаратно после старта процедуры обработки прерывания, либо...
В последней строчке написано что альтернативно бит прерывания может быть очищен записью в него лог.1
Alexeyslav писал(а):
Бит признака прерывания очищается аппаратно после старта процедуры обработки прерывания, либо...
В последней строчке написано что альтернативно бит прерывания может быть очищен записью в него лог.1
Да, правы Вы, надо внимательно читать даташит. Я-то туда все 0 пытался упихнуть...
И еще вопрос нарисовался. Почему по reti возвращает не в основной цикл (я же правильно понимаю, что должно возвращать в место, откуда прерывание вызвалось?), а сбрасывает на начальную инициализацию
.org 0 ;Задание нулевого адреса старта программы
rjmp Reset
Если ты стек установил правильно, то адрес возврата запоминается в RAM при возникновении прерывания, и извлекается командой RETI. Если стек не установлен, или вы что-то нахимичили в процедуре обработки прерывания до вызова RETI - может быть все что угодно.
Как образцовый пример - вызов RETI не из прерывания и/или без инициализации стека.
Alexeyslav писал(а):вы что-то нахимичили в процедуре обработки прерывания до вызова RETI - может быть все что угодно.
Как образцовый пример - вызов RETI не из прерывания и/или без инициализации стека.
Ребят, а как можно сделать на асм счетчик? Т.е на си это выглядело бы так:
i = 10000
while i !=0;
{
--i
{
А число I двухбайтовое, как мне его инкрементировать?
Я просто просветлел, и как же я сам-то не додумался сразу-то??? Это же все просто, я как увидел эту команду, сразу же все понял!!!
Прям сейчас пойду построю себе космолет с такими знаниями )))
Ответ правильный, но чересчур лаконичный , так что ерничать особо не стоит.
В приведенном фрагменте декремент i, а в вопросе стоит - как его инкрементировать.
Декремент делается вот так :
LDI XL,low(10000)
LDI XH,high(10000)
Y: ........ ; здесь делаем то что нужно в цикле
SBIW XL,1
BRNE Y
Не стоит забывать, что SBIW работает на четырех последних регистровых парах :
R24,R25 ... R30, R31