Таймеры/счётчики в AVR
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Таймеры/счётчики в AVR
ну, всех подробностей проекта мне не нужно.
на том форуме ты дал картинки для разных режимов.
но чтобы было можно дать какой-то ответ, хотелось бы увидеть настройку таймера для разных режимов.
эта задержка элементарно может быть из-за неправильной настройки выхода.
на том форуме от тебя тоже "нулевая" информация, поэтому и там никто не смог дать конкретного ответа.
а ясновидцев и экстрасенсов здесь нет.
на том форуме ты дал картинки для разных режимов.
но чтобы было можно дать какой-то ответ, хотелось бы увидеть настройку таймера для разных режимов.
эта задержка элементарно может быть из-за неправильной настройки выхода.
на том форуме от тебя тоже "нулевая" информация, поэтому и там никто не смог дать конкретного ответа.
а ясновидцев и экстрасенсов здесь нет.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Реклама
Re: Таймеры/счётчики в AVR
Эхх...хоть это и не поможет, но ладно - вот код из стенда, по которому снимались картинки, он крайне прост (для таймера 1):
Возможно, я плохо гуглю, но единственное упоминание об этой "особенности" нашлось пока только здесь, раздел 3. И то с формулировкой "for reasons i don’t fully understand".
"нулевая" информация - насмешил.
Спойлер
Код: Выделить всё
#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
}
"нулевая" информация - насмешил.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Таймеры/счётчики в AVR
по тексту настройка всех режимов ШИМ и выхода 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 мс. пока таймер не работает, то и первого импульса не должно появиться.
PD4 - это выход OC1B? это для какого МК?
как я понял, в режимах 7 и 14 работа неправильная. по картинкам из той темы там имеется пропуск до первого импульса примерно а один период таймера.
а в режиме 15 первый импульс появляется сразу после старта.
так у тебя в тексте стоит еще задержка на 20 мс
_delay_ms(20);
и только потом ты разрешаешь работу порта PD4 на выход
PIND |= (1 << PD4);
и запускаешь таймер
TCCR1B |= (1 << CS11) | (1 << CS10); // 64
поэтому у тебя первый импульс появляется через 20 мс.
или ты считаешь, что режим 15 работает неправильно, так как эта задержка на 20 мс не отрабатывается?
но в режиме 15 у тебя до включения таймера должны пройти те же самые 20 мс. пока таймер не работает, то и первого импульса не должно появиться.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Таймеры/счётчики в AVR
Нет - к таймеру это отношения не имеет, это обычный пин для 2 канала осцилографа, чтобы "отловить" старт таймера (по спадающему фронту).PD4 - это выход OC1B? это для какого МК?
Я не могу сказать, что это неправильно, это и есть особенность, с которой я и пытаюсь разобраться. Да, во всех fastPWM режимах, кроме того, что использует OCRxA в качестве TOP, первый импульс на выходе появляется только через "пустой" период, в этот период прерывания COMP нет, потом идут заданные мной 5 импульсов. А вот когда режим 15 - да - сразу при старте таймера высокий уровень, и имульсов снова точно 5.как я понял, в режимах 7 и 14 работа неправильная. по картинкам из той темы там имеется пропуск до первого импульса примерно а один период таймера.
а в режиме 15 первый импульс появляется сразу после старта.
См. выше, это просто триггер для осциллографа, к сути отношения не имеет.так у тебя в тексте стоит еще задержка на 20 мс
_delay_ms(20);
и только потом ты разрешаешь работу порта PD4 на выход
PIND |= (1 << PD4);
и запускаешь таймер
TCCR1B |= (1 << CS11) | (1 << CS10); // 64
поэтому у тебя первый импульс появляется через 20 мс.
Ну про 20мс уже выше описал. Я не говорю, что неправильно, он работает отлично от других. В том, что сразу при старте таймера выставляет на порту 1, считает это первым импульсом, а остальные режимы "ждут" один "пустой" период. Да, на картинках не видно всей цепочки, но во всех режимах нужные 5 импульсов есть, т.е. прерывания отрабатываются корректно во всех режимах. Я пробовал "заставить" другие режимы вести себя аналогично игрой с регистром счетчика, но это приводило только к некорректному количеству импульсов, один точно съедался. В итоге можно, как в блоге, просто принять эту данность и помнить о ней. Но, конечно, интересно, почему об этом нет упоминаний ни в даташите, ни в еррате, ни в апноутах.или ты считаешь, что режим 15 работает неправильно, так как эта задержка на 20 мс не отрабатывается?
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Таймеры/счётчики в AVR
а где настройка пина для OC1B? я по своему опыту знаю, что пока не настроишь пин на выход, таймер туда выводиться не будет.dfxman писал(а):Нет - к таймеру это отношения не имеет, это обычный пин для 2 канала осцилографа
это у меня на Амега8, может на других МК можно пин не настраивать на выход и таймер все равно будет выводить свой сигнал.
потому что таймер у тебя работает совершенно правильно.dfxman писал(а):Но, конечно, интересно, почему об этом нет упоминаний ни в даташите, ни в еррате, ни в апноутах.
ранее я ошибся, сказав, что пауза в один период таймера. пауза у тебя программная - 20 мс. и твой осциллограф точно показывает метку через 20 мс.
или ты убирай задержку, если она тебе не нужна, или ищи "засаду", почему в режиме 15 твоя программа не отрабатывает эту задержку в 20 мс. а на таймер пенять не нужно.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Реклама
Re: Таймеры/счётчики в AVR
В общей инициализации. Не вижу смысла банальщину постить. Не будет сигнала, если пин на выход не настроить.а где настройка пина для OC1B?
Сорри, но еще раз повторюсь, дискуссия бессмысленная. Ты или не видишь, или не хочешь/не можешь увидеть проблему. На осциллограммах все видно, особенно, если внимательно посмотреть и немного подумать. Там есть с таймером 2 пример, параметры периода и скважности другие, триггер для осциллографа другой продолжительности, а суть осталась, и это внимательному сразу будет видно.потому что таймер у тебя работает совершенно правильно.
ранее я ошибся, сказав, что пауза в один период таймера. пауза у тебя программная - 20 мс. и твой осциллограф точно показывает метку через 20 мс.
или ты убирай задержку, если она тебе не нужна, или ищи "засаду", почему в режиме 15 твоя программа не отрабатывает эту задержку в 20 мс. а на таймер пенять не нужно.
- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Таймеры/счётчики в AVR
да, ты прав, дискуссия бессмысленная.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Таймеры/счётчики в AVR
dfxman
для начала махонький вопросец...
в Вашем примере какой режим то таймеру задается, если за все время значение
volatile uint8_t current_mode = 0;
совершенно нигде не меняется...
тогда и
switch(pwm_modes[current_mode])
будет давать одинаковый результат
default:
break;

