Страница 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 писал(а):Не нашел в проге очистку флагов.
тоже не вкурил причем здесь это

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
вообще не понял
каким боком флаг совпадения влияет на работу захвата, кто-нибудь растолкуйте старому маразматику
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 называется в протеусе
так же картинки тестовой платы
Спойлер
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
у тебя после первого окончания импульса таймер остановится и все...
да и счетчик в таком случае сбрасывать надо.
почему отвергают мой метод -
счетчик крутится непрерывно, просто в определенные моменты считываем значения и все, куда уж проще?
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 раз в секунду.