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

Обсуждаем контроллеры компании Atmel.
Vlad_RK
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

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

Сообщение Vlad_RK »

[uquote="SIM31",url="/forum/viewtopic.php?p=3501910#p3501910"]Да можно же в конфигураторе Codevision AVR мышкой пощелкать и посмотреть какие режимы доступны ))[/uquote]
Режимы чего?
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Проверил в железе на tiny2313 (Т1 не отличается mega16, встроенный генератор 4МГц). Вывод OC1A на PB3. Действительно, низкий уровень на OC1A представляет собой волос, которого хватает только для запуска осциллографа. Работает только программа с переключением.
Реклама
Vlad_RK
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

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

Сообщение Vlad_RK »

В самый первый проход цикла все нормально - "0" держится на OC1A, пока счетчик не досчитает до конца.
В конце цикла производится остановка таймера/счетчика, OC1A сбрасывается в "0", возврат в начало цикла, новая инициализация и запуск. И вот тут "1" появляется сразу же.
Может есть какой-то порядок запуска/остановки T/C1? Последовательность действий, которую я не соблюдаю. Может, паузу давать надо после остановки и до нового запуска, или еще что...
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Думаю, отключить COM не значит изменить память его состояния. Поэтому, когда вновь разрешается COM на лапу выводится запомненное состояние??? Переключения лапы PB3/OC1A (PD5 для mega16) добился явным указанием режима работы на сброс при сравнении.
Спойлер

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

.include "tn2313adef.inc"

.equ	Fo=4000000
;***** Определения портов В/В *****
;Port D:

.equ   DIRD   =0b00100000
.equ   PUPD   =0b00000000
.def	zero=R15

.CSEG
.org   $000
;      rjmp   RESET      ;Сброс вектор


;***** Программное выполнение начинается здесь *****

RESET:
;   ldi      r16,high(RAMEND)   ;назначить стек
;      out      SPH,r16;
;      ldi      r16,low(RAMEND)
;      out      SPL,r16

;*********************
;Установка портов В/В:
	SBI	DDRB,3

START:
	LDI	R16,HIGH(5*Fo/10/64-1)	; (5*Fo/10/64-1)= 0.5 секунды
	OUT	OCR1AH,R16
	LDI	R16,LOW(5*Fo/10/64-1)
	OUT	OCR1AL,R16

	CLR	ZERO

Cycle:
      ldi      r16,(1<<COM1A1)|(1<<COM1A0)
      out      TCCR1A,r16

      ldi      r16,(1<<WGM12)|(1<<CS11)|(1<<CS10)
;Установить бит WGM12=1 (режим CTC). Предделитель CK/64 (CS12=0, CS11=1, CS10=1)
      out      TCCR1B,r16
;***********************************

	IN	ZL,TIFR
	SBRS	ZL,OCF1A
	RJMP	PC-2

	OUT	TIFR,ZL

	ldi      r16,1<<COM1A0
	out      TCCR1A,r16

	IN	ZL,TIFR
	SBRS	ZL,OCF1A
	RJMP	PC-2

	OUT	TIFR,ZL

	RJMP	START
.EXIT
Реклама
Эиком - электронные компоненты и радиодетали
Vlad_RK
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

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

Сообщение Vlad_RK »

Я вот такое придумал.
Устанавливаю счетчик как обычно (OC1A=0), он считает 0.3 сек и переключает OC1A в 1.
Потом задержка ~0.3 сек. Потом счетчик перенастраиваю так, чтобы при совпадении он обнулил OC1A (для этого предделитель ставлю CK/1 и OCR1AL=1 - чтоб он быстро все это сделал). Потом возврат в начало и опять считает до появления "1". Завтра буду проверять.
Спойлер

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

.CSEG

.equ	Fo=4000000

;***** Определения портов В/В *****
;Port D:

.equ	DIRD	=0b00100000
.equ	PUPD	=0b00000100

;***** Векторы Прерываний *****

.CSEG
.org	$000
		rjmp	RESET		;Сброс вектор

.org	$002
		reti
