Нашел это - кто-то пользует?

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Вот интересная библиотека, но писал в личку, автор - не отвечает: http://cyber-place.ru/showthread.php?t=1909

кто-то уже пользовался? Можете объяснить как это может работать? 500-600 байт на скетчи в примерах, имхо как-то круто. Точно работает?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

О! Реклама поперла.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Arhat109 и там насрал.

Beginner100500
Offline
Зарегистрирован: 24.07.2015

прошу прощения, если зря запостил. Там в описании "допишу позже" на самом интересном месте, а в самом файле по английски ... не дружу.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Автор бреда по Вашей ссылке - напыщенный индюк.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

скоро приедет куча 2560 (или не придут))) ) буду туда заливать скетчи на 4 байта. сэкономлю память а архату за каждый съэкономленный байт буду деньги отправлять. человек старался делал все таки

Radjah
Offline
Зарегистрирован: 06.08.2014

Еще одна CyberLib что ли?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

Товарищи! отказывайтесь от библиотек,  обретайте знания ! :)

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

dimax пишет:

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

Товарищи! отказывайтесь от библиотек,  обретайте знания ! :)

товагигищи!, проклятые империалисты вас обманывают!

дуино нет - есть AVR-контроллеры!

не пользуйтесь компиляторами - пишите сразу в машинном коде!

далее

контроллеры придумали рептилоиды, что бы отучить человечество думать - пользуйтесь однобитовым методом записи информации!

00011101011011101111101010100000110110110101101111110101010101011110101011111111111111110010010010101010101010010101010101010101010101010101010101 

vvadim
Онлайн
Зарегистрирован: 23.05.2012

dimax пишет:

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

Товарищи! отказывайтесь от библиотек,  обретайте знания ! :)

а вариант, что не хочется быть великим программером не расматривается?

большинство на этом форуме занимаются своими проектиками или просто играются с мк и им абсолютно не нужно глубокое изучение с++

библиотеки НУЖНЫ

СПАСИБО тем кто их пишет и публикует.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

vvadim
Онлайн
Зарегистрирован: 23.05.2012

Дима, это не оправдание.
ну не нужно мне глубоко в изучение языка лезть.
я ковыряюсь на своём каком то уровне. и библиотеки мне как раз в помощь. 
если с чем то незнакомым или непонятным сталкиваюсь - погуглю, почитаю, если не разберусь задам вопрос на форуме

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

dimax пишет:

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

 

Согласен но не на все 100%
Я например любитель, библиотеки мне очень помогают. В крайнем случае можно разобраться как работает библиотека и изменить ее под свои нужды не сильно вникая в даташит.
Я бы не взялся сам писать код для работы с SD картой. Но например часы DS3231 можно и без библиотеки использовать так как многое, что заложено в библиотеке мне не нужно. 

То же и с битовыми операциями, посмотрел на форуме, есть много интересных решений и ваши тоже dimax.
Но в коде они для меня совершенно не читаемы. Может быть постепенно отлаживая и модернизируя код я переведу некоторые операции на работу с битами (будет и быстрее и памяти поменьше требуется) и подробными комментами к ним, но первично проект должен заработать, иначе он так и останется на полке. Это просто мой случай, у других может быть и иначе.

