Например TDA7294

Форум РадиоКот • Просмотр темы - Таймеры/счётчики в AVR
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вт авг 04, 2020 02:48:17

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1133 ]     ... , , , 49, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт сен 06, 2018 15:44:02 
Друг Кота
Аватар пользователя

Карма: 39
Рейтинг сообщений: 1453
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 4710
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
да.

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 17:30:00 
Открыл глаза

Зарегистрирован: Пн июл 28, 2014 20:23:22
Сообщений: 50
Рейтинг сообщения: 0
Даже не знаю в какую тему писать но по смыслу сюда. Ни у кого не бывало, что прерывание срабатывает не как положено, например на atmega8 16 битный таймер настроен на срабатывание по переполнению раз в 10 сек, все прекрасно работает. меняешь кварц, соответственно меняешь настройки частоты камня, I2C, UART. И прерывание работает но не так. TCCR1B|=((1<<CS12)|(1<<CS10)); TCNT1=29535; кварц 3,6864МГц, но срабатывает не раз в 10 сек, а в 18, то есть полный перебор с 0. Сделано в атмел студио. Может кто помочь объяснить что не так? Кстати, 8 битный таймер также начал филонить аналогично.
TCCR0|=((1<<CS02)|(1<<CS00)); //предделитель 1024, срабатывает раз в (1/3686400)*1024*255=0,0708(3) секунды, для 0,02с нужно записать tcnt0=183 раз в 0,02с ровно;
TIMSK |= (1<<TOIE0); // разрешить прерывание по переполнению таймера счетчика 0;
TCNT0=183; //начало счета от 183;


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 17:40:27 
Собутыльник Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 641
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2631
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Потому что тайме будет считать до 65535 и затем обнулится и начнет считать с начала, с нуля, а не с 29535.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Шестое юбилейное мероприятие в процессе
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 17:52:47 
Прорезались зубы

Карма: 1
Рейтинг сообщений: 32
Зарегистрирован: Вс дек 28, 2014 21:54:05
Сообщений: 238
Рейтинг сообщения: 0
У таймера1 есть режим СТС.

_________________
Я всё-всё узнAю и стану профессором.


Вернуться наверх
 
Вебинар «Каждому ключу — свой драйвер» (13.08.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре, который будет посвящен теме драйверов управления транзисторами компании Infineon. Мы рассмотрим четыре различных технологии изготовления микросхем драйверов, в чём их отличия и особенности.

Зарегистрироваться на вебинар>>
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 17:57:15 
Друг Кота

Карма: 60
Рейтинг сообщений: 64
Зарегистрирован: Ср янв 02, 2013 08:37:35
Сообщений: 3550
Рейтинг сообщения: 0
Всё верно… используете таймер 16 разрядный, а в формуле 255 вместо 65535… потому так и получается.


Вернуться наверх
 
Меньше не бывает: неизолированные микро-DC/DC нового поколения R4 от Mornsun

Компания Mornsun разработала серию R4 неизолированных импульсных стабилизаторов напряжения в новом миниатюрном конструктивном исполнении. Уменьшение коснулось не только размеров, на 80% меньше существующих преобразователей, но и стоимости.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 18:07:03 
Открыл глаза

Зарегистрирован: Пн июл 28, 2014 20:23:22
Сообщений: 50
Рейтинг сообщения: 0
Всем спасибо кто ответил. Походу камешек сдох - прописал так:
TCNT1 =29535;
USART_Transmit(contr);
USART_Transmit(TCNT1H);
USART_Transmit(TCNT1L);
так он переменную правильно передает - а значение регистра равно 0.
То есть он просто напросто его не записывает.
перезапись, стирание, сброс настроек - не работает.
придется попаять.
PS
1.Z_h_e - раньше работало и не сбивалось, было все четко.
2.dgrett - СТС - не мое.
3.АСУ - насчет 255 - это относится к таймеру 8 битному, на нем тоже самое.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 18:09:11 
Друг Кота

Карма: 60
Рейтинг сообщений: 64
Зарегистрирован: Ср янв 02, 2013 08:37:35
Сообщений: 3550
Рейтинг сообщения: 0
3.АСУ - насчет 255 - это относится к таймеру 8 битному, на нем тоже самое.

Да... я не туда посмотрел... :)


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Вс ноя 04, 2018 18:15:26 
Собутыльник Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 641
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2631
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Mixail_BM писал(а):
1.Z_h_e - раньше работало и не сбивалось, было все четко.
ну тогда ладно