.org	$004
		reti
.org	$006
		reti
.org	$008
		reti
.org	$00A
		reti
.org	$00C
		reti
.org	$00E
		reti
.org	$010
		reti
.org	$012
		reti
.org	$014
		reti
.org	$016
		reti
.org	$018
		reti
.org	$01A
		reti
.org	$01C
		reti
.org	$01E
		reti
.org	$020
		reti
.org	$022
		reti
.org	$024
		reti
.org	$026
		reti
.org	$028
		reti

;***** Программное выполнение начинается здесь *****

RESET:	ldi		r16,high(RAMEND)	;назначить стек
		out		SPH,r16
		ldi		r16,low(RAMEND)
		out		SPL,r16

;*********************
;Установка портов В/В:

		ldi		r16,DIRD
		out		DDRD,r16	;установка направления PORTD
		ldi		r16,PUPD
		out		PORTD,r16	;инициализация PORTD

;*********************



START:	

;Установка таймера
Cycle:	ldi		r16,HIGH(3*Fo/10/64-1)			;(3*Fo/10/64-1) = 0.3 секунды
		out		OCR1AH,r16
		ldi		r16,LOW(3*Fo/10/64-1)
		out		OCR1AL,r16

		ldi		r16,(1<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10)	;Установить бит WGM12=1 (режим CTC). Предделитель CK/64 (CS12=0, CS11=1, CS10=1)
		out		TCCR1B,r16

		ldi		r16,(1<<COM1A1)|(1<<COM1A0)		;При совпадении (CTC) вывод OC1A устанавливается в "1"
		out		TCCR1A,r16						;Записать регистр управления таймером/счетчиком TCCR1A

		ldi		r16,1<<PSR10					;Сбросить предделитель для всех таймеров/счетчиков
		out		SFIOR,r16

		ldi		r16,(1<<OCF1A)|(1<<OCF1B)		;Сбросить флаги
		out		TIFR,r16
		
		clr		r16								;Обнулить счетчик
		out		TCNT1H,r16
		out		TCNT1L,r16

;***********************************
;Задержка
Tim_dl:	ldi		r20,$08
		ldi		r21,$60
		ldi		r22,$18

D_r_1x:	sbic	PIND,5
		nop
		dec		r22
		brne	D_r_1x
		ldi		r22,$FF
		dec		r21
		brne	D_r_1x
		ldi		r21,$FF
		dec		r20
		brne	D_r_1x

;***********************************
;Обнулить вывод OC1A Timer/Counter1:
		ldi		r16,(1<<COM1A1)|(0<<COM1A0)		;Перенастройка T/C1 - обнулить OC1A при совпадении
		out		TCCR1A,r16

		ldi		r16,(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10)	;Предделитель CK/1 (для быстрого счета)
		out		TCCR1B,r16

		ldi		r16,$00
		out		OCR1AH,r16
		ldi		r16,$01
		out		OCR1AL,r16

		clr		r16											;Обнулить счетчик
		out		TCNT1H,r16
		out		TCNT1L,r16

		ldi		r16,(1<<OCF1A)|(1<<OCF1B)					;Сбросить флаги
		out		TIFR,r16

;***********************************

		rjmp	Cycle
Добавлено after 23 minutes 36 seconds:
Ну понятно, решение одно. :) Ну и хорошо.

akl, а как рассчитать время задержки по вашему примеру?

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

   LDI   R20,BYTE3(Fo/5)
   LDI   R21,BYTE2(Fo/5)
   LDI   R22,BYTE1(Fo/5)
LOOP:
   SUBI   R22,BYTE1(1)
   SBCI   R21,BYTE2(1)
   SBCI   R20,BYTE3(1)
   BRNE   LOOP
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Просто считаете такты выполнения цикла LOOP и заносите в регистры время выдержки деленное на это число тактов.

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

	LDI	R20,BYTE3(6*Fo/10/5)
	LDI	R21,BYTE2(6*Fo/10/5)
	LDI	R22,BYTE1(6*Fo/10/5)	;0,6 секунды
