Делитель/умножитель ШИМ

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):он с переменной data сначала сделает сдвиг
не с переменной, а с её значением. он возьмет значение из переменной, сдвинет его и... содержимое переменной не поменяется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот такие нюансы должны где-то в мануалах на Си описываться с особым акцентом. ))) Иначе можно много раз прочитать и не обратить внимание, что переменная не портится.
Станислав
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вообще говоря, это такие АЗЫ, что описывать их никакого смысла еще детальнее нет.
выражения - это основа основ!
вы же не считаете, что в математическом уравнении Y = X/2 + X портится значение Х? с чего вдруг в программном выражении оно попортится?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Ну как бы да, т.к. слева от присваивания стоит coefficient, то меняться будет только он. Также как и в математике.
Вообще всё это определено как lvalue и rvalue и про них пишут в стандартах и учебниках.... только там настолько много нюансов, что всё гораздо сложнее. Лучше в это пока не лезть )
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Ну, вот как-то так получается, что уже не раз читаю про Си в разных источниках, начиная с нуля постоянно. Однако эта информация до меня так и не дошла. Либо я не так читаю, либо не так написано.
Как я всегда понимал, что переменную можно испортить везде. В том числе в цикле.
Станислав
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

испортить её можно, это так. но умышленно.
например, оператор ++ или -- "портит" переменную, поэтому в одном выражении нельзя использовать переменную с этим оператором и без оного - компилятор не поймет, что делать первее.
еще портит переменную оператор =, но это и логично: присваивание значения по определению уничтожает предыдущее значение.
можно попортить переменную через указатель, но, опять-таки, в одном выражении использовать и испортить переменную будет непросто...

во всех прочих случаях содержимое переменной ИСПОЛЬЗУЕТСЯ, но НЕ МЕНЯЕТСЯ внутри одного и того же выражения.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 19061
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

и опять же флот тут вообще не нужен, всё можно сделать в целых числах.
СКАЗОЧНИК, набираешь переключателями ЦЕЛОЕ число, равно количеству десятых.
если нужно делать умножение, то свое число умножаешь на число с порта, потом делишь на 10.
если нужно делать деление, то свое число сначала умножаешь на 10, потом делишь на число с порта.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Да, согласен. Можно сделать было кучей разных способов. ) Но у меня заработало так.

В любом случае на ус стараюсь намотать все , о чем мне здесь говорили.
Станислав
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Собрал все в железе. Работает. Даже вполне идеально. Но...
Есть пара нюансов. Первый, это воткнуть ВотчДог таймер, чтобы когда хватаешь плату руками и сбиваешь генерацию от кварца, не зависало все. А само перезагружалось и работало дальше.
Второй - это косяк в том, что таймер по захвату не самый лучший вариант. Т.к. он в отсутствии импульсов на входе тупо не может получить захват. И продолжает выдавать на выходе то, что было в переменных до этого. Как его скидывать не придумал еще.

З.Ы. Тойотовский тахометр кладет стрелку в 7000 оборотов при 700 Гц. )))) При 100 Гц показывает примерно 1000 оборотов. (значения приблизительные, т.к. точно не измерялись). Но умножает на 7 вполне четко.
Станислав
Модератор
Аватара пользователя
Сообщения: 19061
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

я вижу, что он умножает на 10 (из 700 Гц делает 7000), а не на 7.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

СКАЗОЧНИК,
2ой нюанс решается по переполнению прерыванием. Сработало переполнение - значит нет на входе ничего (или слишком малая частота) - тогда останавливаем генерацию выхода.
Ну а первый просто надо настроить вотчдог на адекватный интервал и где-то в вашей выходной генерации сбрасывать.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Не. Умножает он на 7. На вход тахометра подавали 100 Гц. И тахометр показывал 1000 оборотов. Потом те же 100 Гц пропустил через свое устройство с умножением в 7 раз. На выходе получилось 700 Гц. А на тахометре стало 7000 оборотов.
Станислав
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

По поводу отсуствия входа, кусок кода опять же из моей проги для ПИКа:

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

    // Timer1 overflow
    if (PIR1bits.T1IF) {
        inval.word = 0;
        flag.t1ovf = true;
        TMR1 = 0;
        T1IF = 0;
    }
Это в прерывании - у ПИКа один вектор прерывания, в нём флаги надо проверять, чтобы понять какое прерывание произошло. И вот PIR1bits.T1IF соб-но флаг переполнения таймера1, на котором захват. inval.word - это я сбрасываю соб-но захваченное значение до 0 (не обязательно) и потом поднимаю флаг t1ovf - что у меня было переполнение таймера. Его и проверяю дальше в основном цикле:

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

        // Input overflow condition (too low freq or not changing)
        if (flag.t1ovf) {
            OUT = 0;
            flag.inrun = false;

            // Stop Timer0
            T0IE = 0;
        }
И соб-но останавливаю таймер0, который генерит выходной сигнал и выход перевожу в низкий уровень. Ну и снимаю бит флага flag.inrun, что у меня означает что на входе нет сигнала (и это в других местах кода позволяет пропускать некоторые вещи).
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

