Перейти к содержанию
    

Прошу подсказки по настройкам таймера Arduino Nano

10 minutes ago, haker_fox said:

Под него тоже сами писали?

Тоже сам. Я в курсе, что так не пишут, я именно поэтому и не хотел давать код. Но... МНЕ. ТАК. УДОБНО.

Если бы мне надо было писать, чтобы поделиться (или, там, сдавать проект), я бы учился, как надо писать, я бы писал согласно канонам хорошего тона программирования и проч. Но... МНЕ. ТАК. НЕ УДОБНО.

И от топика мне нужно было две вещи, которые в конечном счёте получены: во-первых, проверить настройки таймера, как я их применил (судя по вашим же словам - правильно), во-вторых, совет с симулятором. Тоже - бесспорно - полученный в первую очередь от вас (и которым я намереваюсь воспользоваться). Но ничего, кроме этого. Всё остальное - бессмысленные дебаты: вы учите меня жить, а мне это не нужно.

 

Изменено пользователем ILSF15

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, ILSF15 said:

вы учите меня жить

Да кому вы нужны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, haker_fox said:

Самодур

Не "самодур", а "сам дурак", тогда уж, будьте корректны в формулировках ))) Уж не знаю, кому я нужен, но вы настойчиво объясняете мне, что мне срочно надо выучиться. МНЕ. НЕ. НУЖНО. (Сколько ещё раз надо повтороить?) Я не программист, я не собираюсь становиться программистом, я не собираюсь клепать проекты. Я заморочился ровно одним применением валявшегося без дела контроллера. Оказалось, что нужно ещё одному человеку "поставить, чтоб работало, как у тебя", поэтому параллельно пытаюсь "запустить" второй. С той же задачей. И мой вопрос был - не перебрать код, не оценить качество, не поставить оценку читабельности, а: как настроить таймер, чтобы запускался по вызову функции, выключался по окончании функции, выдавал значение прошедшего времени в произвольный момент функции. Без прерываний. Не более. А у нас уже третья страница пошла рассказов, что я должен. Не должен. 

30 minutes ago, haker_fox said:

пусть человек сам барахтается в своём... коде

Я никого вообще не просил "барахтаться в моём... коде". Я, напомню, не хотел его выкладывать.

Я, повторяю в стопицотый раз, просил очень конкретной подсказки. Очень конкретная подсказка с горем пополам дана. Спасибо, хватит уже, а?

30 minutes ago, haker_fox said:

думает, что всё знает

А, да! Нет, не думаю. Но и не 

 

30 minutes ago, haker_fox said:

других, кто в деле не первый год, учит

а отбрыкиваюсь от ваших НЕПРОШЕНЫХ советов. За советы по делу - большое спасибо (объективно, они тоже даны, хотя как же трудно было их "заслужить"!)

Кстати, так, чисто для заметки:

5 hours ago, haker_fox said:

не переживайте по поводу вида вашего кода

30 minutes ago, haker_fox said:

в своём... коде.

 

Изменено пользователем ILSF15

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, haker_fox сказал:

Ещё и других, кто в деле не первый год, учит. ... Думаю, что пусть человек сам барахтается в своём... коде.

Поражаюсь вашему терпению, столько держались. Я таких игнорирую сразу, даже если догадываюсь, каким может быть правильный ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Сергей Борщ said:

Поражаюсь вашему терпению, столько держались

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

9 minutes ago, Сергей Борщ said:

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

И правильно делаете)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если кому-то ещё интересно, что происходит с таймером, а не обсуждение моей личности (и я всё ещё сдерживаюсь, но это уже последние остатки, да...)

Первое: большие профессионалы не обратили моего внимания на выбор предделителя ДО запуска таймера, надо было ПОСЛЕ - это раз.

Второе: большие профессионалы, видимо, тоже не в курсе, как настроить таймер на 1Mhz/1024, потому что он, судя по всему, переполняется секунд за 7 вместо ~минуты. В противном случае мне сразу бы об этом сказали. 

Третье: большие профессионалы так и не подсказали, как правильно сбрасывать счётчик, поскольку он НЕ сбрасывается. Ни до, ни после, ни перед. Вообще не сбрасывается. Начинает отсчёт оттуда, где был.

Поскольку в норме мне достаточно для функционирования 10-12 секунд непрерывного счёта, добавил переменную, которая записывает TCNT1 перед переполнением и с этого момента приплюсовывается к текущему значению timer, перед последующим переполнением (на всякий случай, хотя такого не должно быть) предусмотрена остановка алгоритма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, ILSF15 said:

Первое: большие профессионалы не обратили моего внимания на выбор предделителя ДО запуска таймера, надо было ПОСЛЕ - это раз.

Что значит ДО и ПОСЛЕ запуска. Запись значения предделителя это и есть запуск таймера.

Quote

Второе: большие профессионалы, видимо, тоже не в курсе, как настроить таймер на 1Mhz/1024, потому что он, судя по всему, переполняется секунд за 7 вместо ~минуты. В противном случае мне сразу бы об этом сказали. 

А вы уверены, что ваш МК работает на 1 МГц, раз у вас переполнение через 7 секунд ?

Если действительно 1 МГц, то 1е6 МГц / 1024 = 976 Гц

Т.е. таймер меняет свое значение на одну единицу с чатотой 976 Гц. Всего таймер может принять 65536 значений (от 0 до 65535). 

Следовательно, все 65536 значений таймер пробежит за 65536/976 Гц = 67,1 сек.

Проверьте в окне Processor поле Frequency какое значение имеет.

Quote

Третье: большие профессионалы так и не подсказали, как правильно сбрасывать счётчик, поскольку он НЕ сбрасывается. Ни до, ни после, ни перед. Вообще не сбрасывается. Начинает отсчёт оттуда, где был.

Сбрасывается. Значит в коде у вас ошибка.

Попролбуйте убрать все манипуляции с регистром PRR. Оставьте его в исходном состоянии. Т.е вообще его не трогайте.

Все переменные, которые используются в прерываниях следует объявлять с квалификатором volatile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, dimka76 said:

Запись значения предделителя это и есть запуск таймера.

PRR. Пока таймер выключен в PRR - ноль реакции.

21 minutes ago, dimka76 said:

А вы уверены, что ваш МК работает на 1 МГц, раз у вас переполнение через 7 секунд ?

Это значение в даташит по умолчанию, и я эту настройку не трогал. В симуляторе тоже по умолчанию 1 МГц. 

22 minutes ago, dimka76 said:

Сбрасывается. Значит в коде у вас ошибка

Ну, если сброс - это TCNT1=0, то тут трудно ошибиться (замечу, что симулятор выполняет сброс. А "живое железо", очевидно, нет - иначе решение с промежуточной переменной не потребовалось бы). До отключения таймера в PRR, по вашему совету, сдвинул. Таймер, считающий во время простоя, мне не нужен от слова совсем. В любом случае, таймер работает, отсчитывает нужные интервалы, решения найдены, большего не требуется.

29 minutes ago, dimka76 said:

Все переменные, которые используются в прерываниях следует объявлять с квалификатором volatile.

Вот тут простое любопытство: почему? (пожалуйста, не слишком углублённо, то, что я не специалист, и не намереваюсь им становиться даже близко, по-моему, все уже поняли... надеюсь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, dimka76 сказал:

Все переменные, которые используются в прерываниях следует объявлять с квалификатором volatile.

Это не так. не следует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, ILSF15 said:

10-12 секунд непрерывного счёта, добавил переменную, которая записывает TCNT1 перед переполнением и с этого момента приплюсовывается к текущему значению timer,

На другое ваш говнокод и не способен. Вам говорят его причесать не для сдачи другим, а хотя бы, в первую очередь, для себя. А так... продолжайте и дальше подставлять костыли, не разобравшись с периферией. В симуляторе студии хотя бы запустили что-то?

1 hour ago, ILSF15 said:

ДО запуска таймера, надо было ПОСЛЕ - это раз.

И после этого говорите, что читаете даташит. Смотрите таблицу, специально для вас вставил. @dimka76 правильно сказал, что выбор предделителя и запускает таймер. Никакого другого бита запуска  нет.

image.thumb.png.b248f9663541e39f8331e3ff53a7de61.png

1 hour ago, ILSF15 said:

Второе: большие профессионалы, видимо, тоже не в курсе, как настроить таймер на 1Mhz/1024, потому что он, судя по всему, переполняется секунд за 7 вместо ~минуты

Большие - в курсе. Вы - нет. Голову включите, и подумайте. Ваш МК может тактироваться только от двух частот в текущем случае: 1 МГц и 8 МГц. В первом случае он переполнится примерно за 67 секунд, во втором - в 8 раз быстрее, т.е. за 8 секунд. Из этого следует, что нифига он у вас ни мегагерцем тактируется. А всеми восьмью.

1 hour ago, ILSF15 said:

противном случае мне сразу бы об этом сказали. 

Как же они могут сказать, когда вы клятвенно уверяли нас, что у вас 1 МГц. Вот вам и дали расчёт для делителя 1024. А вы снова ошиблись, и дезинформировали нас.

1 hour ago, ILSF15 said:

Третье: большие профессионалы так и не подсказали, как правильно сбрасывать счётчик, поскольку он НЕ сбрасывается. Ни до, ни после, ни перед. Вообще не сбрасывается.

И снова не читаете даташит. Вот выдержка

image.thumb.png.28df835b056e950ada7cb56ddc67bae9.png

Перевести? Ладно, переведу. Изменение регистра TCNT1 пока таймер запущен может привести к пропуску события сравнения. Но вы сравнение (compare) не используете, поэтому вам по барабану. Но из текста следует, что менять это регистр при запущенном таймере можно.

1 hour ago, ILSF15 said:

(и я всё ещё сдерживаюсь,

Да кого ты пугаешь своим сдерживанием? Это у тебя прога не работает. А не у меня, например. Не сдерживайся. Пофиг. Только от этого твоя проблема решится? Кичишься тут своей дерзостью, меришь тех кто тебе помогает по своему уровню, и даже ниже. А на многократные советы, и в первую очередь - читать документацию, чихаешь. Ну и кто из нас... неправильно себя ведёт?

25 minutes ago, ILSF15 said:

Это значение в даташит по умолчанию, и я эту настройку не трогал. В симуляторе тоже по умолчанию 1 МГц. 

Это правда. Но следует проверить, возможно вы затёрли значение по-умолчанию.

26 minutes ago, ILSF15 said:

А "живое железо", очевидно, нет

Да с какого перепугу - нет-то. Либо у вас мега китайская с кривым таймером, либо ваш метод проверки - с ошибкой. Сбрасывается таймер 100%. Я сам это делал неоднократно, и документация, самое главное, разрешает.

27 minutes ago, ILSF15 said:

решения найдены,

Костыли.

27 minutes ago, ILSF15 said:

Вот тут простое любопытство: почему?

Только те переменные, доступ к которым компилятор может оптимизировать в основном потоке. Например

volatile int counter;

void someIrqHandler() {
  counter++; // наращиваем счётчик по какому-либо прерыванию
}

int main() {
  enableIrq(); // разрешаем прерывания
  
  while(counter < 1000); // ждём, пока значение счётчика меньше 1000
  
  doSomething(); // что-то делаем
}

Поскольку компилятор ничего не знает о прерываниях (по стандарту не обязан), то он не предполагает, что прерывания - своего рода многозадачность. Т.е. переменная counter может быть "одновременно" изменена в двух местах: в функции main() и в обработчике прерывания someIrqHandler(). Следовательно, оптимизатор может вообще посчитать, что counter нигде не изменяется и выбросить цикл. Либо загрузить в регистр общего назначения переменную counter, и там ждать. Бесконечно долго. Модификатор volatile запрещает как-либо оптимизироват доступ к переменной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, haker_fox said:

Не сдерживайся

Ну ладно. Сам попросил.

4 minutes ago, haker_fox said:

Никакого другого бита запуска  нет.

 

Untitled.thumb.png.6eade1e31af83ba763e127e304503b4c.png

Вместо того, чтобы сношать людям мозг бесполезной инфой, которую они без тебя знают, учи матчасть, прафисианал с опытам. Есть люди, которые хоть и не разбираются, но читают мануалы ВНИМАТЕЛЬНО, а не сношают мозг о необходимости выучить программирование тому, кому оно ни...куда не впилось. Не твоё дело, КАК я написал код. Иди RTFM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, ILSF15 said:

Не твоё дело, КАК я написал код. Иди RTFM.

Отлично, что не стал сдерживаться. Помогло? Конечно же нет, ибо за пустыми словами дела у тебя нет. Дилетант.

16 minutes ago, ILSF15 said:

читают мануалы ВНИМАТЕЛЬНО

Кого ты там внимательно читаешь? PRR - power reduction register. Этот регистр отключает тактовую частоту периферии для энергосбережения. И этот регистр не предназначен для пуска/останова таймера. Ты должен подать на него тактовую с помощью этого регистра, и больше его не трогать. А дальше рулить таймером только с помощью его! регистров.

16 minutes ago, ILSF15 said:

которую они без тебя знают

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

16 minutes ago, ILSF15 said:

учи матчасть, прафисианал с опытам.

Не поверишь, дорогой, учу. И каждый день учусь. Это нормально. Вот только не тебе меня посылать, ибо я и без тебя это делаю. А ты тыкаешь уже пятый день подряд одни и те же биты. Без толку.

16 minutes ago, ILSF15 said:

кому оно ни...куда не впилось.

Так я тебе предложил это всё бросить где-то выше. Всё равно ничего у тебя не получится с таким подходом. Либо будет работать криво/косо и без понимания принципа.

 

З.Ы. У тебя, по ходу, не только с языком программирования проблема. У тебя проблема и с английским, ибо не понимаешь, что написано. Ну возьми переводчик. А вот с русским тебе даже не знаю, чем помочь. Чтобы ты мысли чётче излагал. А не набор бессмыслицы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, haker_fox said:

Поскольку компилятор ничего не знает о прерываниях (по стандарту не обязан), то он не предполагает, что прерывания - своего рода многозадачность. Т.е. переменная counter может быть "одновременно" изменена в двух местах: в функции main() и в обработчике прерывания someIrqHandler(). Следовательно, оптимизатор может вообще посчитать, что counter нигде не изменяется и выбросить цикл. Либо загрузить в регистр общего назначения переменную counter, и там ждать. Бесконечно долго. Модификатор volatile запрещает как-либо оптимизироват доступ к переменной.

Не совсем так. Не то что переменная в разных местах изменяется, а то что она может измениться без ведома компилятора. А обработчик прерывания, по мнению компилятора, нигде и никогда не вызывается. Получается в одном прерывание мы изменяем значения переменной, а в другом прерывании контролируем значение этой переменной. Вот компиляттор видит, что функция обработки первого прерывания нигде из программы не вызывается и выкидывает ее, т.к. по его мнению что толку проверять переменную, которая нигде не изменяется.

А volatile запрещает выкидывать эту переменную.

55 minutes ago, ILSF15 said:

Это значение в даташит по умолчанию, и я эту настройку не трогал. В симуляторе тоже по умолчанию 1 МГц. 

Да, по умолчанию, настроен FUSE bit CLKDIV8, но ардуинщики наверняка, когда зашивали свой загрузчик, изменили его на незапрограммированный. И, если это действительно так, то трогать его и не следует, т.к. иначе перестанет работать загрузчик. Хотя, т.к. у вас нет программатора, то и проверить его нечем.

Если есть осциллограф или логический анализатор, то можно вывести тактовую на ножку - CLKO - PB0 и проверить частоту.

Но косвенно об этом можно судить по тому, что у вас таймер переполняется за 7 секунд вместо ожидаемых 67. 

Есть еще регист CLKPR - можно в нем поделить тактовую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, dimka76 said:

а то что она может измениться без ведома компилятора.

Всё так, вы более академично объяснили)

5 minutes ago, dimka76 said:

Если есть осциллограф или логический анализатор

Не пугайте автора)))). Он и так перестал сдерживаться)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, dimka76 said:

Да, по умолчанию, настроен FUSE bit CLKDIV8, но ардуинщики наверняка, когда зашивали свой загрузчик, изменили его на незапрограммированный. И, если это действительно так, то трогать его и не следует, т.к. иначе перестанет работать загрузчик.

О! Спасибо за полезную информацию, немножко встало на свои места. Куда полезней... ну вы поняли чего. А изменение CLKPR не скажется на загрузчике?

8 minutes ago, dimka76 said:

Вот компиляттор видит, что функция обработки первого прерывания нигде из программы не вызывается и выкидывает

Хм, никогда не сталкивался с таким поведением... Ну, то есть, что касается переменных - всё вроде как исправно работает, согласно дебаггеру в IAR MSP и - косвенно - судя по поведению ардуинки. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...