Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Запуск таймера1 по совпадению таймера0


Запуск таймера1 по совпадению таймера0

Сообщений 1 страница 30 из 40

1

Здравствуйте.
Подскажите можно ли так?
Камень tiny85.
на внешнее прерывание (int0) поступают импульсы. Измеряю период сигнала (w) таймером0.
Нужно запустить таймер1 в промежутке между импульсами, ну допустим с середины (w/2) ;

P.S.: Источник сигнала 50-100 герц
http://s5.uploads.ru/t/aoeRT.jpg

Сверху (желтый) сигнал с ноги B.4
Снизу (зеленый) сигнал источник (88гц)

Никак не получается. Иногда таймер1 запускается. Но не пойму как и когда.

Код:

'Таймер0
Config Timer0 = TIMER , Prescale = 1024   
Start Timer0

'Таймер1
Config Timer1 = TIMER , Prescale = 1024
Stop Timer1

Config Int0 = Rising                                        'Прерывание

On Int0 Isr_int0
On Timer0 Isr_timer0
On Timer1 Isr_timer1                                        

Enable Interrupts
Enable Int0
Enable Timer0

Config PortB.0 = Output
Config PortB.1 = Output

Config Pinb.2 = Input

Config PortB.3 = Output
Config PortB.4 = Output

dim tic as byte
dim tmp as Integer
dim w as Integer
dim dp as Integer

Do                                                          

w=tic/2
dp=tic-15

if Timer0=w then
   Start Timer1
   Timer1=0
   toggle portb.4 'индикация старта таймера
end if

Loop

Isr_int0:
   tic=Timer0
   Timer0=0
Return

Isr_timer0:
Return

Isr_timer1:
toggle portb.3 
Return

Отредактировано Gizmo3d (2019-03-14 13:23:09)

0

2

Enable Timer1 может этого не хватает

0

3

"Enable Timer1" - это же включение прерывания по переполнению таймера1??? Оно не влияет на запуск таймера же!?

0

4

Ну я всегда думал, что это разрешение работы таймера.

0

5

Gizmo3d написал(а):

Измеряю период сигнала (w) таймером0.Нужно запустить таймер1 в промежутке между импульсами, ну допустим с середины (w/2)

Как так можно ?
"Измеряю" период сигнала...
Вы его еще не "измерили", а уже отыскиваете "допустим с середины"...
;)

0

6

Из хелпа баскома

ENABLE

Action

Enable specified interrupt.

(ATTINY, ATMEGA, ATXMEGA)

Syntax

ENABLE interrupt [, prio]

0

7

Nord написал(а):

Как так можно ?

Ну в первый раз промажу, следующие измерения должны быть верными? Таймер1 можно запускать позже, главное в промежутке....

Изменение частоты довольно плавное... Можно определять длину предыдущего периода, а запускать уже в последующем.

Отредактировано Gizmo3d (2019-03-14 14:22:55)

0

8

Замеряем период силами timer0.
Сохраняем значение, отчитанное таймером.
Делим сохраненное значение на 2.
При следующем отсчете timer0, достигнув этого значения, запускаем timer1.

0

9

Nord написал(а):

Замеряем ..., Сохраняем ..., Делим ..., запускаем timer1.


абсолютно верно... Но почему не работает?

Отредактировано Gizmo3d (2019-03-14 14:34:40)

0

10

pchela5 написал(а):

Таймер1 - восьмибитный, а сравниваете вы его с Integer - считаю это неправильным. Сколько максимальное и минимальное значение может таймер0 насчитать? Если делите на 2, то явно не будет больше байта. Потом вычитание - вы можете убежать в минус. Требуется тактовая частота, предделитель и входная частота. В зависимости от этого оперировать одинаковыми типами данных.

0

11

Gizmo3d написал(а):

Nord написал(а):Замеряем ..., Сохраняем ..., Делим ..., запускаем timer1.

абсолютно верно... Но почему не работает?

:dontknow:
Помозгуем... ;)

0

12

МК attiny85. Тактовая 8 МГц (от внутреннего RC). Предделитель  1024. То есть переполнение через 32,768 мс... При частоте 50-100 Гц это примерно 80...160 тактов таймера0

pchela5 написал(а):

вы можете убежать в минус

Пока не до минуса... просто делю. Замена типа переменной ничего не дает... Изначально тип был байт, уже позже поменял на целое.

Отредактировано Gizmo3d (2019-03-14 15:32:52)

0

13

Gizmo3d написал(а):

"Enable Timer1" - это же включение прерывания по переполнению таймера1??? Оно не влияет на запуск таймера же!?

На запуск не влияет, но вот это

Isr_timer1:
toggle portb.3
Return

работать не будет...

0

14

Nord написал(а):

работать не будет...

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

Можно конечно на таймере0 организовать прерывание по совпадению (СТС) и запускать таймер1 в прерывании, но тогда как длину периода считать? Таймер0 при этом будет обнуляться при совпадении. Можно ли организовать прерывание по совпадению без сброса таймера0?