Добавлено after 5 minutes 56 seconds:
Mixail_BM писал(а):
USART_Transmit(TCNT1H);
USART_Transmit(TCNT1L);
Из серии раньше работало. Еще поглядите как нужно правильно считывать значение 16битного счетчика в разделе "Accessing 16-bit Registers"

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Бытовой пирометр АКИП-9312 – просто удобно!

Диапазон 35 °С ...42°С (температура тела) погрешность 0,3 °С
Диапазон 0 °С ...100°С (бытовая сфера) погрешность 1,0 °С
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пн ноя 05, 2018 10:41:36 
Открыл глаза

Зарегистрирован: Пн июл 28, 2014 20:23:22
Сообщений: 50
Рейтинг сообщения: 0
Потому что тайме будет считать до 65535 и затем обнулится и начнет считать с начала, с нуля, а не с 29535.


Прошу прощенья, вы были правы. Надо вводить при каждом прерывании. Но он, зараза так хорошо работал.
Нашел на одном сайте, что TCNT1 =29535; надо вводить в самом начале прерывания, первой строчкой. Теперь все отрабатывает


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср ноя 07, 2018 12:20:35 
Потрогал лапой паяльник

Карма: 7
Рейтинг сообщений: 78
Зарегистрирован: Чт июл 11, 2013 12:37:39
Сообщений: 377
Рейтинг сообщения: 0
Всем привет.
Я тут пытаюсь разобраться с Timer/Counter1 (ATmega16), режим CTC, вывод OC1A устанавливается в "1", когда TCNT достигнет заданного значения в OCR1A.
Пользуюсь AVRStudio 4.06, в железе пока не проверял.

Запускаю счетчик так:
Код:
in      temp,TCCR1A
sbr      temp,0b11000000   ;При совпадении (CTC) вывод OC1A устанавливается в "1"
out      TCCR1A,temp

ldi      temp,$01
out      OCR1AH,temp
ldi      temp,$FF
out      OCR1AL,temp

in      temp,TCCR1B
sbr      temp,0b00001001   ;Режим CTC. Тактовая частота CK/1
out      TCCR1B,temp

Когда счетчик TCNT досчитывает до заданного значения, вывод OC1A устанавливается в "1".

После срабатывания счетчика, запрещаю его работу:
Код:
in      temp,TCCR1B
cbr      temp,0b00001001   ;Обнулить биты
out      TCCR1B,temp

clr      temp
out      TCNT1H,temp      ;Очистить счетчик
out      TCNT1L,temp

in      temp,TIFR
sbr      temp,0b00010000   ;Сбросить флаг OCF1A
out      TIFR,temp

Подскажите, как правильно сбрасывать пин PD5 (OC1A)?

cbi PortD,5 - результата не дает.
cbi PinD,5 - пин порта сбрасывается. По крайней мере, в AVRStudio...

Следующий код сбрасывает вывод PD5 в ноль:
Код:
      in      temp,TCCR1A
      cbr      temp,0b11000000   ;Обнулить биты COM1A1 и COM1A0
      out      TCCR1A,temp

Еще можно принудительно изменить состояние вывода OC1A путем записи "1" в FOC1A регистра TCCR1A, но тогда надо перенастраивать этот TCCR1A... Что-то у меня с этим ничего не получилось. Перенастраивал по-всякому, пин PD5 не сбрасывается.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср ноя 07, 2018 12:49:47 
Друг Кота

Карма: 55
Рейтинг сообщений: 781
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3751
Откуда: Ижевск
Рейтинг сообщения: 0
Не хватает SBI DDRD,5. Тогда и CBI PORTD,5 заработает, когда уберете COM1A1, COM1A0.


Последний раз редактировалось akl Ср ноя 07, 2018 17:53:21, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср ноя 07, 2018 15:51:18 
Потрогал лапой паяльник

Карма: 7
Рейтинг сообщений: 78
Зарегистрирован: Чт июл 11, 2013 12:37:39
Сообщений: 377
Рейтинг сообщения: 0
Не хватает SBI DDRD,5.
5-ый пин порта D у меня на выход настроен (все согласно даташита), и в "0" сброшен.

Тогда и CBI PORTD,5 заработает, когда уберете COM1A1, COM1A0.
Когда я убираю COM1A1, COM1A0, вывод PD5 сам сбрасывается в ноль и дополнительная команда CBI PORTD,5 не нужна.

CBI PIND,5-режим переключения в новых камнях, у ATmega16 не работает.
AVRStudio 4.06 как бы не очень новая и m16def.inc от сентября 2001-го. ATmega16 тогда не очень-то и старая была. Странно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср ноя 07, 2018 17:04:05 
Друг Кота