LOOP:
	SUBI	R22,BYTE1(1)	;1 такт
	SBCI	R21,BYTE2(1)	;1 такт
	SBCI	R20,BYTE3(1)	;1 такт
	BRNE	LOOP			;2 такта
;цикл занимает 5 тактов
Реклама
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

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

Сообщение parovoZZ »

Муррр, усатые!

Кому-то удалось затактировать модуль USI от таймера T0? В режиме I2C в симуляторе вроде и 4-бит счетчик считает и на прерывание уходит, вроде как и сдвиговый регистр сдвигает данные к выходу. Но нога SCK не дрыгается, на ноге DATA данных тоже нет. В железе так же. Такое ощущение, что выходные драйверы отвязаны от пинов в режиме тактирования от таймера. Может, оно только для режима SPI предназначено? Самое что мурррргрюмое, в дашике ни слова о том, как связаны регистры PORT и модуль USI.
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

А почему в ATtiny2313 (таймер №1) канал совпадения “A” генерит прерывания многократно, а “B” генерит только единожды? Традиционно-тинийские удешевления?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

это как это? вроде оба канала идентично себя ведут
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Может и непрерывно в зависимости от настройки. Может вообще без прерываний, если выводить на OC1B.
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Да, забыл добавить, что режим CTC - сброс при совпадении (не ШИМ, не вэйв). Сделал секундное мигание светодиодом (подпрога меняет Т-флаг и порт) от "A" мигает, от "B" только зажигается и горит... :dont_know:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Хм..., но код то не меняю, меняю только выбор железа "A" или "B". Может контрик "битый"? И в даташите (стр.106, таблица 46) мод 4, прописано только OCR1A... (а не OCRnA или CTCn, как в более мощных контриках) :dont_know:
Последний раз редактировалось Серый_ Вт дек 25, 2018 14:39:26, всего редактировалось 1 раз.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Можно попробовать режим 12.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

если мне не изменяет память, у 2313 в режиме стс верхней границей всегда является OCR1A (нет для этого отдельного регистра). А когда с "Б" работаешь в "А" что записано?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

[uquote="akl",url="/forum/viewtopic.php?p=3534699#p3534699"]Можно попробовать режим 12.[/uquote]
Имхо не оно, это о "каптуре эвенте" (основная суть почему "B" дурит?)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3534704#p3534704"]...верхней границей всегда является OCR1A (нет для этого отдельного регистра). А когда с "Б" работаешь в "А" что записано?[/uquote]
Да и в "A" и в "B" подсовываю делитель "15625", в любой незаюзанный из них = ничего не залито (временно 1 МГц внутка, предмасштабатор /64, /15625 получим 1 сек.)
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

т.к. тор=ocr1a, то делитель надо записывать в "а" в любом случае.

Добавлено after 3 minutes 4 seconds:
либо тор=icr1 (режим 12) и делитель записать в icr (только ногу захвата придется заземлить, иначе делитель собьётся) в этом случае регистры "а" и "б" будут равнозначными (если оно тебе надо).
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

В таблице написано значение MAX (что не есть значение TOP). Получается в "A" можно/нужно записывать значение FFFF или не меньшее чем в "B" (15625)? Иначе говоря, если "B" запустили, но "A" уже нельзя использовать "вольно" или с меньшим значением? :dont_know:
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

в режиме СТС, ТОР=OCR1A на скорость хода твоих часов может повлиять только значение в "а", значение в "б" может повлиять только на фазу (опережение/отставание прерывания б от прерывания а) если "б" меньше или равно "а". если б>а то прерывание б вообще не будет вызываться.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Нда, ребят, вот вам и "2 равноценно независимых..." :))) Практика показала, включаем только "B", в "A" просто лежит...:
1) ...делитель тоже что и в "B" = светодиод мигает посекундно/нормально
2) ...FFFF = светодиод мигает с интервалом в несколько секунд
3) ...меньше чем в "B" = процесс не идёт
Спс за разъяснения. Я бы это назвал функцией "удешевлённо-битого контроллера"... :)))
Ответить

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