Просто если нужно решить простенькую задачу, например то что я делаю сейчас - логгер температуры, влажности, давления, освещенности, то если я буду разбираться с даташитом каждого датчика то никогда работу не завершу. Будет постоянное улучшение ради улучшения.
А запустив логгер, будет интересно модернизировать и оптимизировать код. Опять же рабочий проект можно выложить здесь или на подобных форумах и получить советы и новые идеи. 
А вот проект с досветкой растений у меня так и завис, именно из за попыток не запустить его, а из за постоянного желания что то улучшить :-(

Я читал гдето в ваших постах, что програмирование для вас тоже хобби, а не основная работа. Для меня так же. Но подходы к реализации у нас разные.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

dimax пишет:

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

ну, и типа, зачем грузчику учиться в школе?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

1 - кто-то уже пользовался?
2 - Можете объяснить как это может работать?

1 - Arhat109 , 2 -  Arhat109

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

SU-27-16 пишет:

1 - кто-то уже пользовался?
2 - Можете объяснить как это может работать?

1 - Arhat109 , 2 -  Arhat109

3 - всё зло в мире от грузчиков, не рубящих фишку в теории струн.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при переноске фортепиянов не нужно рубить в теории струн , в горизонте событий....
ГЛАВНОЕ - не перепутать подъезд ! ( особенно , если этаж 9...17-ый )

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

SU-27-16 пишет:

при переноске фортепиянов не нужно рубить в теории струн , в горизонте событий....
ГЛАВНОЕ - не перепутать подъезд ! ( особенно , если этаж 9...17-ый )

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

совсем запутал....
мне казалось у сантехников - теория струй ? зачем им рояли ?

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

SU-27-16 пишет:

совсем запутал....
мне казалось у сантехников - теория струй ? зачем им рояли ?

сантехники посредсвом роялей слушают Баха.

*пока нисчеброды-академики слушают Баха на своём айфоне, сантехники могут себе позволить живую музыку.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

сантехники могут себе позволить живую музыку.
в смысле - еБашить ?

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

SU-27-16 пишет:

сантехники могут себе позволить живую музыку.
в смысле - еБашить ?

в смысле - слушать музыку, кретин.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

сам такой :)
еБашить - слушать сонату 777 ( в версии 0.7 литра )
http://bachmusic.narod.ru/notes1.html

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Интересно у вас тут))) Начали с библиотек, а закончили сантехниками, сонатами и теорией струн. И все это на одной странице.)) И все же, как начинающий ардунщик с начальным абсолютно нулевым уровнем знаний в области программирования, от себя скажу, что библиотеки для таких как я очень полезная штука и без них была бы высока вероятность "отвала" всех начинающих... А писать код без них, это уже для гурманов, ибо нафига мне машина с мах скоростью 250кмч, если я старикан и 90 мне за глаза)))

vvadim
Онлайн
Зарегистрирован: 23.05.2012

 Дык ещё пухлявый может с доктором подтянуться - тогда с теорией струн воще веселье начнётся )))

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Докотор не может ни подтягиваться, ни отжиматься. Доктор старенький.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Andrey-S, да не в скорости дело. А в возможностях. Зная как работает те-же таймеры в м.к. можно решить гораздо более сложные задачи, чем не зная этого, и обращаясь к ним через библиотеку. Такая же ситуация и с другими вещами. Всему своё время, возможно скоро вы столкнётесь с тем, что поставит вас в тупик из-за отсутствия нужных знаний. Тогда, возможно, по-другому посмотрите на многие вещи. Я раньше думал точно так-же, что можно обойтись. Но периодически что-то попадалось, что вводило в сомнение, и уже думал: нет, конечно однажды нужно сесть и разобраться с этими таймерами. Но когда конкретно я этим займусь так и не планировал. Но однажды общались в одной теме, и наш форумчанин с ником a5021 предложил лёгкое решение одной задачки. И дал код как раз без использования библиотеки. Я даже ссылку сохранил :)  Это было последней точкой, и я наконец занялся изучением таймеров :) Потребовалось всего пару дней что б разобраться и поэкперементировать.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

dimax пишет:

Andrey-S, да не в скорости дело. А в возможностях. Зная как работает те-же таймеры в м.к. можно решить гораздо более сложные задачи, чем не зная этого, и обращаясь к ним через библиотеку. Такая же ситуация и с другими вещами. Всему своё время, возможно скоро вы столкнётесь с тем, что поставит вас в тупик из-за отсутствия нужных знаний...

dimax, я полностью согласен с Вами и точно знаю, что так случится, но это теоретически тоже самое что и "дедушки стало недостаточно езды в 90кмч ибо ему теерь необходимо обгонять впереди идущего дедушку под 89 кмч"))). Но по мне лучше сначала "научиться ездить 90кмч" и только потом, обгонять и переходить на более высокую скорость, а не делать это все разом впервые. А в целом Вы абсолютно правы.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dimax пишет:

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

Упрутся - изучат, (это если нормальные люди) а форсировать-то зачем. Люди должны творить, а не тонуть в рутине. Именно для этого и придумали сначала языки высокого уровня, а затем и библиотеки на все случаи жизни.

Опять же, я, например, не люблю пользоваться чужими библиотеками - пишу свои. Но все равно ведь - библиотеки. Потому что удобно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SU-27-16 пишет:

при переноске фортепиянов не нужно рубить в теории струн , в горизонте событий....
ГЛАВНОЕ - не перепутать подъезд ! ( особенно , если этаж 9...17-ый )

Ну вот, видишь, - грузчику, оказывается нужно уметь читать номера подъездов и считать этажи. А то - зачем в школе учиться!

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Всем спасибо за помощь и деловые ответы. Понятно, что автор ответит лучше всех, но он молчит, и как почитал - он сейчас похоже в отъезде и надолго.

Только вот остался вопрос: как мне силами типовой библиотеки организовать дифференциальное чтение аналоговых входов? Тут я нашел какое-то упоминание и функцию

// differential and gain "neg-poz" read
// neg:[0,2|8,10], poz:[0..3|8..11], g:[GAIN_10,GAIN_200], adlar:[ADC_LEFT|ADC_RIGHT]
#define admux2Gain(src,neg,poz,g,adlar)                              \
{                                                                    \
  ADMUX = ((src)|(8+(((neg)&2)<<1)|(((g)&1)<<1)|((poz)&1))|(adlar)); \
  ADCSRB |= ((poz)&8);                                               \
  if((poz)&8) { DIDR2 |= ((pin)&7); }                                \
  else        { DIDR0 |= ((pin)&7); }                                \
}

Только не могу понять как её пользовать, так чтоли?

 admux2Gain(admuxSrc("AVCC"), 0, 1, "GAIN_10", "ADC_RIGHT");

так выдает кучу ошибок... вот так как в примере - не выдает, но разве это правильно?

 admux2Gain(admuxSrc(AVCC), 0, 1, GAIN_10, ADC_RIGHT);

и как понял с моим английским, это только настройка преобразователя, а КАК организовать аналоговый ввод в дифференциальном режиме по-другому?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Beginner100500, разговор о дифф.входе не мыслим без уточнения о каком конкретно М.К. идёт речь. Например в atmega328 нет такой возможности вовсе. 

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Да, извиняюсь что не указал сразу: ATmega2560. На выходных попробовал примеры - всё работает, фантастика какая-то. Но меня она заинтересовала именно этой возможностью. Но толи автор недописал, толи что, но я так и не понял как мне организовать чтение в диф. режиме.

Задача: есть 2 аналоговых напряжения, сильно похожих и мне надо получить их разницу в режиме "онлайн", желательно с пред. усилением раз 10-20. Из даташита понял, что мега это может, но вот хоть какое-то упоминание нашел только в этой либе. А как пользовать - так и не понял.

Да и ваще "мало что понимаю" в этом, как тут сказали - бреде: в примере с сервами есть такое использование

timerControl(servoTimer, A) = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
timerControl(servoTimer, B) = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);
timerCapture(servoTimer) = 4999;

Как понимаю, это установка таймера в какой-то режим силами прямых команд. Но, ни "А" ни "В" нигде не определены.Так разве можно писать? А ведь работает, проверил. Фантастика какая-то. :)
 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ниче вы так устроили тут митинг в уголке.
Да не будет никто ничего изучать. 99.99% случаев это повторение чужих проектов с минимальными косметическими изменениями под себя.
Типа как ДВС , 100 лет назад заморочились и сделали формы и так и льют в них двигателя. Иногда заклеют какую дырку. Иногда новую просверлят и датчик воткнут. А в целом все тоже самое.
ничего принципиально нового. Какой смысл пилить новые библиотеки.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Beginner100500 пишет:
timerControl(servoTimer, A) = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
timerControl(servoTimer, B) = (1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10);
timerCapture(servoTimer) = 4999;

Как понимаю, это установка таймера в какой-то режим силами прямых команд. Но, ни "А" ни "В" нигде не определены.Так разве можно писать? А ведь работает, проверил. Фантастика какая-то. :)
 

Всё просто,  где-то стоит функция переопределения на реальный регистр таймера. Для первого таймера аналогичная запись, но напрямую, была бы такой: TCCR1A= TCCR1B=

 

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:
Какой смысл пилить новые библиотеки.

что бы в мире не стало грузчиков - все будут заниматься теорией струн в пещерах и на деревьях. #10

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Там написано вот так:

#define timerControl(p,r)       _timerControl(p,r)      // get/set control registers:    p:[0,2,[1,3,4,5]], r:[A,B[,C]]

 а раньше, выше так:

#define _timerControl(p,r)    (TCCR##p##r)

Как вот это работает, мне совершенно непонятно. Уж извините, но как прочитал, команда препроцессора ## соединяет в одно целое текст и, действительно должны получить "TCCR1A". Но, вроде как там же, в описании препроцессора написано что эта операция отменяет дальнейший разбор команд препроцессором, а тут выходит что или компилятор заранее знает что такое TCCR1A или препроцессор как-то продолжает свою работу. Да, ещё нашел что макрос TCCR1A на самом деле определен в недрах io.h

Убил все выходные в попытках понять как это работает... яснее не стало.
 

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Ладно, фиг с ней, этой либой.

Как мне решить задачу дифференциальной оцифровки двух похожих напряжений?

Есть иные решения, кроме этой либы?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Beginner100500, по поводу слияния ## вы вроде правильно поняли. По поводу дифф.аналогового чтения -то эта функция только путает, но разобраться можно. Откройте даташит на странице 283, там  перечислены все комбинации мульплексора. Я бы не стал разбираться с функцией, а сразу бы писал в нужные регистры нужные значения, так проще. :)

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Даташит на английском, а у меня с ним проблемы... пробовал его читать, но честно говоря мало что понял. Увы.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Beginner100500, не страшно. В нужных местах там не слова, а цифры. Решайте задачу поэтапно.Откройте ту таблицу, выберете нужную комбинацию входов и усиления. Потом заполните регистры, я помогу :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Beginner100500 пишет:

Ладно, фиг с ней, этой либой.

Как мне решить задачу дифференциальной оцифровки двух похожих напряжений?

Есть иные решения, кроме этой либы?

Что есть "дифференциальная оцифроыва"?

Вот это?

Цитата:

Задача: есть 2 аналоговых напряжения, сильно похожих и мне надо получить их разницу в режиме "онлайн", желательно с пред. усилением раз 10-20.

ТОгда вообще непонятно, зачем нужна какая-то либа, неужели арифметики не хвататет?

diffValue = (GetSensor1() - GetSensor2())*10;

Чтобы увеличить точность, а заодно избавиться от шума (аналоговые входы этим грешат):

diffValue = 0;
for (int i = 0; i < 10; i++)
    diffValue += GetSensor1() - GetSensor2();

 

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Ключевое слово "онлайн". Пока я буду читать по отдельности - получу кашу вместо разности. И аппаратный зум далеко не тоже самое что умножить на 10 (цифровой).

Дмитрий, ну давайте определимся, что сигналы подключены к ногам 0 и 1 аналоговых входов. Усиление, пусть будет 10. Что я должен найти на этой странице? Там кстати нет никакой таблицы, а только разделы 26.5.2 и 26.6 - чего-то про подавление шума и какое-то описание напряжений.

Beginner100500
Offline
Зарегистрирован: 24.07.2015

У нас разный даташит? Открыл ваш по ссылке, и там есть табличка, а у меня такая ниже, на стр. 291. Ну, собственно ADMUX (так кажется), надо ставить в режим 001001, если правильно понял: вход 0 - отрицательный, вход 1 - положительный и усиление 10х. Так? Что дальше?

Вы извините, но я все равно не понимаю, как установить этот ADMUX и где я должен получить результат...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

У меня на этой странице по той ссылке Таблица 26-4. Вы выбрали 0 и 1 и усиление 10, значит нам подходит вторая строчка сверху. Пишем данные 001001 .  Нули нам програмировать не нужно, они по умолчанию, значит наши первые данные MUX3=1, MUX0=1. Крутим даташит вниз. Параграф 26.8.3 Регистр ADCSRA , так же расставляем единички. Включим АЦП ADEN=1 adsc потребуется позже. ADPS2:0 делитель частоты для ацп. Таблица 26-5. Рекомендуется 50..200КГц, ставим все единички.Параграф 26.8.6 DIDR отрубаем от цифрового буффера наши два входа. ADC1D=1 ADC0D=1 . А не, про референс забыл. параграф 26.8.1 Если референс = напряжение. питания, то ставим REFS0=1

Рисуем конечную функцию:

DIDR0|=(1<<ADC1D)|(1<<ADC0D); //отключим цифр. буфер
ADMUX=(1<<REFS0)|(1<<MUX3)|(1<<MUX0); //наши 0 и 1 входы и референс от питания платы
delayMicroseconds(125);//дождаться пока мультиплексор отреагирует.
ADCSRB= 0;// тут ничего полезного не было, обнулим на всякий пожарный.
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);// div 128; ADC enable
ADCSRA |= (1<<ADSC); //преобразовать семпл
while (bit_is_set(ADCSRA,ADSC)); //дождаться конца работы.
float millivolt=(ADC*5.0)/5.12; // в милливолтах, c учётом 10-кратного усиления.
// напряжение,в = ADC * ref / 512 * усиление

Кстати, максимальная разница напряжений между A0 и A1 будет  ref/10 то есть 0,5 вольта в данном случае. Напряжение между A0/A1 и общим выводом не должно быть более чем ref, или 5 вольт в данном случае.
 

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Ничё не понял, но все равно пасибки. Домой доберусь попробую. Сейчас на работе.

Beginner100500
Offline
Зарегистрирован: 24.07.2015

Потестил, так работает. А вот макрос из библиотеки - не компиляется, выдает синт. ошибки. Посмотрел ваш код и код макроса - там явно ошибки: судя по вашему коду неверно устанавливается DIDR0, а в остальном тоже самое. Кажется смог поправить, итого получилось так:

// differential and gain "neg-poz" read
// neg:[0,2|8,10], poz:[0..3|8..11], g:[GAIN_10,GAIN_200], adlar:[ADC_LEFT|ADC_RIGHT]
#define admux2Gain(src,neg,poz,g,adlar)                              \
{                                                                    \
  ADMUX = ((src)|(8+(((neg)&2)<<1)|(((g)&1)<<1)|((poz)&1))|(adlar)); \
  ADCSRB |= ((poz)&8);                                               \
  if((poz)&8) { DIDR2 |= (1<<((poz)&7)); }                           \
  else        { DIDR0 |= (1<<((poz)&7)); }                           \
  if((neg)&8) { DIDR2 |= (1<<((neg)&7)); }                           \
  else        { DIDR0 |= (1<<((neg)&7)); }                           \
}

// окончательно оставил так:

#define adcStart() {ADCSRA |= (1<<ADSC);}

int adcRead(){
  while( bit_is_set(ADCSRA, ADSC) );
  return ((ADCH<<8)+ADCL)-512;
}

int difResult;

admux2Gain( admuxSrc(VCC), 0, 1, GAIN_10, ADC_RIGHT);
adcOn();
delayMicroseconds(125);

adcStart();
difResult = adcRead();

Просто сравнил оба варианта и понял, что это "одно и тоже", но второй вариант для меня значительно читабельнее. Особенно через пару месяцев.

Пасибки вам, что помогли разобраться.