Карма: 55
Рейтинг сообщений: 781
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3751
Откуда: Ижевск
Рейтинг сообщения: 0
Вам кодом был показан вариант сброса PD5/OC1A ATmega16.
Старые камни или новые не суть. Главное, чтобы была объявлена возможность
Цитата:
Toggling the Pin
Writing a '1' to PINxn toggles the value of PORTxn, independent on the value of DDRxn. The SBI instruction can be used to toggle one single bit in a port.

У mega16(a) такого режима нет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Ср ноя 07, 2018 19:15:12 
Потрогал лапой паяльник

Карма: 7
Рейтинг сообщений: 78
Зарегистрирован: Чт июл 11, 2013 12:37:39
Сообщений: 377
Рейтинг сообщения: 0
Вам кодом был показан вариант сброса PD5/OC1A ATmega16.
Как я понял, пин PD5 вы очищаете так же, как и я - обнулением TCCR1A (+очистка OCF1A), что и требовалось подтвердить. Правда, зачем-то вы используете для этого ZH. У вас в нем всегда 0 что ли? :)
Код:
ldi      temp,$01
out      OCR1AH,temp
ldi      temp,$FF
out      OCR1AL,temp
   OUT   TCCR1A,ZH ;длительность 1 на PD5  30 тактов
Здесь нет явной записи ZH, т.е. в нем может быть все, что угодно. И что означает "длительность 1 на PD5 30 тактов"? А, наверное, длительность лог. единицы на пине PD5 30 тактов...

Код:
WAIT:
   SEI
   SLEEP

;   OUT   TCCR1A,ZH ;длительность 1 на PD5 14 тактов
   NOP
   RJMP   START
.EXIT
А тут что означает "длительность 1 на PD5 14 тактов"? Ок, тут тоже тогда понятно.

И много лишнего в этом коде - запрещение аналогового компаратора, режим сна, прерывания. Спасибо, конечно, но я всего этого не просил. :)
Я стараюсь более понятно писать, чтобы можно было понять свою же программу спустя годы. И уж тем более, если придется кому-то свой код показать.
Я вот МК не занимался более 10 лет и сейчас, просматривая свои программы начала 2000-х, очень самому себе благодарен за понятные комментарии, оставленные тогда к разным участкам кода. :))
У каждого своя манера писать код, и легче написать свой, чем разобраться в чужом.

А стек я вот так назначаю (в конце SRAM):
Код:
      ldi      temp,high(RAMEND)   ;назначить стек
      out      SPH,temp
      ldi      temp,low(RAMEND)
      out      SPL,temp


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт ноя 08, 2018 10:07:49 
Потрогал лапой паяльник

Карма: 7
Рейтинг сообщений: 78
Зарегистрирован: Чт июл 11, 2013 12:37:39
Сообщений: 377
Рейтинг сообщения: 0
Не пойму, почему T/C1 по-разному считает.
Здесь у меня бесконечный цикл. В начале T/C1 настраивается и запускается. 0.5 секунды он считает; после окончания счета выставляет "1" на 5 пине порта D. После проходит еще ~0.5 сек., T/C1 останавливается и обнуляется ("0" на 5 пине порта D). И по-новой. 0.5 сек - "0", 0.5 сек - "1".
Но, почему-то, с момента, когда устанавливается TCCR1B и счетчик начинает считать, и до момента окончания счета, когда выставляется флаг OCF1A проходит разное время. 500195.00 мкс, 500156.50 мкс, 500030.50 мкс и т.д. (кварц на 4 МГц)
А если предделитель не использовать, то считает одинаково.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт ноя 08, 2018 11:52:12 
Друг Кота

Карма: 55
Рейтинг сообщений: 781
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3751
Откуда: Ижевск
Рейтинг сообщения: 1
Почувствуйте разницу. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Чт ноя 08, 2018 18:56:17 
Потрогал лапой паяльник

Карма: 7
Рейтинг сообщений: 78
Зарегистрирован: Чт июл 11, 2013 12:37:39
Сообщений: 377
Рейтинг сообщения: 0
Немножко не то, что мне нужно.
Я буду "вручную" обнулять счетчик, а в "1" он должен перебрасываться сам, по счету. То, что я выложил, это я временно так организовал код - для проверки.
Мне непонятно, почему счетчик после обнуления и нового запуска отмеряет разные интервалы времени до установки OC1A в "1".
После выполнения команды "clr r16" (в конце, перед "out TCNT1H,r16") OC1A сбрасывается в "0" и в этот момент я засекаю время (обнуляю Stop Watch). Потом ловлю момент установки OC1A в "1" (долго и муторно) и это время каждый раз разное. А почему - мне непонятно...
Формулы, типа "(5*Fo/10/64-1)" я редко когда использовал, уже и забыл, что так можно. Спасибо за подсказку.

