Страница 163 из 400

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

Добавлено: Чт окт 18, 2012 09:10:28
xkp
щас ведутся испытания программы. вывод на LCD значение счетчика. на входе генератор (меандр). при частотах ниже 15 кГц, если быть точным ниже 14878 Гц, работает не корректно. что в протеусе, что в реале. значение на индикаторе плавает. МК тактируется временно от внутреннего RC на 8 мГц.

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

Добавлено: Чт окт 18, 2012 09:22:39
GP1
все логично, поскольку у тебя значение счетчика сильно зависит от значения ICES, попробуй сделать как я описал.

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

Добавлено: Чт окт 18, 2012 09:31:42
xkp
так я же обнуляю счетчик при переднем фронте, а по заднему беру значение.
логика примерно:

прерывания:
если передний фронт обнуляем счетчик TCNT1L TCNT1H
иначе берем значение из ICR1L ICR1H в r24 r25
выход из прерываний.

в основном цикле программы примерно два раза в секунду вывожу на LCD значение r24 r25 перекодированные в десятеричный формат.

PS. дополнение к предыдущему сообщению. значение плавает от 0 до 65000. плывет примерно по 2000-3000 (зависит от частоты) в порядке возрастания от 0 до 65000.

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

Добавлено: Чт окт 18, 2012 10:21:50
akl
Не нашел в проге очистку флагов.

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

Добавлено: Чт окт 18, 2012 10:28:10
xkp
каких именно флагов? в проге меняется только флаг отвечающий за то по какому фронту вызывается прерывание
СпойлерTIM1_CAPT:         ;прерывания
***
   in tmp,tccr1b      ;берем для установки бита
   ori tmp,(1<<ices1)   ;устанавливаем бит ICES1
   out tccr1b,tmp      ;устанавливаем
   rjmp out_tim      ;на выход
onn:
***
   in tmp,tccr1b      ;очищаем бит ICES1
   andi tmp,$ff-(1<<ices1)
   out tccr1b,tmp
out_tim:
   reti            ;выход с прерываний
там же очистка счетчика
СпойлерTIM1_CAPT: ;прерывания
***
onn:
clr tmp ;очищаем счетчик
out tcnt1l,tmp ;младший
out tcnt1h,tmp ;старший
***
out_tim:
reti ;выход с прерываний

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

Добавлено: Чт окт 18, 2012 10:53:58
akl
Регистр флагов требования прерываний. Контроллер ведь не знает, что ему на вход шлепает и устанавливает флаги независимо от программы.
Спойлер
TIFR_MEGA32.GIF

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

Добавлено: Чт окт 18, 2012 11:07:59
GP1
akl писал(а):Не нашел в проге очистку флагов.
тоже не вкурил причем здесь это :dont_know:

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

Добавлено: Чт окт 18, 2012 11:15:46
xkp
а вот тут начинается интетресное...
в инициализации поставил
Спойлерcap_init: ;инициализация прерываний
ldi tmp,$41 ;ICES1=1 CS1=1
out tccr1b,tmp
ldi tmp,$20 ;TICIE=1
out timsk,tmp
ldi tmp,$10 ;OCF1A=1
out tifr,tmp

ret
странно но этой командой он обнуляет (!) этот бит (OCF1A). устанавливается же этот бит сам когда устанавливаем timsk.
но что более странно - вроде заработало.

ЗЫ. нет. все таки не работает. если в прерываниях стоит
СпойлерTIM1_CAPT: ;прерывания
in tmp,tccr1b ;берем для сравнения
sbrc tmp,ices1 ;смотрим бит ICES1
rjmp onn ;если 1 то на метку
in tmp,icr1l ;если 0 то запоминаем значения
sts timel,tmp ;из памяти потом выводим на индикацию
in tmp,icr1h
sts timeh,tmp ;из памяти потом выводим на индикацию
***
то значения плавают от 0 до 65000
если поменять младшие со старшими
СпойлерTIM1_CAPT: ;прерывания
in tmp,tccr1b ;берем для сравнения
sbrc tmp,ices1 ;смотрим бит ICES1
rjmp onn ;если 1 то на метку
in tmp,icr1h
sts timeh,tmp ;из памяти потом выводим на индикацию

in tmp,icr1l ;если 0 то запоминаем значения
sts timel,tmp ;из памяти потом выводим на индикацию
***
то выводит только значения до 255, потом начинает с 0.

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

Добавлено: Чт окт 18, 2012 11:40:52
GP1
вообще не понял :shock:
каким боком флаг совпадения влияет на работу захвата, кто-нибудь растолкуйте старому маразматику

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