для начала махонький вопросец...
в Вашем примере какой режим то таймеру задается, если за все время значение
volatile uint8_t current_mode = 0;
совершенно нигде не меняется...
тогда и
switch(pwm_modes[current_mode])
будет давать одинаковый результат
default:
break;
Re: Таймеры/счётчики в AVR
BOB51, ну не default: break;, а case 7:. Это же только кусок про таймер. А по факту есть еще код управления, который устанавливает current_mode и вызывает startTimerAtMode. Да, там параметр, но он сейчас не используется, хвост от другой реализации управления. И снова, это к моему вопросу никак. Самое простое и правильное, если не сталкивались в реале и нет опыта - не играть в эти игры умозрительные, а взять и самим проверить. И либо убедиться, что так оно и есть, либо доказательно сказать, что нет. Для занимающихся делов минут на 15. Вдруг у меня все чипы фейковые...))
Re: Таймеры/счётчики в AVR
[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
akl, может ты не обратил внимание, у него в тексте есть задержка 20 мс, после которой включается таймер и начинает выдавать свои импульсы.
в режимах 7 и 14 эта задержка работает исправно и импульсы появляются через 20 мс после старта.
а режиме 15 все его чипы проскакивают мимо этой задержки, и импульсы появляются сразу после старта.
в режимах 7 и 14 эта задержка работает исправно и импульсы появляются через 20 мс после старта.
а режиме 15 все его чипы проскакивают мимо этой задержки, и импульсы появляются сразу после старта.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Таймеры/счётчики в AVR
Я б не стал делать окончательное заключение до тех пор, пока не просмотрел бы раздел еррат даташита на тот МК, что наш dfxman для опытов использует...
Да и там еще вопрос - какая версия кристалла ему в когти попала (у АВР в отличии от ПИКов это выяснить таки проблема)...
Может там чего то и есть "крамольного" - АВРки жирненькие такими ерратами часто "грешат" - причем надо смотреть самый последний (свежайший) выпуск даташита...
Это помимо возможных ошибок в программе за пределами предоставленного dfxman фрагмента теста.

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

Еще могу предположить, что вопрошающий мутит систему генератора спецпоследовательности пакетов импульсов с произвольным их количеством и плавающей частотой, изменяемой в произвольный момент времени...
Но там "быстрый ШИМ" не прокатит...
Re: Таймеры/счётчики в AVR
[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 15

У меня нет 128, залил Ваш hex в 328p 16MHz:
Спойлер


Попытался отловить самый первый старт:
Спойлер

Спойлер

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

Re: Таймеры/счётчики в AVR
10 периодов лучше видно на 1 фотке. Нижний луч. Кстати, скорость развертки 100мкс/дел
У меня тоже нет M128, поэтому программку писал для платы с M168 на борту.
Спойлер
- Вложения
-
- M168_режим15_1.jpg
- (41.79 КБ) 309 скачиваний
Re: Таймеры/счётчики в AVR
[uquote="akl",url="/forum/viewtopic.php?p=4793034#p4793034"]10 периодов лучше видно на 1 фотке. Нижний луч. Кстати, скорость развертки 100мкс/дел
У меня тоже нет M128, поэтому программку писал для платы с M168 на борту.[/uquote]
Сорри, глаз замылился, конечно 168, полагаю, это не принципиально, IP блоки таймеров наверняка одинаковые. Правильно ли я вижу на Вашей развертке, что импульсы начинаются сразу после старта? Как и у меня?
Вот еще вариант для наглядности, таймер 1 (1 канал) в 15, таймер 2 (2 канал, по нему триггер) в 3 режиме. Стартуют одновременно:
Ну или по 1 таймеру триггер:

Спойлер
Сорри, глаз замылился, конечно 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
}
Спойлер

- Starichok51
- Модератор
- Сообщения: 19053
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Таймеры/счётчики в AVR
в приведенном автором вопроса фрагменте кода
никакими судьбами МК в режиме 15 не пропустит вызов функции задержки _delay_ms(20).
а что у него в полной программе нам не известно.
но проще назвать все чипы фейковыми, чем искать ошибку, почему в режиме 15 не выполняется функция задержки _delay_ms(20).
Код: Выделить всё
// 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).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Таймеры/счётчики в AVR
[uquote="akl",url="/forum/viewtopic.php?p=4793034#p4793034"]10 периодов лучше видно на 1 фотке.[/uquote]
Еще раз пересмотрел Ваш код, на 2 фотке конфигурация, сходная с моей (non-inverting mode), кроме источника прерывания. И все также, импульсы стартуют сразу. Спасибо за подтверждение.
Еще раз пересмотрел Ваш код, на 2 фотке конфигурация, сходная с моей (non-inverting mode), кроме источника прерывания. И все также, импульсы стартуют сразу. Спасибо за подтверждение.
Спойлер

Re: Таймеры/счётчики в AVR
Проверил режим 7 таймера 2 с разными прерываниями.
Скорость развертки 20мкс/дел. Число периодов 5.
Спойлер
Код: Выделить всё
;Проба выявить разницу между прерываниями 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Спойлер
Спойлер
- Вложения
-
- M168_режим7_T2 2.jpg
- (36.13 КБ) 151 скачивание
-
- M168_режим7_T2_1.jpg
- (40.02 КБ) 146 скачиваний


