Ви не увійшли.
Для чпу ли мне это? Отчасти да, устройство будет подсчитывать импульсы и крутить двигатель, но это не чпу. Есть такой недостаток при большом разрешении энкодра наблюдается такой эффект, двигатель стоит о импульсы бегут! Дребезжание вала двигатель приводит к ложному подсчету импульсов
Мне нужен код для энкодер с 400 - 1000 импульсов на оборот потянет ли ардуино такой подсчёт
Компиляция операторов СИ на ASM происходит по стандартным процедурам а меняется только условие и от них как я понимаю зависит время выполнения, поэтому я и поделил производительность на 4, видимо мало...
Собственно к чему это все, на какую производительность можно рассчитывать скажем при обсчете энкодера на двигателе? или переходить на ASM? Так всё равно придется писать тоже только на ASM, выиграть пару тактов при условии досконального знания ассемблера?
То есть так и должно быть?
Нормально не могу прошить, приходиться перед прошивкой держать reset и отпускать когда начинается прошивка, только тогда с 5 попытки получается прошить. Есть два переходника USB to TTL на PL2303 и CH340 на первом вообще прошить не получается на втором с "бубном" , в чём может быть дело?
Привет всем, хочу обсудить производительность AVR, собственно я столкнулся с таким фактом. Код программного таймера или что-то похожее на это, в моём понимании.
В книге написано, что архитектура AVR позволяет давать производительность 1000000 операций на мегагерц, если частота ардуино 16 мегагерц то должна быть производительность 16000000 операций в секунду. Понятно, что даже в этом коде есть не только обратный счёт но и условия цикла и прочие. Допустим разделим производительность на 4 то получим 4000000 операций в секунду, то есть за секунду должно насчитать до 4000000 делим 65535 и получим 61 раз полное заполнение переменной а поскольку числа меньше то заход в if должен произойти еще чаще. Но в реальность это происходить примерно раз в 0.2 секунды. Возникает мысль толе я что-то не правильно делаю, понимаю или это так и должно быть.
Смотря на библиотеки там и вызов функций из функций и структуры и ссылки, указатели и прочий дремучий лес и все это работает быстро а тут обычный счётчик и такой конфуз
int temp = 0x3800;
while(1)
{
if (temp ==0)
{
какой то код...
temp = 0x3800;
}
temp--;
}
Tам куча кнопок, мотор, lcd и энкодер? У меня она пока только в голове.
DDRA = 11111111;
PORTA = 11111111;
DDRC = 11111111;
PORTC = 11111111;
Я предпочитаю так настраивать порты и внутренние резисторы.
Очевидно, что дело в питании, там и копайте, возможно китайцы где то ошиблись или "соплю" повесели
По идеи они должны работать и программа компилируется, у меня LCD висит на A 0 - 5 при 5 заменить на 6 результат нулевой LCD перестаёт работать
И он начнет там писать от страха, может лучше обои?
Парни мне для проекта не хватает выводов, осталась только два выше упомянутых, но они работают только как аналоговые?
Проверьте цепь между силовыми выводами реле и входами в плату, также если земля общая то возможно могут быть помехи от ЭДС самоиндукции клапанов.
Мега здесь вовсе не нужна была, достаточно и нано было. На сколько я знаю эти реле управляются низким уровнем. Ну и наконец вы хоть бы код выложили, а что так гадать то...
Нужна кинематическая схема и электрическая.
Я думаю это все легче реализовать на релейной и аналоговой схеме по узлам. К тому же как я понял вы хотите использовать мегу. Если это ваш станок то не чего страшного нет, но если на нем будут работать люди которые не знают как работает программа, то это может стать большой проблемой...
Капец, ну глаз, мерцание...А кода значение меняется Вы то же мерцание видите
?
Интересно если сделать так...Тоже будет "мерцать"
lcd.setCursor(2, 0);
lcd.print(" "); - стираете 5 символов
lcd.setCursor(2, 0);
lcd.print(n) - печатаете переменную n не больше 5 символов с той же позиции.
Возможно топорно но просто ( без каких то вычислений длины печати и пр. лабуды).
Ну если лишний код, извините я уж не знаю "лишняя ли у попа жена"
Спасибо нужно будет попробовать. И всё же две попы тоже не ахти.
if (update_lcd==0)
{
lcd.setCursor(0,0); //курсор.
lcd.print("Counter:"); //выводит текст.
lcd.print(lcd_Counter_0); //выводит значение переменной.
lcd.print(lcd_Counter_1); //выводит значение переменной.
lcd.print(lcd_Counter_2); //выводит значение переменной.
lcd.print("."); //выводит текст.
lcd.print(lcd_Counter_3); //выводит значение переменной.
lcd.print("MM"); //выводит текст.
lcd.setCursor(0,1); //курсор 0 символ 2 строка
lcd.print("Сaliber:"); //выводит текст.
lcd.print(lcd_caliber_0); //выводит значение переменной.
lcd.print(lcd_caliber_1); //выводит значение переменной.
lcd.print(lcd_caliber_2); //выводит значение переменной.
lcd.print("."); //выводит текст.
lcd.print(lcd_caliber_3); //выводит значение переменной.
lcd.print("MM"); //выводит текст.
update_lcd = 4095;
}
update_lcd = update_lcd--;
goodspeedmen, Какой у Вас ЛЦД? Если типа 1602 или аналогичный то перед выводом на дисплей очистите соответственно количество символов с позиции которой Вы выводите на экран. С графическим немножко сложнее нужно очистить прямоугольник.
Если не очищать то получается примерно такое:
102.4
98.74 - а должно быть (хотелось вывести) 98.7.
Да 1602. Я думал передвигать курсор, очищать его if (lcd... < 100) но получается мерцание при очистке ну и к тому же упираемся в лишний код который не нужен...
Ребята я очень всем благодарен всем за ваши ответы но поймите я не умею читать мысли, если их пишите то излагайте из в виде кода, мы же тут "программисты" всё же
Честно сказать после ваших ответов я чувствую себя ущербным (я не обидчивый и готов выслушивать конструктивную критику если от неё есть польза)... Как придумал, смотрел видео, читал про работу контроллеров для вывода информации на экран нужен байт как по мне вполне очевидный вывод учитывая вводные параметры. Опрос if происходит по мере необходимости соответственно процессору легче оперировать этими цифрами (мне так казалось) И оно отлично работает к тому же. Просто возникла проблема, нужно сравнивать эти цифры на "<" ">" с таким же количество байтов и тут иногда по каким то непонятным мне причинам определяется, сумма отпала сразу так как "от перемены мест слагаемых сумма не изменяется" x_0 > y_0 || x_1 > y_1 результат тоже не ахти.
Я же не специалист и не писал что бы кто то чего то исправлял. Я сужу из того что контроллер 8 битный его регистры тоже (значит с байтами ему работать проще), есть пары регистровые но все же это занимает его время на обработку инициализация long деление его, вывод информации и прочие. Честно я надеялся увидеть нечто совсем другое...
lowByte()
highByte()
Я так понял нужен форматированный вывод на дисплей. Варианта 3: преобразовать число в строку как вам надо и уже ее выводить на дисплей, использовать функции вывода поддерживающие форматирование, написать что-то свое.
0. 99 - это 9.9, 157 - это 15.7 и не надо никаких 2-х, 3-х или 4-х переменных, достаточно одной, NoName вам все написал.
1. 99/10 = 9. Выводим {009} или { 9} или форматируем как надо.
2. Выводим точку {.}
3. 99 [10] = 9. выводим {9}
Результат 009.9 или 9.9
Как-то так.
Я конечно не специалист но после деления в перемененной останется число деления а не исходное вот поэтому я и использовал переменный для сохранения результата и вывода его на экран
а можно как то подробней что то у меня ерунда получается какая то long хранит четыре бита но запятая то как получается
Допустим записываем в неё 157 / 10 = 15 дробная часть опускается значит её нужно выделить перед преобразованием 157 [10] = 7 и здесь это работает, но вот проблема начинается если если в переменной 99 / 10 получается 9 а не 90 и всё ровно мне пришлось использовать две байтовых переменных для вывода на экран, что как то совсем странно использовать 6 байт вместо 4. Изначально я использовал 4 байтовых переменных который отображаясь на экране считаются с право налево в порядке возрастания.
............
lcd_3++
if(lcd_3==10)
{
lcd_3 =0;
lcd_2++;
}
if(lcd_3==10)
{
lcd_3 =0;
lcd_1++;
}
if(lcd_1==10)
{
lcd_1 =0;
lcd_0++
}
if(lcd_0==10)
{
lcd_0 =0;
}
ночные посиделки не очень хорошо сказываются на мыслительных процессах
спасибо попробую