У меня основной цикл пустой вообще.. Думаю именно по Вашему предложению и сделать. Только по переполнению Т1 вызывать прерывание, в котором тупо обнулять обе переменные. И пусть делит ноль на коэффициент. Так можно? И выводит его дальше в порт. Просто получится ноль на выходе.
Т1 по переполнению настроить как самая медленная входная частота. И в прерывании по захвату обнулять счетчик таймера. (он и так обнуляется, когда записывает в переменные длину импульса и длину паузы), а если завис (не может поймать очередной фронт импульса, то счетчик переполнится и сработает прерывание по переполнению. Ну ли по сравнению с заданным значением. Без разницы.

Добавлено after 2 minutes 57 seconds:
А если точнее, то Т1 у меня свой счетчик никак не использует вообще. Значит буду его тупо сбрасывать, чтобы переполнение в штатной работе не происходило.

Добавлено after 7 minutes 9 seconds:
И даже не сбрасывать а обновлять такое значение, чтобы переполнение происходило с частотой в 1-2 Гц. Тогда нижняя частота будет ограничена этой частотой с которой он тупо на выходе будет выдавать ноль. И ронять стрелку тахометра.

Добавлено after 3 minutes 3 seconds:
Вотчдог настроить на 500 мс. И в выходном таймере Т0 все время его сбрасывать. если МК завис, то выхода не будет. Вотчдог переполнится и все перезагрузит.
Станислав
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Пните пожалуйста.

Если у меня частота 20 МГц. Я настраиваю таймер1 по переполнению каждые 500 мс.

Выбираю делитель 256. В нормальном режиме он считает вверх, значит значение изначальное в счетный регистр закидываю 26473?

Добавлено after 59 minutes 53 seconds:
И правильно ли я настроил ВотчДог?

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

#include <avr/wdt.h>


int main(void)   
{
         wdt_enable(WDTO_1S);

         while (1)
				{   	 		  
				}       	
} 	     

ISR(TIMER0_OVF_vect)												
{
	wdt_reset();
}
Добавлено after 3 minutes 59 seconds:
Это огрызок кода. Частота задифайнена раньше всех.
Станислав
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18767
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 19061
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

СКАЗОЧНИК писал(а):А если точнее, то Т1 у меня свой счетчик никак не использует вообще
как же не используется? Т1 делает захват, и по его счетчику определяется период сигнала.
СКАЗОЧНИК писал(а):Значит буду его тупо сбрасывать, чтобы переполнение в штатной работе не происходило.
не нужен тебе ватчдог, пусть Т1 переполняется - прошел Т1 полный оборот, значит, не было захвата. и по прерыванию от переполнения Т1 отправляем ноль на выход.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

У меня изначально Т1 по захвату не использовал свои регистры.... Он тупо по захвату уходил в прерывание, где использовал Т0.... Не могу пока подробно объяснить. Я измеряю от фронта до фронта не самим захватом Т1, а количеством переполнений Т0.... А Т0 переполняется каждые 12 мкс. Т.е. он задает системные тики, от которых идет расчет и периода и вывода импульсов... Я выкладывал в начале ссылку на такую реализацию умножителя на Тини13.
ВотчДог мне нужен тупо для надежности от зависания МК. Если кто-нибудь при настройке возьмется руками за выводы кварца, чтобы он сам перезагрузился.

Переполнения Т1 каждые 500 мс у меня используются для отслеживания того, что входные импульсы пропали (т.е. машину заглушили) в нем он просто роняет стрелку тахометра в ноль.

Таймер1 вроде точно правильно настроил. В Протеусе работает. В железе буду проверять через пару часов. Вывел светодиод на одну ногу порта Д, чтобы отслеживать прерывания по переполнению Т1. Сбрасывается счетный регистр Т1 у меня в прерывании по захвату. ))) Когда есть входные импульсы, он все время выставляет новое значение 26473. Если входных нет, то он переполнится и сбросит выходные переменные в ноль. На выходе тоже будет ноль.

Остался вопрос во ВотчДогу. Правильно ли он настроен? ВотчДог сбрасывается в прерывании Т0 каждые 12 мкс. Если МК повис, то и Т0 не считает, а значит ВотчДог переполнится через секунду. И перезагрузит все.

Добавлено after 3 minutes 2 seconds:
Да! Огромное СПАСИБИЩЕ, что помогаете мне постигать азы программирования микроконтроллеров. ) Здоровья Вам всем и денег побольше!
Станислав
Модератор
Аватара пользователя
Сообщения: 19061
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

СКАЗОЧНИК писал(а):Если у меня частота 20 МГц. Я настраиваю таймер1 по переполнению каждые 500 мс.

Выбираю делитель 256. В нормальном режиме он считает вверх, значит значение изначальное в счетный регистр закидываю 26473?
20 МГц - это период 0,05 мкс.
500 мс - это 500000 мкс.
делим 500000 / 0,05 = 10000000 (10 миллионов).
если выбрать предделитель 256, то число должно быть
10000000 / 256 = 39062,5.
округляем до 39063.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4453
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

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

Fo=20000000
TCNT1=-500*Fo/1000/256
Если использовать прерывание по сравнению и режим CTC

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

Fo=20000000
OCR1A=500*Fo/1000/256-1
Вопрос? Как записать это выражение на цэ :)
Последний раз редактировалось akl Пн мар 16, 2020 01:27:14, всего редактировалось 1 раз.
Ответить

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