Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

teist писал(а):Подскажите плиз начинающему как выйти из прерывания
в нужное место кода по условию , т.е. условие выполнено
выходим на определенное место, не выполнено возвращаемся
из прерывания как обычно...
возможно ли такое вообще?
Очень просто: внутри прерывания извлекаете два значения из стека (там адрес возврата), и делаете переход в нужное место, не забыв включить прерывание. Например:

Код: Выделить всё

-- условие сработало, попали сюда
pop r17
pop r17
sei
rjmp метка
Или переместить указатель стека ан слово вверх, но это не даст выигрыша ни по скорости, ни по памяти
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Вероятно это неправильное проектирование программы, если из прерывания надо переходить в другое место... а если часть алгоритма, который мы прервали не закончил свою работу? То что ты хочешь сделать - это переход внутри прерывания, а выход из прерывания может быть осуществлен только в точку в которой это прерывание возникло, либо на вектор сброса. Остальные варианты чреваты непредсказуемыми последствиями... даже когда кажется что этих последствий просто не может быть.
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Но даст возможность, по окончании программы по условию , вытолкнуть стек и продолжить прерванную прерыванием программу с того же места , восстановив все регистры.
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

Alexeyslav писал(а): Остальные варианты чреваты непредсказуемыми последствиями... даже когда кажется что этих последствий просто не может быть.
и получится ядерная бомба.

что касаемо моего вопроса. то я не могу инициализировать таймер с компаратором. или что то не то инициализировать пытаюсь. щас кода нет под рукой. завтра покажу.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Alexeyslav писал(а):Вероятно это неправильное проектирование программы, .
Нет , это обычная многозадачность , когда на одном процессоре и на одной области памяти программ процессор выполняет совершенно разные задачи одновременно.
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Вероятно это неправильное проектирование программы, если из прерывания надо переходить в другое место...
В 97% случаев - да. Тем более, если такой вопрос задаётся в этой теме.
Но есть и 3% случаев, когда программист чётко знает, что делает, и выиграет от этого драгоценные такты или байты.
Нет , это обычная многозадачность
Обычно она реализуется стандартными приёмами.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Ну о вкусах не будем спорить , покрайней мере в этой теме. Но я согласен с Вами в одном , если такой подход применяется , то надо чётко представлять почему и зачем и главное как делать правильно
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

я многозадачность делал иначе... щас уже точно не помню...
но было так: 16-битный счетчик завязанный на таймере-счетчике. десять (!) задач. хотя и задачи были простые, каждая мигала своим светодиодом с определенной частотой, но память бедного TINY26 была забита на 98.6%
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

У таймера есть режим счета до сравнения и сброс по сравнению, заодно он может АППАРАТНО при этом событии инвертировать значение пина, к которому он подключен - получается сразу генератор на выходе, причем одному таймеру принадлежат сразу два вывода работу которых можно контролировать устанавливая соответствующй режим таймера - к нему может быть задействован либо один вывод, либо два и тогда на втором выводе сигнал будет в противофазе. Поэтому пишут что в контроллере 4 выхода ШИМ при 2-х таймерах в наличии...

Да, пожалуй раздел даташита посвященный режимам работы таймера довольно запутан, но там вроде бы как по картинкам все ясно...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Alexeyslav писал(а):но там вроде бы как по картинкам все ясно...
Вот именно! Достаточно взглянуть на эту картинку чтобы понять: это то, что надо!
Изображение
xkp, вот формула из ДШ для генерируемой частоты:
Изображение
OCRnx от 0 до 255 для 8-ми битного таймера и до 65535 для 16-ти битного таймера.
Можно нарисовать таблицу (например, в Экселе) всех возможных частот в зависимости от значений OCRnx и N, и оценить точность генерируемых частот.
Вложения
Безымянный2.GIF
(4.51 КБ) 629 скачиваний
Безымянный.GIF
(10.89 КБ) 746 скачиваний
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

именно этот режим и не получается запустить

Код: Выделить всё

.INCLUDE "tn13DEF.INC"
.list
.def tmp=r16
.def tmp0=r17
.def cnt=r19
.DSEG

.cseg
.org $0a
RESET:
	ldi tmp,low(RAMEND)
	out spl,tmp
.macro   OUTI
	LDI   R16,@1
	OUT   @0,R16