Добавлено after 51 minute 13 seconds:
Мне посоветовали добавить в начале сброс предделителей (PSR10 в SFIOR), но ничего не изменилось:

Код:
Cycle:   ldi   r16,1<<PSR10
         out   SFIOR,r16

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

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

...


Добавлено after 1 hour 52 minutes 20 seconds:
Я переписал временнУю задержку, чтоб удобнее было отслеживать появление "1" на 5 пине порта D.
Сначала нужно обнулить Stop Watch в AVRStudio в момент, когда 5 пин очищается - после записи (0<<COM1A1)|(0<<COM1A0) в TCCR1A.
Теперь достаточно поставить курсор на оператор "nop" и нажать Ctrl+F10. Stop Watch в AVRStudio показывает разное прошедшее время.


Добавлено after 1 hour 37 minutes 18 seconds:
Заметил, что время, через которое срабатывает счетчик не гуляет бессистемно, а все время увеличивается от прогона к прогону. Сначала счетчик срабатывает через 499990.00 мкс, на следующем прогоне через 500012.50 мкс, потом через 500035.00 мкс и т.д. Дошло до 500214.50 мкс и следующая задержка уже была 499981.25 мкс и опять начала увеличиваться (500003.75 мкс ...). Все время увеличиваясь на одну и ту же величину - 22.5 мкс (90 тактов на 4 МГц).
Тогда я добавил в цикл 90 пустых команд "nop", и счетчик стал срабатывать через одинаковое время - 500223.25 мкс.
Но это же никуда не годится... Что это за 22.5 мкс такие?

Вот полная моя программа:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пт ноя 09, 2018 10:44:40 
Друг Кота

Карма: 55
Рейтинг сообщений: 781
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 3751
Откуда: Ижевск
Рейтинг сообщения: 0
Запустил программу на своей студии 4,19. Вместо 1 секунды отсчитывается 1,6832. Думаю из-за магических чисел в программе задержки.

Переделал.

Получил


Вложения:
TIME_1000002.PNG [32.9 KiB]
Скачиваний: 509
TIME_1683200.PNG [29.04 KiB]
Скачиваний: 565
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Пт ноя 09, 2018 15:43:56 
Потрогал лапой паяльник

Карма: 7
Рейтинг сообщений: 78
Зарегистрирован: Чт июл 11, 2013 12:37:39
Сообщений: 377
Рейтинг сообщения: 0
Да задержка это такое, на глаз, особой роли точность не играет.
Просто я пытаюсь понять, как работает этот T/C1. В студии 4,06 у меня вывод PD5 половину времени в "0", половину в "1" - типа меандр. А в железе это нифига не работает - на этом PD5 практически постоянно "1" и на очень короткое время появляется "0". Я светодиод повесил и видно, как он еле-еле блымкает пару раз в секунду.
Пробовал свою программку в Atmel Studio 7.0 - она подтверждает, что на выходе практически постоянно "1". И появляется она в начале цикла, после команды:
Код:
ldi   r16,(1<<COM1A1)|(1<<COM1A0)
      out   TCCR1A,r16

Потом идет задержка.
После нее, после команды:
Код:
ldi   r16,(0<<COM1A1)|(0<<COM1A0)      ;Обнулить вывод 5 порта D
      out   TCCR1A,r16

PD5 переходит в "0".
Потом идет переход в начало цикла и опять, после установки (1<<COM1A1)|(1<<COM1A0) в TCCR1A он переходит в "1".
Т.е. "0" появляется всего на несколько микросекунд, как и в железе я это вижу.
А у вас в студии 4,19 как работает? 2-3 прогона цикла сделать надо, потому что в Atmel Studio 7.0 в первом проходе "0" держится все время задержки, а потом появляется "1".
Я тут пробовал AVR Studio 5.1, Atmel Studio 6.2 и 7.0. Какие же они тяжелые в работе и неудобные...
У меня есть AVR Studio v4.16.628, попробую еще в ней.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймеры/счётчики в AVR
СообщениеДобавлено: Сб ноя 10, 2018 01:20:57 
Это не хвост, это антенна
Аватар пользователя

Карма: 17
Рейтинг сообщений: 20
Зарегистрирован: Чт апр 04, 2013 22:22:57
Сообщений: 1414
Откуда: Белгород, РФ
Рейтинг сообщения: 0
Да можно же в конфигураторе Codevision AVR мышкой пощелкать и посмотреть какие режимы доступны ))


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1133 ]     ... , , , 49, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y