Отредактировано Gizmo3d (2019-03-14 15:51:44)

0

15

Из первого сообщения:

Gizmo3d написал(а):

P.S.: Источник сигнала 50-100 герц
Сверху (желтый) сигнал с ноги B.4
Снизу (зеленый) сигнал источник (88гц)

Чем генерируется этот сигнал ?

0

16

Nord написал(а):

сигнал ?

Программой. Переключатся при старте таймера1.

if Timer0=w then
   Start Timer1
   Timer1=0
   toggle portb.4 'индикация старта таймера
end if

0

17

Gizmo3d написал(а):

toggle portb.4 'индикация старта таймера

Почему тогда уровень не держится устойчиво, а имеет импульсную форму ? ;)

Я к чему веду-то...
Возможно, что и все правильно работает, но данный св/д мешает анализу работы ?
Судя по осциллограмме, программа отрабатывает адекватно ТЗ...

0

18

тоже не пойму... возможно в момент сравнения успевает измениться w... Но это не очень важно... Условие выполнятся не каждый период внешнего сигнала, а как вздумается... может раз в секунду но обычно реже...

Вот переключил порт В.4 на срабатывание внешнего прерывания.
http://s7.uploads.ru/t/SHBIo.jpg

Отредактировано Gizmo3d (2019-03-14 16:30:16)

0

19

Gizmo3d написал(а):

if Timer0=w then

Это неправильно. Есть вероятность что условие вообще не сработает или сработает несколько раз.
Таймеры поддерживают режимы захвата и сравнения. Их нужно использовать.

0

20

Пётр написал(а):

Это неправильно.

Как организовать таймер0, чтоб срабатывало прерывание по совпадению и чтоб при этом счет не сбрасывался?

0

21

В аттини85 нет захвата. Я первым делом слазил в даташит, ибо мерить период лучше захватом. Вообще, конечно, по первому условию: середина цикла Т1 - надо запускать таймер1 в режиме ШИМ, по второму условию - Т1+ N времени - выключать. В принципе, описанный вами режим работы подобен диммеру ламп накаливания и я бы организовал его схожим образом: в прерывании сохраняем значение таймера 0, сбрасываем, считаем снова. в основном цикле постоянно опрашиваем таймер 0 и когда его значение превысит рассчитанный порог - запускаем шим на таймере1, как только перешло второе пороговое значение - выключаем шим. Т.к. частота плавает, то есть резон организовать массивчик на 8-16 значений и высчитывать плавающее среднее.

Отредактировано pchela5 (2019-03-14 16:50:25)

0

22

Gizmo3d написал(а):

Вот переключил порт В.4 на срабатывание внешнего прерывания.

Уже веселее...
Сделайте Config Int0 = Change
Получите два прерывания (например):
- по спаду уровня запускаем таймер
- по возрастанию останавливаем...

Запоминаем "насчитанное" и далее, как планировалось раньше... ;)

0

23

А если стартовать Т1 по СТС0 и в этом же прерывании продолжить работу Т0 с момента прерывания по совпадению?

0

24

Nord написал(а):

Сделайте Config Int0 = Change

ну это только для варианта запуска в середине...

0

25

Gizmo3d написал(а):

ну это только для варианта запуска в середине...

А тут уж как понравится...
Можно второй таймер стартовать "внутри" действующего "исходного" импульса сигнала, можно в паузе...
Главное - в "руках" будет фактическое количество "неких отчитанных попугаев", от которых можно плясать.

0

26

pchela5 написал(а):

опрашиваем таймер 0


В программе выше так и сделано.... или я что-то не понял.
условие опроса Т0 не работает как хотелось бы.

0

27

Большое всем спасибо... буду проверять все идеи

0

28

Gizmo3d написал(а):

Как организовать таймер0, чтоб срабатывало прерывание по совпадению и чтоб при этом счет не сбрасывался?

Если закрыть глаза на отсутствие данного регистра в тине85, о чём я писал выше, то при совпадении таймер считает дальше, пока не переполнится. В даташитах это написано на буржуйском, у Евстифеева на русском.

0

29

Gizmo3d написал(а):

В программе выше так и сделано.... или я что-то не понял.
условие опроса Т0 не работает как хотелось бы.

Я бы написал по другому:

в прерывании сделаем вычисления, благо их там всего два - деление на 2 - порог Б и вычитание 15 - порог А. Переменные - байт!!!

В основном цикле:
do

select case Timer0
         
         case Порог А (так как меньше) : включаем ШИМ на таймере1
         case Порог Б (так как больше) : выключаем ШИМ на таймере1

end select

loop

PS У меня 220В диммер на PIC10F200 так работает, а там один таймер и озу 16 байт

Отредактировано pchela5 (2019-03-14 17:10:51)

0

30

Обсуждение занятное и полезное, но, если конечно, не секрет, то хотелось бы узнать конечную цель шаманства... ;)
Возможно, есть другие решения ?
Пока последовательные включения событий предыдущими событиями не совсем понятны практически... ;)

+1


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Запуск таймера1 по совпадению таймера0