.endm
	OUTI   tccr0a,(1<<com0a1)|(0<<COM0A0)|(0<<com0b1)|(0<<COM0b0)|(1<<wgm01)|(0<<wgm00) 

	ldi tmp,low(RAMEND)
	out spl,tmp

	ldi tmp,$01	;преддилитель 64
	out tccr0b,tmp
	ldi tmp,0b00000111
	out ddrb,tmp
	ldi tmp,0
	out portb,tmp
	sei
main:
	ldi tmp,$c0
	out ocr0a,tmp
;	ldi tmp,$10
;	out ocr0b,tmp
main_2:
	rjmp main_2
;		Address Labels Code Comments
.org $00
	rjmp RESET ; Reset Handler
		reti	;rjmp EXT_INT0 ; IRQ0 Handler
		reti	;rjmp PCINT0 ; PCINT0 Handler
		reti	;rjmp TIM0_OVF ; Timer0 Overflow Handler
		reti	;rjmp EE_RDY ; EEPROM Ready Handler
		reti	;rjmp ANA_COMP ; Analog Comparator Handler
		reti	;rjmp TIM0_COMPA ; Timer0 CompareA Handler
		reti	;rjmp TIM0_COMPB ; Timer0 CompareB Handler
		reti	;rjmp WATCHDOG ; Watchdog Interrupt Handler
		reti	;rjmp ADC_inc ; ADC Conversion Handler
.exit
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

что, нет реакции на выводе OC0A?
так он у тебя постоянно в 0 сбрасывается

Код: Выделить всё

OUTI   tccr0a,(1<<com0a1)|(0<<COM0A0)|(0<<com0b1)|(0<<COM0b0)|(1<<wgm01)|(0<<wgm00) 
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

кто что сбрасывает? подробнее пожалуйста. эти битики регистра установил согласно даташиту
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

комбинация :

Код: Выделить всё

OUTI   tccr0a,(1<<com0a1)|(0<<COM0A0).... 
всегда, т.е. при совпадении OCR0A и TCNT0 переводит вывод OC0A в 0, чтобы значение на выводе менялось каждый раз на противоположенное надо установить COM0A1:COM0A0 = 01, в посте выше,где приведены диаграммы, обрати внимание на надпись Toggle
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

вот и заработало!!! :) начинаются эксперименты по разгону максимальной частоты tiny85

PS хм.. тини13 отлично справляеться с моими поставленными задачами на своей частоте 9.6 мГц. точность не сильно большая но мне хватит, наверное...

следующим вопросом станет время, точнее, как можно точнее измерить ширину импульса. можно даже и не в секундах или миллисекундах, а в условных еденицах.
железо: ОУ MCP6022, МК TINY85. ОУ нужен для предварительной обработки сигнала, выдает на МК импульсы лог 1, которые и нужно мерить. из даташита на ОУ он может работать на частоте до 10 мГц. тинька будет на кварце 20 мГц, может и больше, если разгонится. хочу ловить импульсы по переднему фронту, но прерывания по переднему фронту на int0 уже задействованы. какие будут предложения?
может просто ждать появления лог 1?
например:

Код: Выделить всё

metka:
	sbis pinb,0
	rjmp metka
;тут мерием время в УЕ
	clr tmp
	clr tmp0
metka2:
	inc tmp
	cpi tmp,$ff
	brlo metka3
	inc tmp0
metka3:
	sbic pinb,0
	rjmp metka2
; получили време в tmp0,tmp в УЕ
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Посмотрите в сторону режима захвата. Не знаю есть ли он в Вашем МК, но думаю, что есть.
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

режим захвата? не слышал. кстати, освободил int0. теперь можно и по нему. но все же, что за режим захвата?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Не знаю, есть ли подобное в Атмелах, не силён в них, но в ПИКах есть. Это нечто обратное ШИМу. Т.е. по одному фронту модуль обнуляет таймер и запускает его, а по другому фронту - останавливает. В итоге, имеем событие от модуля и период в тактах таймера, находящийся в регистре таймера.
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

это у нас называется прерывания по переднему и заднему фронтам входа INT0. хотя... наверное это не совсем то... но идея хорошая. подумаю над этим.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Нет, прерывания по INT - это совсем другое.
Режим захвата имеет тот-же модуль, что и режим ШИМа. Т.е. он может и так и сяк.

PS: Дайте прямую ссылку на ДШ вашего МК.
Ответить

Вернуться в «AVR»