Добавлено: Чт окт 18, 2012 11:46:01
akl
При чем здесь чистка флага сравнения OCF1A? Нужно чистить ICF1.

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

in tmp,icr1h
sts timeh,tmp ;из памяти потом выводим на индикацию

in tmp,icr1l ;если 0 то запоминаем значения
Нормальное чтение 16-разрядных регистров периферии отменили?

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

Добавлено: Чт окт 18, 2012 11:47:40
GP1
для чего?
при выходе по reti он сам очистится

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

Добавлено: Чт окт 18, 2012 11:48:59
xkp
не знаю при чем тут чистка OCF1A, но работает программа иначе с очисткой, нежели без очистки. флаг ICF1 устанавливается сам при наступлении прерывания и очищается сам при прыжке на подпрограмму прерываний.

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

Добавлено: Чт окт 18, 2012 11:54:49
akl
Совершенно верно, но при инициализации или после возврата из
xkp писал(а):в основном цикле программы примерно два раза в секунду вывожу на LCD значение r24 r25 перекодированные в десятеричный формат.
входная частота этот флаг установит, т.к. за полсекунды пройдет много периодов.

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

Добавлено: Чт окт 18, 2012 12:00:14
xkp
весь проект в АВР студии + протеус. на вход можно повесить генератор CLOCK называется в протеусе
test.rar
(64.08 КБ) 139 скачиваний
так же картинки тестовой платы
Спойлер
общая.JPG
(81.03 КБ) 157 скачиваний
эта нас не интересует.JPG
(62.44 КБ) 122 скачивания
значение счетчика.JPG
(57.3 КБ) 120 скачиваний

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

Добавлено: Чт окт 18, 2012 13:02:59
akl
Сделал бы, примерно, так
Спойлер

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

	CLR	R0
	LDI	R20,$40		; подготовка к CAPT
	OUT	TCCR1B,R20	;
	LDI	R20,$20		;
	OUT	TIMSK,R20	;
	OUT	TCCR1A,R0
	OUT	TCNT1H,R0
	OUT	TCNT1L,R0
;	LDI	R21,$41
	LDI	R22,$01
	SER	R20
	OUT	TIFR,R20

	CLT
	SEI
main:
	BRTC	MAIN
	CLI
	CLT
;	.......
;	.......
;	.......
;	.......
;	.......
;	.......
;	.......
;	.......
;	.......
	RJMP	RESET
TIM1_CAPT:
	TST	R22		; начало импульса
	BREQ	CAPT_END	; уже конец
	OUT	TCCR1B,R22	; да, начало. Старт таймера Т1 с разрешенным захватом по концу импульса
	CLR	R22		; сброс признака начала импульса
	RETI
CAPT_END:
	OUT	TCCR1B,R0	; 
	IN	R25,ICR1L
	IN	R24,ICR1H
	SET
	RETI

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

Добавлено: Чт окт 18, 2012 13:08:30
xkp
r22 в прерываниях сбрасывается и больше ни где не устанавливается

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

Добавлено: Чт окт 18, 2012 13:22:03
GP1
akl
у тебя после первого окончания импульса таймер остановится и все...
да и счетчик в таком случае сбрасывать надо.

почему отвергают мой метод - :dont_know:
счетчик крутится непрерывно, просто в определенные моменты считываем значения и все, куда уж проще?

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

Добавлено: Чт окт 18, 2012 13:50:47
akl
Как я понял xkp меряет длительность одного импульса, делает преобразования, выводит куда-то и ВОЗВРАЩАЕТСЯ обратно. Тоже самое делает мой кусок кода, правда, он возвращается на RESET (так, на всякий случай). По поводу запущенного таймера. Сам активно пользуюсь этим. Например, в CL_LED2313 все действия разворачиваются на фоне непрерывно работающего таймера Т1, который и измеряет и динамическую индикацию осуществляет.

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

Добавлено: Чт окт 18, 2012 14:02:49
GP1
akl писал(а):Как я понял ...
да трудно понять человека, который сам не знает чего хочет, а все экстрасенсы ушли на ТНТ
:)

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

Добавлено: Чт окт 18, 2012 14:10:05
xkp
GP1, ваш метод, как я понял, вычитать из старого значения счетчика - новое. завтра попробую. или вечером. сейчас уже голова болит от испытаний.
akl, выход после всего на ресет не есть хорошо. так как в программе после ресета будут стоять кучи инициализаций, чтение eeprom, все вместе по времени займет около 1-2 секунд. нужно замерять постоянно с N-переодичностью, думаю около 30 раз в секунду.