смотрю на первую строчку на картинке (TCCR1А) и ни как не могу понять как b1 (из монитора) у нас трансформировалось в PWM to 255(на картинкке). там же нету (на картинке) никаких b1. как читать эти картинки ?
читаю и методом угадайки я понимаю что TCCR1A = b1 равно mode1 для WGM13/12/11/10 причем 13/12 уже не относятся к 1А, но где логика ? почему b1 не равно например COM1A0=1 ?
далее, TCCR1B=b11 опять же подбором добиваемся что CS12/11/10 =011 и это делитель 64. но почему b11 это не mode11 для WGM13/12 ?
Значит так, про всякие bxxx - не ко мне, Вы взяли их с какой-то картинки, которую постил не я и пусть их автор и комментирует.
Вот это же,
alexbmd пишет:
0x40 нашел что это EEPROM register и не совпадает с переключением как вы написали
0x09 нашел что это toggle pin у вас же это CTC режим
белеберда какаято :(
как я понимаю Вы роетесь в моём примере
TCCR1A = 0x40;
TCCR1B = 0x09;
Правильно?
Значит, перестаньте придумывать сложности. В данном случае 0x40 и 0x09 - просто числа. Числа и ничего другого. Я присваиваю их соответсвующим регистрам. Какие биты при этом 1, а какие 0 - так распишете эти числа в двоичной системе и увидите.
0x40 - 0100 0000
0x09 - 0000 1001
Вот и смотрите теперь какие биты регистров я взвожу.
получается D9 мы ничего не делаем а D10 Clear OC1B on Compare Match when upcounting. Set OC1B on Compare Match when downcounting. как мы тогда переключаем D9 ?
uint8_t prescaler = PRESCALER_1024;
у нас определен только enum Prescaler. что означает prescaler и uint8_t ?
TCCR1B = 0x08 | prescaler;
b08 = 0000 1000 а что означает | prescaler ? сам прескалер при этом 5
получается D9 мы ничего не делаем а D10 Clear OC1B on Compare Match when upcounting. Set OC1B on Compare Match when downcounting. как мы тогда переключаем D9 ?
uint8_t prescaler = PRESCALER_1024;
у нас определен только enum Prescaler. что означает prescaler и uint8_t ?
TCCR1B = 0x08 | prescaler;
b08 = 0000 1000 а что означает | prescaler ? сам прескалер при этом 5
alexbmd пишет:
у вас опечатка 0x40 - 0010 1000
Не придумывайте 8-4-2-1 8-4-2-1 то-есть 0x40 = 0-1-0-0 0-0-0-0
читаю и методом угадайки я понимаю что TCCR1A = b1 равно mode1 для WGM13/12/11/10 причем 13/12 уже не относятся к 1А, но где логика ? почему b1 не равно например COM1A0=1 ?
далее, TCCR1B=b11 опять же подбором добиваемся что CS12/11/10 =011 и это делитель 64. но почему b11 это не mode11 для WGM13/12 ?
Спасибо большое за потраченное время на написание подобного,ваше время прошло не зря (несколько десятков байт я загнал в свою память). читал несколько ваших статей,интересно очень (а жена уже спать гонит),но понял, что если это для начинающих то мне надо в группу еще ниже хотя из названия можно понять,что ниже мне некуда.Ну что поделать будем вникать.Спасибо
Добрый вечер. Не знаю какая у вас информация касательно новичков, но либо я дурак либо лыжи не едут. Я - новичек, на ардуино пишу пару дней и считаю, что как для новичка я знаю больше чем меньше и тем не менее не понял ничего из ниженаписанного. Я дилетант в програмировании (у меня нет спец образования) и все что я знаю о програмировании это первая часть самоучителя по java. Теперь больше конкретики.
void setup() { // "()" подсказывают мне что это функция, void - ничего не возвращает, точно функция.
pinMode(9, OUTPUT); // в аргументах функции написано что-то капсом, значит константа. Вот примерно так я мыслю, если грубо. Я прочитал на оффсайте описание всех функций и некоторых функций из некоторых библиотек, так что я более менее в теме.
TCCR1A = 0x40; // а это еще что за херня? TCCR1A - это константа? Но их же вроде нельзя переопределять, на то они и константы. 0x40 а это как понимать? Это точно для ардуинки? Откуда я вообще должен знать что это? Похоже на шестнадцатеричную запись, но это не точно.
TCCR1B = 0x09; // зе сейм
OCR1A = 0; // зе сейм
}
Погуглив 2 для я написал игру, с блэкджеком и анимациями. Код на столько говеный но писал я его сам. После прочтения этой статьи у меня началась дипрессия.
Приму помощь в виде объяснений или рецептов на расширяющие сознание препараты. А теберь без шуток. Я действительно ОЧЕНЬ хочу понять как это работает и что значит написанное. Посоветуйте материал специализированный для ардуинки.
даже не знаю, что Вам сказать. Нет какой-то одной волшебной книги, которая проливала бы свет на все вопросы. По каждому вопросу надо смотреть. А читать лучше побольше и разных авторов
Пока же, просто поправлю одно концептуальное заблуждение, чтобы у Вас проблем было меньше.
ilyash550 пишет:
TCCR1A - это константа? Но их же вроде нельзя переопределять, на то они и константы.
Вы путаете константу с макроподстановкой. Костанта, - это элемент данных, описанный с использованием модификатора const
const int velocity = 120; // скорость каретки
здесь описана константа velocity типа int со значением 120. У константы всегда есть тип, и она используется как единый элемент данных. Например:
const int velocity = 120 + 10; // скорость каретки
Всегда и везде будет использоваться именно как целое число 130, а не что-то другое.
То же. что Вы называете константой (то, что вводится директивой #define) на самом деле является макроподстановкой. Она подставляется в код как есть. У неё нет типа, просто подставляется как есть.
Здесь очень важный момент, который Вы должны чётко уяснить - лексема после слова define является именем постановки, а всё, что справа от лексемы, до начала комментария или (если его нет, то до конца строки). подставляется в код как есть без обработки (если не считать обработкой такие же подстановки). Стало быть использовать подстановку можно везде, где можно использовать её правую часть. Например:
#define KAKA 8 // комментарий
// KAKA допустимо везде, где можно использовать число 8
int a = KAKA;
a += KAKA;
a = KAKA / 2;
a = 128 / KAKA;
//////////////////////////////////////////////
#define MUMU 321;
// MUMU допустимо везде, где допустимо 321;
int z = MUMU // Всё равно, что int z = 321;
z += MUMU // Всё равно, что z += 321;
z = MUMU * 2; // ФИГВАМ! получается z = 321; * 2; - синтаксическая ошибка
//////////////////////////////////////////////
// а вот теперь грабли, которых не понимают даже некоторые из местных форумных "гуру"
// Разберитесь с приколом в последних двух строках
#define KAKA 8+4
int b = KAKA; // Всё равно, что int b = 8+4; --- b станет равно 12
int c = KAKA * 2; // Всё равно, что int c = 8+4 * 2; --- b станет равно 16
int d = 2 * KAKA; // Всё равно, что int d = 2 * 8+4; --- d станет равно 20
// Ну и наконец про "изменения", которые Вас смутили, смотрите
int n;
#define KAKA n
KAKA = 23; // Всё равно, что написать n = 23; - совершенно законная конструкция
Понятно теперь, что TCCR1A вовсе не константа?
Там есть ещё тонкости, типа макроподстановок с параметрами, но для начала чётко поймите то, что описано.
Во-первых, спасибо за оперативность.
Во-вторых, странно, на java все константы пишутся капсом, если не ошибаюсь, но видимо java это java.
Про макрододстановки слышал. То, что TCCR1A это не константа, вы меня убедили. То есть TCCR1A это макрододстановка? Тогда вы меня еще больше запутали)
TCCR1A = 0x40; // если TCCR1A это макроподстановка, то есть это даже не переменая, а число, как ей можно присваивать значение 0x40, и как понять что значит эта запись, я про 0x40.
TCCR1B = 0x09;
OCR1A = 0;
Могли бы вы, пожалуйста, максимально подробно объяснить эти 3 строчки.
TCCR1A это макроподстановка, то есть это даже не переменая, а число
Кто Вам сказал, что это число? Это может быть всё, что угодно. Посмотрите строки 28-31 моего примера. В них KAKA - вполне себе переменная. Разберитесь с этими строками. TCCR1A определена принципиально также.
И вообще при подстановке может подставлять всё, что угодно, как есть. Например:
// определяем новое название цикла while
#define ZiklPokaVernoUslovie while
// А теперь его используем
int n = 0;
ZiklPokaVernoUslovie (n < 100) {
// la-la-la
n++;
}
Это совершеннон нормальный цикл, который выполнится 100 раз.
ilyash550 пишет:
как понять что значит эта запись, я про 0x40.
TCCR1B = 0x09; OCR1A = 0; Могли бы вы, пожалуйста, максимально подробно объяснить эти 3 строчки.
Что и зачем пишется в регистры типа TCCR1B, OCR1A и т.п. описано в документации контроллера, читайте.
Кажется я нашел способ обойти мою проблему с пониманием, по крайней мере пока. Более высокоуровневое прогоамирование, а именно библиотека MsTimer2. По сути интерфейс работы стэтим таймером.
Еще больше конкретики. У меня есть кусок кода (часть игры, в которой есть маленькая падающая коробка и ее нужно ловить другой коробкой), в котором "коробка падает вниз" в пределах одного символа. Изначально я писал на millis(), но специально переписал сейчас на прерывании именно этот кусок. Я хочу чтобы с каждым проходом (после окончательного падения "коробки") скорость ее "полета" в следующем проходе увеличивалась. Как мне это сделать? По идеи мне нужно менять первый параметр фунции MsTimer2::set(), но я не понимаю как это сделать. Видео с игровым процессом и часть кода.
В порядке размышления... я бы убрал из заголовка темы упоминание про новичков. Эта тема не для них.
ИМХО, людям, которые задают вопросы что такое 0х40 - не просто бесполезно, а скорее вредно изучать прерывания. Это как пытаться понять тригонометрию, не зная арифметики. Сначала надо набрать базу, научиться мыслить алгоритмами и писать грамотный код на языке высокого уровня, а потом уже переходить к низкоуровневым инструкциям. Новичок должен понимать, что прерывания - мощный, но в то же время опасный и плохо переносимый инструмент. Пользоваться ими стоит, имхо, только если задачу невозможно решить более простыми методами. Подавляющее число задач. с которыми люди приходят на форум - решается без прерываний. Писать блинк на прерываниях - это ровно то же самое, как описанное в соседней теме неуместное применение битового сдвига вместо умножения на 2.
Написал потому. что из вопросов некоторых складывается впечатление, что люди восприняли этот код как замену "сложным и непонятным millis()" :) - а это бред
Всем привет. Недавно начал изучать Ардуино и столкунулся с таким вопросом. Есть скетч вот он
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 7 has an LED connected on most Arduino boards.
// give it a name:
int led = 7;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1); // wait for a second
+
}
И вообщем такой вопрос. Тут частота 500 ГЦ если я не ошибабсь частота мигания светодиода и мне нужно сделать так чтобы частота была уже 2 МГЦ мигания светодиода все вывожу на осцилограф. Очень надо) Спасибо.
Ардуиновские функции слишком медленные. 2МГц - это период 500 наносекунд (0,5 микросекунды). Поэтому только аппаратные таймеры и только прямое управление портами. Скажем так, "ардуино" на этом заканчивается. Это настраивается и управляется через регистры микроконтроллера.
Кстати, вместо delay() можно использовать функцию Sleep и спать в режиме Idle. В Ардуине таймер0 переполняется каждые 8 мс, и сделав в цикле сон, ножно проспать нужное время, экономя энергию. У меня так микроконтроллер потребляет 0.2 мА, суть просто в замене команды dela(1000) на MySleep(1000) где в процедуре контроллер спит заданное время.
И вообщем такой вопрос. Тут частота 500 ГЦ если я не ошибабсь частота мигания светодиода и мне нужно сделать так чтобы частота была уже 2 МГЦ мигания светодиода все вывожу на осцилограф. Очень надо) Спасибо
...
digitalWrite() было 1800мкс, стало 0,2мкс
digitalRead() было 1900мкс, стало 0,2мкс
Ну качество той статьи, откуда взят этот чудесный фрагмент мягко говоря очень низкое. Для одного из "ведущих конструкторов на одном крупном военном Зеленоградском заводе" стыдно гнать такую дикую пургу -я про команды digitalWrite/Read. 1800 мкс это нонсенс, эти команды выполняются 4.. 5мкс -максимум.
Нормальная статья для того чтобы разбираться, рецепт из статьи вот:
PORTA=B00001010 (битовая, ножки 23 и 25 — HIGH)
Всё правильно указано, примеры кода рабочие. Ведущий конструктор не обязан быть электронщиком, он скорее механик, которому досталась сопутствующая задача, как говорится "и чтец и жнец и на дуде игрец":
>>>я конструктор, больше по черчению деталек спец.
>>> ... Я работаю одним из ведущих конструкторов на одном крупном военном Зеленоградском заводе, и в данный момент веду проект по разработке метрологического средства измерения. В данной задаче существует бесконечное множество проблем, которые требуют индивидуального решения. Одной из таких задач является управление шаговым двигателем без шумов и с шагом не 1.8 градуса, как сказано в документации шагового двигателя, а до 0.0001 градуса. Казалось бы, задача сложна и нерешабельна, но, повозившись немного со схемами управления, пришёл к выводу, что всё реально и возможно.
И задачу он решил или очень близко приблизился к решению и поделился опытом, жаль что статей больше не писал:
>>>1) Шумы редуктора для нас недопустимы. Проверяли редуктор — не подходит.
Более конкретно — подвешенный к жесткой пружине редуктор вибрирует при работе на 10-15 микрон, а на шаговом двигателе при нормальной работе удалось добиться вибрации порядка 600 нанометров.
2) Второй минус редуктора — наличие люфта. Люфт порядка 1градуса.
3) Ну и, конечно, невозможность точного позиционирования редуктора. На него подал 12В, он крутится. А на сколько он провернулся — зависит от точности калибровки, от его разгона, он смазки, от силы, противодействующей кручению. Эти проблемы можно решить, установив сверхточный датчик угла поворота с дроблением до 0.0001 градуса, но это нереально дорогое решение.
>>> Для одного из "ведущих конструкторов на одном крупном военном Зеленоградском заводе" стыдно гнать такую дикую пургу
Отношение к коллегам что старались и писали статью подробную строго как в анекдоте бородатом:
Американский форум. Задаёшь вопрос, потом тебе отвечают.
Израильский форум. Задаёшь вопрос, потом тебе задают вопрос.
Русский форум. Задаёшь вопрос, потом тебе долго рассказывают, какой ты мудак.
sim31, ну а какое должно быть отношение? Если он серьёзный инженер в своих виброизмерениях -так пусть пишет про них, а не про то, в чём сам ничего не понимает. Это же не все его пёрлы. Дальше про ШИМ читали? Он тупо вогнал в цикл запись в порт. И сияя счастьем говорит о получившимся ШИМ 19кГц. -Это открытие на уровне новичка, который ещё вчера мигал светодиодом, а сегодня научился команде "For".
Отношение к коллегам что старались и писали статью подробную строго как в анекдоте бородатом:
Американский форум. Задаёшь вопрос, потом тебе отвечают.
Израильский форум. Задаёшь вопрос, потом тебе задают вопрос.
Русский форум. Задаёшь вопрос, потом тебе долго рассказывают, какой ты мудак.
Ну качество той статьи, откуда взят этот чудесный фрагмент мягко говоря очень низкое. Для одного из "ведущих конструкторов на одном крупном военном Зеленоградском заводе" стыдно гнать такую дикую пургу -я про команды digitalWrite/Read. 1800 мкс это нонсенс, эти команды выполняются 4.. 5мкс -максимум.
Да там и про стандартный ШИМ сказано, что он 50 Гц. Вернее, даже так, реально автор говорим и максимально высокочастотном меандре, что такое ШИМ и чем он отличается от меандра, автор, похоже, не в курсе.
И вообще, по манере изложения, тянет на "ах какого крутого старшекласника", чем на ведущего конструктора.
И вообще, по манере изложения, тянет на "ах какого крутого старшекласника", чем на ведущего конструктора.
Ну анекдот в силе, народ самоутверждается на опечатках коллег, меандр, конечно, не ШИМ, но в контексте той статьи всё понятно и логично. Кто-то же статью из черновиков вытащил, плюсов наставил и обсуждение шло длинное, тема актуальная.
Ведущий конструктор может быть в очень маленькой компании. У меня есть коллеги что владеют фирмами из одного человека, сами директора и более никого. Есть примеры шарашкиных контор, что тоже фирма из трех человек, собирают шкафы автоматизации для Газпрома из всего готового и впаривают за 10 000$ за штуку. Есть конторы что делают что-то непонятное для военных заказчиков на микроконтроллерах или ПЛИС, дружно ноют что платят мало, вообще непонятно что делают. В маленькой компании директор может быть и ведущим конструктором, и бухгалером и разнорабочим...
Странно, что без русского языка. Русский уж явно более распростране скандинавского. И вообще подфорум дохлый какой-то, после 2014 года нет сообщений, очень странно.
Создатели форума в целом имеют право на свои правила. Придет иностранец, напишет глупостей всяких, и их предъявят владельцу форума, тот и не поймет за что. Русскоязычные форумы тоже в целом не одобряют иностранного языка.
Создатели форума в целом имеют право на свои правила. Придет иностранец, напишет глупостей всяких, и их предъявят владельцу форума, тот и не поймет за что. Русскоязычные форумы тоже в целом не одобряют иностранного языка.
создатели форума имею право на всё, что не противоречит законодательству страны их дислокации - я абсолютно уверен, что их законом запрещена дискриминация человека по языковому или иному признаку.
В маленькой компании директор может быть и ведущим конструктором, и бухгалером и разнорабочим...
Типа: участковый в деревне Захрюкино - местный Генералиссимус от МВД. Компания, где все в одном лице + 1,5 узбека, это ИП. Можешь назначить там себя хоть Повелителем Вселенной, только это не значит, что ты им стал. Сколько общался с конструкторскими отделами, обычно всем хватало ума позвать специалиста в требуемой области и решать проблему с ним. Иначе: "Над вами потешаться будут" (с)М.Булгаков.
Имеется вопрос по работе с регистрами - есть ли возможность напрямую транслировать состояние одного регистра в другой, дабы избежать использования промежуточной переменной state и digitalWrite() c целью чтобы запись прошла максимально быстро? Пример кода:
Загляните в пост #87
Иначе в даташите
подскажите плиз где почитать про все эти команды/значения, что означают все эти буквы/цифры ?
Если Вас интересует UNO/Nano, то вот здесь. Если Мега, то вот здесь.
ua6em
"На мониторе видим
TCCR1A = b1"
----
смотрю на первую строчку на картинке (TCCR1А) и ни как не могу понять как b1 (из монитора) у нас трансформировалось в PWM to 255(на картинкке). там же нету (на картинке) никаких b1. как читать эти картинки ?
ни как не могу понять
Читайте то, что я Вам сказал.
ЕвгенийП
читаю и методом угадайки я понимаю что TCCR1A = b1 равно mode1 для WGM13/12/11/10 причем 13/12 уже не относятся к 1А, но где логика ? почему b1 не равно например COM1A0=1 ?
далее, TCCR1B=b11 опять же подбором добиваемся что CS12/11/10 =011 и это делитель 64. но почему b11 это не mode11 для WGM13/12 ?
0x40 нашел что это EEPROM register и не совпадает с переключением как вы написали
0x09 нашел что это toggle pin у вас же это CTC режим
белеберда какаято :(
Значит так, про всякие bxxx - не ко мне, Вы взяли их с какой-то картинки, которую постил не я и пусть их автор и комментирует.
Вот это же,
0x40 нашел что это EEPROM register и не совпадает с переключением как вы написали
0x09 нашел что это toggle pin у вас же это CTC режим
белеберда какаято :(
как я понимаю Вы роетесь в моём примере
Правильно?
Значит, перестаньте придумывать сложности. В данном случае 0x40 и 0x09 - просто числа. Числа и ничего другого. Я присваиваю их соответсвующим регистрам. Какие биты при этом 1, а какие 0 - так распишете эти числа в двоичной системе и увидите.
0x40 - 0100 0000
0x09 - 0000 1001
Вот и смотрите теперь какие биты регистров я взвожу.
у вас опечатка 0x40 - 0010 1000
получается D9 мы ничего не делаем а D10 Clear OC1B on Compare Match when upcounting. Set OC1B on Compare Match when downcounting. как мы тогда переключаем D9 ?
у нас определен только enum Prescaler. что означает prescaler и uint8_t ?
b08 = 0000 1000 а что означает | prescaler ? сам прескалер при этом 5
у вас опечатка 0x40 - 0010 1000
получается D9 мы ничего не делаем а D10 Clear OC1B on Compare Match when upcounting. Set OC1B on Compare Match when downcounting. как мы тогда переключаем D9 ?
у нас определен только enum Prescaler. что означает prescaler и uint8_t ?
b08 = 0000 1000 а что означает | prescaler ? сам прескалер при этом 5
у вас опечатка 0x40 - 0010 1000
Не придумывайте 8-4-2-1 8-4-2-1 то-есть 0x40 = 0-1-0-0 0-0-0-0
у вас опечатка 0x40 - 0010 1000
Да, нет, скорее у Вас
0x40 - 0100 0000
у нас определен только enum Prescaler. что означает prescaler и uint8_t ?
b08 = 0000 1000 а что означает | prescaler ? сам прескалер при этом 5
Вы пожалуйста приводите скетч и ссылайте на номер строки, а то я не понимаю о чём Вы говорите. Если Вы имеете в виду вот этот скетч
то переменная определена в строке 6 и проинициализирована значением PRESCALER_1024.
calc от винды и http://www.rapidtables.com/convert/number/decimal-to-binary.htm
говорят что 40 в двоичной будет 101000. в чем загадка ?
да сори я говорю про этот пример, мы определяем enum, вроде как массив, потом uint8_t что это ? мы не инициализировали что это переменная или клас ?
prescaler это очевидно новая переменая в которую пишем 5 ?
40 и 0x40 - это разное, вы, наверное, в десятичной системе вводили.
Yarik.Yar да точно сори там хексы. спасибо. с этим ясно осталось с перемеными разобраться
ЕвгенийП
читаю и методом угадайки я понимаю что TCCR1A = b1 равно mode1 для WGM13/12/11/10 причем 13/12 уже не относятся к 1А, но где логика ? почему b1 не равно например COM1A0=1 ?
далее, TCCR1B=b11 опять же подбором добиваемся что CS12/11/10 =011 и это делитель 64. но почему b11 это не mode11 для WGM13/12 ?
Дополнил пост #87
OCR1A = 0;
// установить TOP равным 0
вроде все понял только не вижу где мы указали что у нас будет именно TOP а не MAX или BOTTOM ?
Привет, подскажи, таймер на 9 ноге я запустил 124 Гц
теперь как мне сделать чтобы дисплей остальная приблуда в этом такте работала, какую штуку почитать или в какую сторону копать у меня 2 дисплея
но красных ног 3
мне получается теперь другие ноги с девятой сравнивать через выражение?
Привет, подскажи, таймер на 9 ноге я запустил 124 Гц
теперь как мне сделать чтобы дисплей остальная приблуда в этом такте работала, какую штуку почитать или в какую сторону копать у меня 2 дисплея
Еща раз даю ссылку к прочтению и копанию http://arduino.ru/forum/programmirovanie/dva-8-mi-segmentnykh-indikatorov?page=2
Спасибо большое за потраченное время на написание подобного,ваше время прошло не зря (несколько десятков байт я загнал в свою память). читал несколько ваших статей,интересно очень (а жена уже спать гонит),но понял, что если это для начинающих то мне надо в группу еще ниже хотя из названия можно понять,что ниже мне некуда.Ну что поделать будем вникать.Спасибо
Добрый вечер. Не знаю какая у вас информация касательно новичков, но либо я дурак либо лыжи не едут. Я - новичек, на ардуино пишу пару дней и считаю, что как для новичка я знаю больше чем меньше и тем не менее не понял ничего из ниженаписанного. Я дилетант в програмировании (у меня нет спец образования) и все что я знаю о програмировании это первая часть самоучителя по java. Теперь больше конкретики.
void setup() { // "()" подсказывают мне что это функция, void - ничего не возвращает, точно функция.
pinMode(9, OUTPUT); // в аргументах функции написано что-то капсом, значит константа. Вот примерно так я мыслю, если грубо. Я прочитал на оффсайте описание всех функций и некоторых функций из некоторых библиотек, так что я более менее в теме.
TCCR1A = 0x40; // а это еще что за херня? TCCR1A - это константа? Но их же вроде нельзя переопределять, на то они и константы. 0x40 а это как понимать? Это точно для ардуинки? Откуда я вообще должен знать что это? Похоже на шестнадцатеричную запись, но это не точно.
TCCR1B = 0x09; // зе сейм
OCR1A = 0; // зе сейм
}
Погуглив 2 для я написал игру, с блэкджеком и анимациями. Код на столько говеный но писал я его сам. После прочтения этой статьи у меня началась дипрессия.
Приму помощь в виде объяснений или рецептов на расширяющие сознание препараты. А теберь без шуток. Я действительно ОЧЕНЬ хочу понять как это работает и что значит написанное. Посоветуйте материал специализированный для ардуинки.
ilyash550,
даже не знаю, что Вам сказать. Нет какой-то одной волшебной книги, которая проливала бы свет на все вопросы. По каждому вопросу надо смотреть. А читать лучше побольше и разных авторов
Пока же, просто поправлю одно концептуальное заблуждение, чтобы у Вас проблем было меньше.
Вы путаете константу с макроподстановкой. Костанта, - это элемент данных, описанный с использованием модификатора const
здесь описана константа velocity типа int со значением 120. У константы всегда есть тип, и она используется как единый элемент данных. Например:
Всегда и везде будет использоваться именно как целое число 130, а не что-то другое.
То же. что Вы называете константой (то, что вводится директивой #define) на самом деле является макроподстановкой. Она подставляется в код как есть. У неё нет типа, просто подставляется как есть.
Здесь очень важный момент, который Вы должны чётко уяснить - лексема после слова define является именем постановки, а всё, что справа от лексемы, до начала комментария или (если его нет, то до конца строки). подставляется в код как есть без обработки (если не считать обработкой такие же подстановки). Стало быть использовать подстановку можно везде, где можно использовать её правую часть. Например:
Понятно теперь, что TCCR1A вовсе не константа?
Там есть ещё тонкости, типа макроподстановок с параметрами, но для начала чётко поймите то, что описано.
Во-первых, спасибо за оперативность.
Во-вторых, странно, на java все константы пишутся капсом, если не ошибаюсь, но видимо java это java.
Про макрододстановки слышал. То, что TCCR1A это не константа, вы меня убедили. То есть TCCR1A это макрододстановка? Тогда вы меня еще больше запутали)
TCCR1A = 0x40; // если TCCR1A это макроподстановка, то есть это даже не переменая, а число, как ей можно присваивать значение 0x40, и как понять что значит эта запись, я про 0x40.
TCCR1B = 0x09;
OCR1A = 0;
Могли бы вы, пожалуйста, максимально подробно объяснить эти 3 строчки.
это регистры таймера 1
Кто Вам сказал, что это число? Это может быть всё, что угодно. Посмотрите строки 28-31 моего примера. В них KAKA - вполне себе переменная. Разберитесь с этими строками. TCCR1A определена принципиально также.
И вообще при подстановке может подставлять всё, что угодно, как есть. Например:
Это совершеннон нормальный цикл, который выполнится 100 раз.
как понять что значит эта запись, я про 0x40.
TCCR1B = 0x09; OCR1A = 0; Могли бы вы, пожалуйста, максимально подробно объяснить эти 3 строчки.
Что и зачем пишется в регистры типа TCCR1B, OCR1A и т.п. описано в документации контроллера, читайте.
Кажется я нашел способ обойти мою проблему с пониманием, по крайней мере пока. Более высокоуровневое прогоамирование, а именно библиотека MsTimer2. По сути интерфейс работы стэтим таймером.
Еще больше конкретики. У меня есть кусок кода (часть игры, в которой есть маленькая падающая коробка и ее нужно ловить другой коробкой), в котором "коробка падает вниз" в пределах одного символа. Изначально я писал на millis(), но специально переписал сейчас на прерывании именно этот кусок. Я хочу чтобы с каждым проходом (после окончательного падения "коробки") скорость ее "полета" в следующем проходе увеличивалась. Как мне это сделать? По идеи мне нужно менять первый параметр фунции MsTimer2::set(), но я не понимаю как это сделать. Видео с игровым процессом и часть кода.
https://www.youtube.com/watch?v=PVvxEj8DfHk
блин, ну шо за тупняк?
if (событие_падения_коробки == 1) {скорость_падения_коробки = скорость_падения_коробки + 100500;}
и, пофиг, что у тебя делает (событие_падения_коробки == 1) - прерывание или непрерывание
Не все так просто, но со скоростью я разобрался. Теперь не могу вклинить этот кусок кода в остальной......
Я дурной, код мой говно, на кол меня. Буду все переписывать с нуля, сори за флуд.
to #19
Какой же он незамутненный; на экране осциллографа видны скачки от прерываний. Фронты, положим, стоят - но в целом генерация не монотонная.
В порядке размышления... я бы убрал из заголовка темы упоминание про новичков. Эта тема не для них.
ИМХО, людям, которые задают вопросы что такое 0х40 - не просто бесполезно, а скорее вредно изучать прерывания. Это как пытаться понять тригонометрию, не зная арифметики. Сначала надо набрать базу, научиться мыслить алгоритмами и писать грамотный код на языке высокого уровня, а потом уже переходить к низкоуровневым инструкциям. Новичок должен понимать, что прерывания - мощный, но в то же время опасный и плохо переносимый инструмент. Пользоваться ими стоит, имхо, только если задачу невозможно решить более простыми методами. Подавляющее число задач. с которыми люди приходят на форум - решается без прерываний. Писать блинк на прерываниях - это ровно то же самое, как описанное в соседней теме неуместное применение битового сдвига вместо умножения на 2.
Написал потому. что из вопросов некоторых складывается впечатление, что люди восприняли этот код как замену "сложным и непонятным millis()" :) - а это бред
Всем привет. Недавно начал изучать Ардуино и столкунулся с таким вопросом. Есть скетч вот он
Ардуиновские функции слишком медленные. 2МГц - это период 500 наносекунд (0,5 микросекунды). Поэтому только аппаратные таймеры и только прямое управление портами. Скажем так, "ардуино" на этом заканчивается. Это настраивается и управляется через регистры микроконтроллера.
Кстати, вместо delay() можно использовать функцию Sleep и спать в режиме Idle. В Ардуине таймер0 переполняется каждые 8 мс, и сделав в цикле сон, ножно проспать нужное время, экономя энергию. У меня так микроконтроллер потребляет 0.2 мА, суть просто в замене команды dela(1000) на MySleep(1000) где в процедуре контроллер спит заданное время.
Поиском сразу находятся 3 качественные статьи
https://yandex.ru/yandsearch?&clid=2186620&text=%D1%83%D1%81%D0%BA%D0%B0...
...
digitalWrite() было 1800мкс, стало 0,2мкс
digitalRead() было 1900мкс, стало 0,2мкс
Поиском сразу находятся 3 качественные статьи
Зачем так далеко ходить, когда прямо на этом форуме написано как 8МГц получить?
Поиском сразу находятся 3 качественные статьи
https://yandex.ru/yandsearch?&clid=2186620&text=%D1%83%D1%81%D0%BA%D0%B0...
...
digitalWrite() было 1800мкс, стало 0,2мкс
digitalRead() было 1900мкс, стало 0,2мкс
Ну качество той статьи, откуда взят этот чудесный фрагмент мягко говоря очень низкое. Для одного из "ведущих конструкторов на одном крупном военном Зеленоградском заводе" стыдно гнать такую дикую пургу -я про команды digitalWrite/Read. 1800 мкс это нонсенс, эти команды выполняются 4.. 5мкс -максимум.
Нормальная статья для того чтобы разбираться, рецепт из статьи вот:
Всё правильно указано, примеры кода рабочие. Ведущий конструктор не обязан быть электронщиком, он скорее механик, которому досталась сопутствующая задача, как говорится "и чтец и жнец и на дуде игрец":
>>>я конструктор, больше по черчению деталек спец.
>>> ... Я работаю одним из ведущих конструкторов на одном крупном военном Зеленоградском заводе, и в данный момент веду проект по разработке метрологического средства измерения. В данной задаче существует бесконечное множество проблем, которые требуют индивидуального решения. Одной из таких задач является управление шаговым двигателем без шумов и с шагом не 1.8 градуса, как сказано в документации шагового двигателя, а до 0.0001 градуса. Казалось бы, задача сложна и нерешабельна, но, повозившись немного со схемами управления, пришёл к выводу, что всё реально и возможно.
И задачу он решил или очень близко приблизился к решению и поделился опытом, жаль что статей больше не писал:
>>>1) Шумы редуктора для нас недопустимы. Проверяли редуктор — не подходит.
Более конкретно — подвешенный к жесткой пружине редуктор вибрирует при работе на 10-15 микрон, а на шаговом двигателе при нормальной работе удалось добиться вибрации порядка 600 нанометров.
2) Второй минус редуктора — наличие люфта. Люфт порядка 1градуса.
3) Ну и, конечно, невозможность точного позиционирования редуктора. На него подал 12В, он крутится. А на сколько он провернулся — зависит от точности калибровки, от его разгона, он смазки, от силы, противодействующей кручению. Эти проблемы можно решить, установив сверхточный датчик угла поворота с дроблением до 0.0001 градуса, но это нереально дорогое решение.
>>> Для одного из "ведущих конструкторов на одном крупном военном Зеленоградском заводе" стыдно гнать такую дикую пургу
Отношение к коллегам что старались и писали статью подробную строго как в анекдоте бородатом:
sim31, ну а какое должно быть отношение? Если он серьёзный инженер в своих виброизмерениях -так пусть пишет про них, а не про то, в чём сам ничего не понимает. Это же не все его пёрлы. Дальше про ШИМ читали? Он тупо вогнал в цикл запись в порт. И сияя счастьем говорит о получившимся ШИМ 19кГц. -Это открытие на уровне новичка, который ещё вчера мигал светодиодом, а сегодня научился команде "For".
Отношение к коллегам что старались и писали статью подробную строго как в анекдоте бородатом:
опубликуй эту статью на https://forum.arduino.cc/
и ты получишь бан в ответ на предложение использовать https://translate.google.com для перевода непонятного им с понятного мне.
расскажи им, как тут угнетают калег.
Ну качество той статьи, откуда взят этот чудесный фрагмент мягко говоря очень низкое. Для одного из "ведущих конструкторов на одном крупном военном Зеленоградском заводе" стыдно гнать такую дикую пургу -я про команды digitalWrite/Read. 1800 мкс это нонсенс, эти команды выполняются 4.. 5мкс -максимум.
Да там и про стандартный ШИМ сказано, что он 50 Гц. Вернее, даже так, реально автор говорим и максимально высокочастотном меандре, что такое ШИМ и чем он отличается от меандра, автор, похоже, не в курсе.
И вообще, по манере изложения, тянет на "ах какого крутого старшекласника", чем на ведущего конструктора.
Невже ти там на рідній мові писав?
Отношение к коллегам что старались и писали статью подробную строго как в анекдоте бородатом:
Нет, отношение гораздо хуже. Чем писать такие статьи, лучше не писать никаких - хоть мозг людям выносить не будут
Невже ти там на рідній мові писав?
на мокшанском, православном и срепном изыке камменты в коде были.
посты на форуме - на изыке белых людей пиндосовском.
И вообще, по манере изложения, тянет на "ах какого крутого старшекласника", чем на ведущего конструктора.
Ну анекдот в силе, народ самоутверждается на опечатках коллег, меандр, конечно, не ШИМ, но в контексте той статьи всё понятно и логично. Кто-то же статью из черновиков вытащил, плюсов наставил и обсуждение шло длинное, тема актуальная.
Ведущий конструктор может быть в очень маленькой компании. У меня есть коллеги что владеют фирмами из одного человека, сами директора и более никого. Есть примеры шарашкиных контор, что тоже фирма из трех человек, собирают шкафы автоматизации для Газпрома из всего готового и впаривают за 10 000$ за штуку. Есть конторы что делают что-то непонятное для военных заказчиков на микроконтроллерах или ПЛИС, дружно ноют что платят мало, вообще непонятно что делают. В маленькой компании директор может быть и ведущим конструктором, и бухгалером и разнорабочим...
опубликуй эту статью на https://forum.arduino.cc/
и ты получишь бан в ответ на предложение использовать https://translate.google.com для перевода непонятного им с понятного мне.
Там есть международный раздел
https://forum.arduino.cc/index.php?board=64.0
Странно, что без русского языка. Русский уж явно более распростране скандинавского. И вообще подфорум дохлый какой-то, после 2014 года нет сообщений, очень странно.
Создатели форума в целом имеют право на свои правила. Придет иностранец, напишет глупостей всяких, и их предъявят владельцу форума, тот и не поймет за что. Русскоязычные форумы тоже в целом не одобряют иностранного языка.
Там есть международный раздел
верно - я их попросил переместить мою тему в русский концлагерь или прекратить дискриминацию ползателей по языковому признаку.
результат налицо.
хотя... я их вежливо просил использовать гуглопереводчик ровно так использую его я, для общения с ними.
тупни сказали, что им это неудобно.
написал в их пресс-службу - тишина.
Создатели форума в целом имеют право на свои правила. Придет иностранец, напишет глупостей всяких, и их предъявят владельцу форума, тот и не поймет за что. Русскоязычные форумы тоже в целом не одобряют иностранного языка.
создатели форума имею право на всё, что не противоречит законодательству страны их дислокации - я абсолютно уверен, что их законом запрещена дискриминация человека по языковому или иному признаку.
В маленькой компании директор может быть и ведущим конструктором, и бухгалером и разнорабочим...
Типа: участковый в деревне Захрюкино - местный Генералиссимус от МВД. Компания, где все в одном лице + 1,5 узбека, это ИП. Можешь назначить там себя хоть Повелителем Вселенной, только это не значит, что ты им стал. Сколько общался с конструкторскими отделами, обычно всем хватало ума позвать специалиста в требуемой области и решать проблему с ним. Иначе: "Над вами потешаться будут" (с)М.Булгаков.
Здравствуйте!
Имеется вопрос по работе с регистрами - есть ли возможность напрямую транслировать состояние одного регистра в другой, дабы избежать использования промежуточной переменной state и digitalWrite() c целью чтобы запись прошла максимально быстро? Пример кода:
Конструкция типа PORTB |= (PINB & (1 << 2)) << 1 работать отказывается.
Прошу совета компетентных товарищей, как поступить в данном случае.
Спасибо!