teist писал(а):Подскажите плиз начинающему как выйти из прерывания
в нужное место кода по условию , т.е. условие выполнено
выходим на определенное место, не выполнено возвращаемся
из прерывания как обычно...
возможно ли такое вообще?
Очень просто: внутри прерывания извлекаете два значения из стека (там адрес возврата), и делаете переход в нужное место, не забыв включить прерывание. Например:
Вероятно это неправильное проектирование программы, если из прерывания надо переходить в другое место... а если часть алгоритма, который мы прервали не закончил свою работу? То что ты хочешь сделать - это переход внутри прерывания, а выход из прерывания может быть осуществлен только в точку в которой это прерывание возникло, либо на вектор сброса. Остальные варианты чреваты непредсказуемыми последствиями... даже когда кажется что этих последствий просто не может быть.
Но даст возможность, по окончании программы по условию , вытолкнуть стек и продолжить прерванную прерыванием программу с того же места , восстановив все регистры.
Alexeyslav писал(а): Остальные варианты чреваты непредсказуемыми последствиями... даже когда кажется что этих последствий просто не может быть.
и получится ядерная бомба.
что касаемо моего вопроса. то я не могу инициализировать таймер с компаратором. или что то не то инициализировать пытаюсь. щас кода нет под рукой. завтра покажу.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Alexeyslav писал(а):Вероятно это неправильное проектирование программы, .
Нет , это обычная многозадачность , когда на одном процессоре и на одной области памяти программ процессор выполняет совершенно разные задачи одновременно.
Вероятно это неправильное проектирование программы, если из прерывания надо переходить в другое место...
В 97% случаев - да. Тем более, если такой вопрос задаётся в этой теме.
Но есть и 3% случаев, когда программист чётко знает, что делает, и выиграет от этого драгоценные такты или байты.
Ну о вкусах не будем спорить , покрайней мере в этой теме. Но я согласен с Вами в одном , если такой подход применяется , то надо чётко представлять почему и зачем и главное как делать правильно
я многозадачность делал иначе... щас уже точно не помню...
но было так: 16-битный счетчик завязанный на таймере-счетчике. десять (!) задач. хотя и задачи были простые, каждая мигала своим светодиодом с определенной частотой, но память бедного TINY26 была забита на 98.6%
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
У таймера есть режим счета до сравнения и сброс по сравнению, заодно он может АППАРАТНО при этом событии инвертировать значение пина, к которому он подключен - получается сразу генератор на выходе, причем одному таймеру принадлежат сразу два вывода работу которых можно контролировать устанавливая соответствующй режим таймера - к нему может быть задействован либо один вывод, либо два и тогда на втором выводе сигнал будет в противофазе. Поэтому пишут что в контроллере 4 выхода ШИМ при 2-х таймерах в наличии...
Да, пожалуй раздел даташита посвященный режимам работы таймера довольно запутан, но там вроде бы как по картинкам все ясно...
Alexeyslav писал(а):но там вроде бы как по картинкам все ясно...
Вот именно! Достаточно взглянуть на эту картинку чтобы понять: это то, что надо! xkp, вот формула из ДШ для генерируемой частоты:
OCRnx от 0 до 255 для 8-ми битного таймера и до 65535 для 16-ти битного таймера.
Можно нарисовать таблицу (например, в Экселе) всех возможных частот в зависимости от значений OCRnx и N, и оценить точность генерируемых частот.
.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
кто что сбрасывает? подробнее пожалуйста. эти битики регистра установил согласно даташиту
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
всегда, т.е. при совпадении OCR0A и TCNT0 переводит вывод OC0A в 0, чтобы значение на выводе менялось каждый раз на противоположенное надо установить COM0A1:COM0A0 = 01, в посте выше,где приведены диаграммы, обрати внимание на надпись Toggle
вот и заработало!!! начинаются эксперименты по разгону максимальной частоты 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
режим захвата? не слышал. кстати, освободил int0. теперь можно и по нему. но все же, что за режим захвата?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Не знаю, есть ли подобное в Атмелах, не силён в них, но в ПИКах есть. Это нечто обратное ШИМу. Т.е. по одному фронту модуль обнуляет таймер и запускает его, а по другому фронту - останавливает. В итоге, имеем событие от модуля и период в тактах таймера, находящийся в регистре таймера.
это у нас называется прерывания по переднему и заднему фронтам входа INT0. хотя... наверное это не совсем то... но идея хорошая. подумаю над этим.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic