Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

ну, всех подробностей проекта мне не нужно.
на том форуме ты дал картинки для разных режимов.
но чтобы было можно дать какой-то ответ, хотелось бы увидеть настройку таймера для разных режимов.
эта задержка элементарно может быть из-за неправильной настройки выхода.
на том форуме от тебя тоже "нулевая" информация, поэтому и там никто не смог дать конкретного ответа.
а ясновидцев и экстрасенсов здесь нет.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

Эхх...хоть это и не поможет, но ладно - вот код из стенда, по которому снимались картинки, он крайне прост (для таймера 1):
Спойлер

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

#define TEST_PERIOD 1023
#define TEST_DUTY 511

volatile uint8_t pwm_modes[] = {7, 14, 15};
volatile uint8_t current_mode = 0;

volatile uint16_t t1_counts;

static inline void stop_t1(void) {
    TCCR1B &= 0xf8;
}

ISR(TIMER1_COMPB_vect) {
    if(!--t1_counts) {
        stop_t1();
    }
}

void startTimerAtMode(uint8_t mode) {
    cli();

    // clear
    TCCR1A = 0; TCCR1B = 0; TIMSK1 = 0; TIFR1 = 0;
    TCNT1 = 0; OCR1A = 0; OCR1B = 0; ICR1 = 0; // 16 bit regs

    switch(pwm_modes[current_mode]) {
    case 7:
        // OC1B non-inverting, fastPWM mode 7
        TCCR1A |= (1 << COM1B1) | (1 << WGM11) | (1 << WGM10);
        TCCR1B |= (1 << WGM12);
        break;
    case 14:
        // OC1B non-inverting, fastPWM mode 14
        TCCR1A |= (1 << COM1B1) | (1 << WGM11);
        TCCR1B |= (1 << WGM13) | (1 << WGM12);
        ICR1 = TEST_PERIOD; // period / frequency
        break;
    case 15:
        // OC1B non-inverting, fastPWM mode 15
        TCCR1A |= (1 << COM1B1) | (1 << WGM11) | (1 << WGM10);
        TCCR1B |= (1 << WGM13) | (1 << WGM12);
        OCR1A = TEST_PERIOD; // period / frequency
        break;
    default:
        break;
    }

    TIMSK1 |= (1 << OCIE1B); // COMP interrupt to count pulses

    OCR1B = TEST_DUTY; // duty

    // repeats
    t1_counts = 5;

    // start mark
    PORTD |= (1 << PD4);
    _delay_ms(20);
    PIND |= (1 << PD4);

    sei();

    // start with prescalers
    TCCR1B |= (1 << CS11) | (1 << CS10); // 64
}
Возможно, я плохо гуглю, но единственное упоминание об этой "особенности" нашлось пока только здесь, раздел 3. И то с формулировкой "for reasons i don’t fully understand".

"нулевая" информация - насмешил.
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

по тексту настройка всех режимов ШИМ и выхода OC1B правильная.
PD4 - это выход OC1B? это для какого МК?
как я понял, в режимах 7 и 14 работа неправильная. по картинкам из той темы там имеется пропуск до первого импульса примерно а один период таймера.
а в режиме 15 первый импульс появляется сразу после старта.
так у тебя в тексте стоит еще задержка на 20 мс
_delay_ms(20);
и только потом ты разрешаешь работу порта PD4 на выход
PIND |= (1 << PD4);
и запускаешь таймер
TCCR1B |= (1 << CS11) | (1 << CS10); // 64
поэтому у тебя первый импульс появляется через 20 мс.
или ты считаешь, что режим 15 работает неправильно, так как эта задержка на 20 мс не отрабатывается?
но в режиме 15 у тебя до включения таймера должны пройти те же самые 20 мс. пока таймер не работает, то и первого импульса не должно появиться.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

PD4 - это выход OC1B? это для какого МК?
Нет - к таймеру это отношения не имеет, это обычный пин для 2 канала осцилографа, чтобы "отловить" старт таймера (по спадающему фронту).
как я понял, в режимах 7 и 14 работа неправильная. по картинкам из той темы там имеется пропуск до первого импульса примерно а один период таймера.
а в режиме 15 первый импульс появляется сразу после старта.
Я не могу сказать, что это неправильно, это и есть особенность, с которой я и пытаюсь разобраться. Да, во всех fastPWM режимах, кроме того, что использует OCRxA в качестве TOP, первый импульс на выходе появляется только через "пустой" период, в этот период прерывания COMP нет, потом идут заданные мной 5 импульсов. А вот когда режим 15 - да - сразу при старте таймера высокий уровень, и имульсов снова точно 5.
так у тебя в тексте стоит еще задержка на 20 мс
_delay_ms(20);
и только потом ты разрешаешь работу порта PD4 на выход
PIND |= (1 << PD4);
и запускаешь таймер
TCCR1B |= (1 << CS11) | (1 << CS10); // 64
поэтому у тебя первый импульс появляется через 20 мс.
См. выше, это просто триггер для осциллографа, к сути отношения не имеет.
или ты считаешь, что режим 15 работает неправильно, так как эта задержка на 20 мс не отрабатывается?
Ну про 20мс уже выше описал. Я не говорю, что неправильно, он работает отлично от других. В том, что сразу при старте таймера выставляет на порту 1, считает это первым импульсом, а остальные режимы "ждут" один "пустой" период. Да, на картинках не видно всей цепочки, но во всех режимах нужные 5 импульсов есть, т.е. прерывания отрабатываются корректно во всех режимах. Я пробовал "заставить" другие режимы вести себя аналогично игрой с регистром счетчика, но это приводило только к некорректному количеству импульсов, один точно съедался. В итоге можно, как в блоге, просто принять эту данность и помнить о ней. Но, конечно, интересно, почему об этом нет упоминаний ни в даташите, ни в еррате, ни в апноутах.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

dfxman писал(а):Нет - к таймеру это отношения не имеет, это обычный пин для 2 канала осцилографа
а где настройка пина для OC1B? я по своему опыту знаю, что пока не настроишь пин на выход, таймер туда выводиться не будет.
это у меня на Амега8, может на других МК можно пин не настраивать на выход и таймер все равно будет выводить свой сигнал.
dfxman писал(а):Но, конечно, интересно, почему об этом нет упоминаний ни в даташите, ни в еррате, ни в апноутах.
потому что таймер у тебя работает совершенно правильно.
ранее я ошибся, сказав, что пауза в один период таймера. пауза у тебя программная - 20 мс. и твой осциллограф точно показывает метку через 20 мс.
или ты убирай задержку, если она тебе не нужна, или ищи "засаду", почему в режиме 15 твоя программа не отрабатывает эту задержку в 20 мс. а на таймер пенять не нужно.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

а где настройка пина для OC1B?
В общей инициализации. Не вижу смысла банальщину постить. Не будет сигнала, если пин на выход не настроить.
потому что таймер у тебя работает совершенно правильно.
ранее я ошибся, сказав, что пауза в один период таймера. пауза у тебя программная - 20 мс. и твой осциллограф точно показывает метку через 20 мс.
или ты убирай задержку, если она тебе не нужна, или ищи "засаду", почему в режиме 15 твоя программа не отрабатывает эту задержку в 20 мс. а на таймер пенять не нужно.
Сорри, но еще раз повторюсь, дискуссия бессмысленная. Ты или не видишь, или не хочешь/не можешь увидеть проблему. На осциллограммах все видно, особенно, если внимательно посмотреть и немного подумать. Там есть с таймером 2 пример, параметры периода и скважности другие, триггер для осциллографа другой продолжительности, а суть осталась, и это внимательному сразу будет видно.
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

да, ты прав, дискуссия бессмысленная.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Таймеры/счётчики в AVR

Сообщение BOB51 »

dfxman
для начала махонький вопросец...
в Вашем примере какой режим то таймеру задается, если за все время значение
volatile uint8_t current_mode = 0;
совершенно нигде не меняется...
тогда и
switch(pwm_modes[current_mode])
будет давать одинаковый результат
default:
break;
:roll:
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

BOB51, ну не default: break;, а case 7:. Это же только кусок про таймер. А по факту есть еще код управления, который устанавливает current_mode и вызывает startTimerAtMode. Да, там параметр, но он сейчас не используется, хвост от другой реализации управления. И снова, это к моему вопросу никак. Самое простое и правильное, если не сталкивались в реале и нет опыта - не играть в эти игры умозрительные, а взять и самим проверить. И либо убедиться, что так оно и есть, либо доказательно сказать, что нет. Для занимающихся делов минут на 15. Вдруг у меня все чипы фейковые...))
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

[uquote="dfxman",url="/forum/viewtopic.php?p=4792854#p4792854"]... Самое простое и правильное, ... взять и самим проверить. И либо убедиться, что так оно и есть, либо доказательно сказать, что нет...[/uquote] Проверил. Особенностей не увидел. Подробности на фотках и в исходнике.
Спойлер

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

; проба проверки  T1 режим 15 ATmega168
;27.02.2026

	.INCLUDE "m168padef.inc"

.equ	Fo=14745600
;*******************************
	.CSEG

	.ORG	$0000
RESET:
	RJMP START ; Reset Handler

;.org	0x014
;CAPT
;	RETI
.org	0x016
;T1_COMPA
	DEC	R17
	BRNE	PC+2
	RET
	RETI
;.org	0x018
;T1_COMPB
;	RETI
;*******************************
START:
	SER	R16
	OUT	DDRB,R16
	OUT	DDRC,R16
	OUT	DDRD,R16

	SBI	PORTB,1		;погасить светик +
	SBI	PORTD,6		;погасить светик -

	LDI	R16,1<<PRTWI|1<<PRTIM2|1<<PRTIM0|1<<PRSPI|1<<PRUSART0|1<<PRADC
	STS	PRR,R16		;отключить тактирование неиспользуемых модулей

	LDI	R16,1<<ACD
	OUT	ACSR,R16	;отключить аналоговый компаратор

	LDI	R16,1<<SE
	OUT	SMCR,R16	;IDLE SLEEP
;*******************************
GO:
;15 режим
	CLR	ZH
	STS	TCCR1B,ZH
	STS	TCNT1H,ZH
	STS	TCNT1L,ZH

;	LDI	XH,HIGH(40*Fo/1000000-1)
;	LDI	XL,LOW(40*Fo/1000000-1)	;1 FOTO
	LDI	XH,HIGH(10*Fo/1000000-1);2 FOTO
	LDI	XL,LOW(10*Fo/1000000-1)
	STS	OCR1BH,XH
	STS	OCR1BL,XL

	LDI	XH,HIGH(50*Fo/1000000-1)
	LDI	XL,LOW(50*Fo/1000000-1)
	STS	OCR1AH,XH
	STS	OCR1AL,XL

	LDI	R16,1<<OCIE1A
	STS	TIMSK1,R16
	OUT	TIFR1,R16

;	LDI	R22,1<<COM1B1|1<<COM1B0|1<<WGM11|1<<WGM10	;1 FOTO
;Set OC1B on Compare Match, clear OC1B at BOTTOM (inverting mode)
	LDI	R22,1<<COM1B1|1<<WGM11|1<<WGM10				;2 FOTO
	STS	TCCR1A,R22
;Set OC1B on Compare Match, clear OC1B at BOTTOM (inverting mode)

	LDI	R22,1<<WGM13|1<<WGM12|1<<CS10
	STS	TCCR1B,R22

	SBI	PORTD,2	;синхронизация по фронту
	LDI	R17,10

	SEI
WAIT:
	SLEEP
	BRIE	WAIT
	CLI

	CBI	PORTD,2

	STS	TCCR1B,ZH

	LDI	YH,HIGH(1*Fo/1000/4)
	LDI	YL,LOW(1*Fo/1000/4)
	SBIW	YL,1
	BRNE	PC-1

	RJMP	GO
;*******************************
.EXIT
Вложения
M168_режим15.zip
(74.95 КБ) 30 скачиваний
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

akl, может ты не обратил внимание, у него в тексте есть задержка 20 мс, после которой включается таймер и начинает выдавать свои импульсы.
в режимах 7 и 14 эта задержка работает исправно и импульсы появляются через 20 мс после старта.
а режиме 15 все его чипы проскакивают мимо этой задержки, и импульсы появляются сразу после старта.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Таймеры/счётчики в AVR

Сообщение BOB51 »

Я б не стал делать окончательное заключение до тех пор, пока не просмотрел бы раздел еррат даташита на тот МК, что наш dfxman для опытов использует...
Да и там еще вопрос - какая версия кристалла ему в когти попала (у АВР в отличии от ПИКов это выяснить таки проблема)...
Может там чего то и есть "крамольного" - АВРки жирненькие такими ерратами часто "грешат" - причем надо смотреть самый последний (свежайший) выпуск даташита...
:roll:
Это помимо возможных ошибок в программе за пределами предоставленного dfxman фрагмента теста.
8)
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

BOB51, а что, в разделе еррат должно быть указано, что МК может пропускать мимо некоторое количество команд, которые он обязан выполнять?
персонально для тебя повторю: в режиме 15 все его чипы проскакивают мимо этой задержки, и импульсы появляются сразу после старта.
а в других режимах задержка выполняется.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Таймеры/счётчики в AVR

Сообщение BOB51 »

Задачи dfxman неведомы... Вот и гадаю...
:dont_know:
Еще могу предположить, что вопрошающий мутит систему генератора спецпоследовательности пакетов импульсов с произвольным их количеством и плавающей частотой, изменяемой в произвольный момент времени...
Но там "быстрый ШИМ" не прокатит...
8)
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

[uquote="akl",url="/forum/viewtopic.php?p=4792901#p4792901"]Проверил. Особенностей не увидел. Подробности на фотках и в исходнике.[/uquote]
У меня нет 128, залил Ваш hex в 328p 16MHz:
СпойлерИзображениеИзображение
К сожалению, ассемблер бегло не читаю пока, поправьте, если я неправильно понял - в ините все пины на выход, подымаете PB1, PD6 (что-то касаемо работы Вашего осциллографа?), отключаете все ненужное. Для таймера разрешаете прерывание по периоду (у меня - по скважности), стартуете его, подымаете PD2, ставите количество импульсов в 10, разрешаете прерывания, уводите в сон. В ISR уменьшаете счетчик, при нуле просыпаетесь, опускаете PD2, останавливаете таймер, ну и по кругу. Все верно?

Попытался отловить самый первый старт:
СпойлерИзображение
Так выглядит остановка:
СпойлерИзображение
Подскажите, где найти 10-й импульс?

Добавлено after 23 minutes 6 seconds:
Для потерявшихся в 20мс. Поменял триггерный импульс на 1мс.
Спойлерmode 7, 14
Изображение

mode 15
Изображение
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

10 периодов лучше видно на 1 фотке. Нижний луч. Кстати, скорость развертки 100мкс/дел
СпойлерИзображение
У меня тоже нет M128, поэтому программку писал для платы с M168 на борту.
Вложения
M168_режим15_1.jpg
(41.79 КБ) 309 скачиваний
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

[uquote="akl",url="/forum/viewtopic.php?p=4793034#p4793034"]10 периодов лучше видно на 1 фотке. Нижний луч. Кстати, скорость развертки 100мкс/дел
СпойлерИзображение
У меня тоже нет M128, поэтому программку писал для платы с M168 на борту.[/uquote]
Сорри, глаз замылился, конечно 168, полагаю, это не принципиально, IP блоки таймеров наверняка одинаковые. Правильно ли я вижу на Вашей развертке, что импульсы начинаются сразу после старта? Как и у меня?

Вот еще вариант для наглядности, таймер 1 (1 канал) в 15, таймер 2 (2 канал, по нему триггер) в 3 режиме. Стартуют одновременно:
СпойлерИзображение
Спойлер

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

void startBothTimers(void) {
    cli();

    GTCCR = (1 << TSM) | (1 << PSRASY) | (1 << PSRSYNC);

    // timer 2
    TCCR2A = 0; TCCR2B = 0; TIMSK2 = 0; TIFR2 = 0;
    TCNT2 = 0; OCR2A = 0; OCR2B = 0;
    TCCR2A |= (1 << COM2B1) | (1 << WGM21) | (1 << WGM20);
    TIMSK2 |= (1 << OCIE2B); // COMP interrupt to count pulses
    OCR2B = 63;
    TCCR2B |= (1 << CS22); // 64
    t2_counts = 5;

    // timer 1
    TCCR1A = 0; TCCR1B = 0; TIMSK1 = 0; TIFR1 = 0;
    TCNT1 = 0; OCR1A = 0; OCR1B = 0; ICR1 = 0; // 16 bit regs
    TCCR1A |= (1 << COM1B1) | (1 << WGM11) | (1 << WGM10);
    TCCR1B |= (1 << WGM13) | (1 << WGM12);
    OCR1A = 0xff; // period / frequency
    TIMSK1 |= (1 << OCIE1B); // COMP interrupt to count pulses
    OCR1B = 63; // duty
    TCCR1B |= (1 << CS11) | (1 << CS10); // 64
    t1_counts = 5;

    sei();

    GTCCR = (1 << PSRASY) | (1 << PSRSYNC); // less instructions

}
Ну или по 1 таймеру триггер:
СпойлерИзображение
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Таймеры/счётчики в AVR

Сообщение Starichok51 »

в приведенном автором вопроса фрагменте кода

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

    // start mark
    PORTD |= (1 << PD4);
    _delay_ms(20);
    PIND |= (1 << PD4);

    sei();

    // start with prescalers
    TCCR1B |= (1 << CS11) | (1 << CS10); // 64
никакими судьбами МК в режиме 15 не пропустит вызов функции задержки _delay_ms(20).
а что у него в полной программе нам не известно.
но проще назвать все чипы фейковыми, чем искать ошибку, почему в режиме 15 не выполняется функция задержки _delay_ms(20).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
dfxman
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт окт 20, 2023 16:31:17

Re: Таймеры/счётчики в AVR

Сообщение dfxman »

[uquote="akl",url="/forum/viewtopic.php?p=4793034#p4793034"]10 периодов лучше видно на 1 фотке.[/uquote]
Еще раз пересмотрел Ваш код, на 2 фотке конфигурация, сходная с моей (non-inverting mode), кроме источника прерывания. И все также, импульсы стартуют сразу. Спасибо за подтверждение.
СпойлерИзображение
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Проверил режим 7 таймера 2 с разными прерываниями.
Спойлер

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

;Проба выявить разницу между прерываниями OC2A OC2B2B таймера 2,
; работающего в режиме 7
	.INCLUDE "m168padef.inc"

.equ	Fo=14745600
;*******************************
	.CSEG

	.ORG	$0000
RESET:
	RJMP START ; Reset Handler

.org	0x00E
;T2_COMPA
	DEC	R17
	BRNE	PC+2
	RET
	RETI
;.org	0x010
;T2_COMPB
;	DEC	R17
;	BRNE	PC+2
;	RET
;	RETI
;.org	0x014
;CAPT
;	RETI
;.org	0x016
;T1_COMPA
;	DEC	R17
;	BRNE	PC+2
;	RET
;	RETI
;.org	0x018
;T1_COMPB
;	RETI
;*******************************
START:
	SER	R16
	OUT	DDRB,R16
	OUT	DDRC,R16
	OUT	DDRD,R16

	SBI	PORTB,1		;погасить светик +
	SBI	PORTD,6		;погасить светик -

	LDI	R16,1<<PRTWI|1<<PRTIM1|1<<PRTIM0|1<<PRSPI|1<<PRUSART0|1<<PRADC
;	LDI	R16,1<<PRTWI|1<<PRTIM2|1<<PRTIM0|1<<PRSPI|1<<PRUSART0|1<<PRADC
	STS	PRR,R16		;отключить тактирование неиспользуемых модулей

	LDI	R16,1<<ACD
	OUT	ACSR,R16	;отключить аналоговый компаратор

	LDI	R16,1<<SE
	OUT	SMCR,R16	;IDLE SLEEP
;*******************************
GO:
;15 режим
	CLR	ZH
	STS	TCCR2B,ZH
	STS	TCNT2,ZH
	LDI	XL,LOW(13*Fo/1000000-1)
	STS	OCR2B,XL

	LDI	XL,LOW(17*Fo/1000000-1)
	STS	OCR2A,XL

;	LDI	R16,1<<OCIE2B		;1 FOTO
	LDI	R16,1<<OCIE2A		;2 FOTO
	STS	TIMSK2,R16
	OUT	TIFR2,R16

;	LDI	R22,1<<COM2B1|1<<COM2B0|1<<WGM21|1<<WGM20	;1 FOTO
;Set OC2B on Compare Match, clear OC2B at BOTTOM,(inverting mode).
	LDI	R22,1<<COM2B1|1<<WGM21|1<<WGM20				;2 FOTO
;Clear OC2B on Compare Match, set OC2B at BOTTOM,(non-inverting mode).
	STS	TCCR2A,R22

	LDI	R22,1<<WGM22|1<<CS20
	STS	TCCR2B,R22

	SBI	PORTD,2	;синхронизация по фронту

	LDI	R17,5	;10

	SEI
WAIT:
	SLEEP
	BRIE	WAIT
;	CLI

	CBI	PORTD,2

	STS	TCCR2B,ZH

	LDI	YH,HIGH(1*Fo/1000/4)
	LDI	YL,LOW(1*Fo/1000/4)
	SBIW	YL,1
	BRNE	PC-1

	RJMP	GO
;*******************************
.EXIT
СпойлерИзображение
СпойлерИзображение
Скорость развертки 20мкс/дел. Число периодов 5.
Вложения
M168_режим7_T2 2.jpg
(36.13 КБ) 151 скачивание
M168_режим7_T2_1.jpg
(40.02 КБ) 146 скачиваний
Ответить

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