arduino & i2c - danila i need help

Компьютеры, программы, периферия, коммуникации, интернет, программирование и т.п. Ранее назывался Hard-n-Soft.
Сообщение
Автор
Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 30 Сообщение Пойманый_маньяк » 14 янв 2014 16:56

29: djdance:

> если только одно из них отрицательное на этапе присвоения из сигнед

Кодов автора не видно, теоретизировать можем долго :)

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

С учетом того что long от unsigned long отличается ТОЛЬКО знаком.
И того, что знак минус в 4-х байтном беззнаковом числе равен 2147483648...
По моему 2147483648 подозрительно похоже на "огромное несуразное число".

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 31 Сообщение djdance » 14 янв 2014 17:01

30: Пойманый_маньяк:
> Кодов автора не видно, теоретизировать можем долго
так это и интересно :)

> я тыщу раз видел уже, практически во всех языках.
так то ж разумеется.
разве что в паскале\дельфи ты такое не увидишь, сразу AV будет.

Axl
Благодарил (а): 1 раз

№ 32 Сообщение Axl » 14 янв 2014 21:09

Э-э-э... без цитирования.
1. Предложенные примеры попробую и доложу.
2. Никто переменную портить не должен был. Массива никакого рядом не было. Внутренний таймер и всякие манипуляции вокруг да около (туда-сюда-плюс-минус), борол возможный дребезг кнопки ну и т.д.
3. Код был примерно как я написАл в сообщ. 25. Есть версия, что я мог пытаться сложить long и unsigned long либо что-то в этом духе. Но это уже выяснить затруднительно, ибо в процессе ловли я там сначала закомментировал, потом прокомментировал по-матерному в письменном виде, а потом стёр)). И с тех пор в скетче многое поменялось и я уже могу не вспомнить.
4. Числа получались разные, но близкие. И не те, что ожидались. Отрицательным взяться было неоткуда. Ну и выяснил это, навставляв всюду Serial.print(var...). Всё заработало после того, как я просто убрал у всех "unsigned".
5. Сообщ. 30 не понял. Как это "знак минус равен 2147483648"? В описании языка сказано:
Тип данных long используется для хранения целых чисел в расширенном диапазоне от -2,147,483,648 до 2,147,483,647. long занимает 4 байта в памяти.
Unsigned long используется для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295 (2^32 - 1) и занимает 32 бита (4 байта) в памяти.
Ну да ладно.
6.
Изображение

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 33 Сообщение Пойманый_маньяк » 14 янв 2014 23:04

32: Axl:

Почему максимальное значение long по модулю 2.147.483.648, а максимальное значение unsigned long в 2 раза больше 4.294.967.295?

Потому-что самый первый бит в signed long - это знак.
Знак кодируется в старшем разряде числа: 0 соответствует положительным, а 1 отрицательным числам.
http://ru.wikipedia.org/wiki/%D0%A6%D0% ... 1%8B%D1%85)
Ладно, с long'ами нарисую, раз с битами не прокатило.

Представляем в памяти вот такие 4 байта:
1000 0000 0000 0000 0000 0000 0000 0011

Если эти 4 байта ты обозначил как знаковое (signed long), то красная единица - это знак минус.
А если эти 4 байта ты обозначил как беззнаковое (unsigned long), то красная единица - это часть числа, равная 2147483648.

Две синие единицы понятно в любом случае 1 + 2 = 3.

Соответственно:
Если это signed long, то это число - минус 3.
А если unsigned long, то это число - плюс 2147483651.

MadBiker
Аватара пользователя
Благодарил (а): 4 раза
Поблагодарили: 66 раз

№ 34 Сообщение MadBiker » 14 янв 2014 23:50

32: Axl:
> 6.

Нету четырёхстрочника. :ku:

[в сторону]

Как же приятно наблюдать за половой жизнью этих сишников.. Ведь наверняка же, на пустом месте, и Си им был и не нужен. :D

Axl
Благодарил (а): 1 раз

№ 35 Сообщение Axl » 14 янв 2014 23:59

33: Пойманый_маньяк:
Всё это я себе примерно так и представлял с самого начала.
Видимо, действительно, какая-то переменная типа long приняла отрицательное значение, а потом я её прибавил к unsigned long, который в свою очередь "распух".
Надежда была на то, что всё будет, во-первых, положительное и, во-вторых, однотипное и поэтому никаких казусов не будет.
Ну, получается, не вышло, бывает :shuffle:
Это версия, которая всё объясняет, её тут уже озвучили, но не знаю, надо было сразу разбираться...
Ладно, спасибо за этот "детский сад" :)

Пришёл спросить дисплей - научили типам :cry:

Пойманый_маньяк
Аватара пользователя
Благодарил (а): 404 раза
Поблагодарили: 694 раза

№ 36 Сообщение Пойманый_маньяк » 15 янв 2014 01:28

35: Axl:

> Пришёл спросить дисплей - научили типам :cry:

Это еще не научили :D
Это краткая справка строго по данной проблеме! :no-no:
С плавающей точкой например казусы гораздо интереснее.

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

Какие-то на работе вроде были, но вот подойдут ли...
И переезжаем сейчас в другое здание, могу не найти. Могу спросить.

Пин
Аватара пользователя

№ 37 Сообщение Пин » 15 янв 2014 06:09

Пойманый_маньяк писал(а):35: Axl:

> Пришёл спросить дисплей - научили типам :cry:

Это еще не научили :D
Это краткая справка строго по данной проблеме! :no-no:
С плавающей точкой например казусы гораздо интереснее.

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

Какие-то на работе вроде были, но вот подойдут ли...
И переезжаем сейчас в другое здание, могу не найти. Могу спросить.
Я так понял ТС нужен ЖК на контроллере HD44780 или аналоге.
Есть на работе такие 16*4. Сегодня посмотрю, если есть свободные могу дать, но с возвратом.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 38 Сообщение djdance » 15 янв 2014 09:28

34: MadBiker:
> Как же приятно наблюдать за половой жизнью этих сишников.. Ведь наверняка же, на пустом месте, и Си им был и не нужен.

да там не чистый С, там покоцанное слабодокументированное и очень уязвимое подобие. Когда я на ём намастачился писать, я с гордостью прибавил +1 язык программирования к своим восьми :super:

Пин
Аватара пользователя

№ 39 Сообщение Пин » 15 янв 2014 10:41

djdance писал(а):34: MadBiker:
> Как же приятно наблюдать за половой жизнью этих сишников.. Ведь наверняка же, на пустом месте, и Си им был и не нужен.

да там не чистый С, там покоцанное слабодокументированное и очень уязвимое подобие. Когда я на ём намастачился писать, я с гордостью прибавил +1 язык программирования к своим восьми :super:
Там это где? Ардуинки можно и на асме программировать.

Axl
Благодарил (а): 1 раз

№ 40 Сообщение Axl » 15 янв 2014 12:06

36: Пойманый_маньяк:
> Дисплей нужен любой 4-х строчный?
> ....могу не найти. Могу спросить.

37: Пин:
> Я так понял ТС нужен ЖК на контроллере HD44780 или аналоге.
> Есть на работе такие 16*4. Сегодня посмотрю, если есть свободные могу дать, но с возвратом.

Я писАл, что
> Нуждаюсь в дисплее для Arduino "на поиграться".
> 16х2, 20х2, 20х4 или, э-э-э... любой, подходящий без особого колдунства...

На текущий момент я вижу это дело так:
- по числу знакомест - без особой разницы, хотелось бы 2 или более строк, а проблемы мы везде найдём;
- если дисплей "на контроллере HD44780 или аналоге", то он подключается "параллельно", используется библиотека LiquidCrystal и никаких проблем(почти, что-то будет наверняка сдвигаться не туда, отображаться не там ну и т.д. в зависимости от);
- если на другом контроллере - то можно попробовать найти соотв. библиотеку и подключить её, тоже вариант, лишь бы это было не очень экзотическим, кем-то уже побеждалось и описано в сети;
- если с шиной I2C - то подключается "последовательно", с сохранением свободных пинов... э-э-э... а дальше я пока глубоко не копал.

Спасибо за внимание.

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 41 Сообщение djdance » 15 янв 2014 12:08

39: Пин:
да? не видел. Но зачем :)

MadBiker
Аватара пользователя
Благодарил (а): 4 раза
Поблагодарили: 66 раз

№ 42 Сообщение MadBiker » 15 янв 2014 15:06

38: djdance:
39: Пин:
> Ардуинки можно и на асме программировать.

Во-во. Вот нафига Си было юзать, если нет извратов с плавающей точкой и (или) криптографией? На кой он фиг и кому он там сдался? :lol:

40: Axl:
> - по числу знакомест - без особой разницы, хотелось бы 2 или более строк

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

Пин
Аватара пользователя

№ 43 Сообщение Пин » 15 янв 2014 17:25

djdance писал(а):39: Пин:
да? не видел. Но зачем :)
Лично для меня, ардуино - это всего лишь атмега, запаянная на плату с небольшой периферией и схемой питания. Посему программировать его можно хоть на чем. Лично я использую Си с ассемблерными вставками где надо. Всякие ардуинские библиотеки не использую принципиально, так как писаны они непонятно кем. Даташита на контроллер вполне достаточно, там и примерчики всегда есть хош на си хош на асме.

ТС извиняй, все ЖК уже расписаны. Есть один 16*4 немного коцаный, я его для всяких отладок использую, надо?

djdance
Аватара пользователя
Благодарил (а): 1 раз
Поблагодарили: 4 раза

№ 44 Сообщение djdance » 15 янв 2014 17:29

43: Пин:
олдскул, чо. :up:

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 45 Сообщение ХЗ » 19 янв 2014 00:25

43: Пин:
41: djdance:
36: Пойманый_маньяк:
Ваши предложения по _грамотному_ измерению PWM на частоте 20-30 kHz ?
Я ее измеряю, но мне чет не нравится :)
Atmega328 (Mini Pro вроде).

MadBiker
Аватара пользователя
Благодарил (а): 4 раза
Поблагодарили: 66 раз

№ 46 Сообщение MadBiker » 19 янв 2014 04:22

45: X3: Всё та же задача? ;)

Пин
Аватара пользователя

№ 47 Сообщение Пин » 19 янв 2014 10:37

X3 писал(а):43: Пин:
41: djdance:
36: Пойманый_маньяк:
Ваши предложения по _грамотному_ измерению PWM на частоте 20-30 kHz ?
Я ее измеряю, но мне чет не нравится :)
Atmega328 (Mini Pro вроде).
PWM подразумевает фиксированную частоту с изменяемой скважностью. Тебе чего измерить, то надо, частоту или скважность?

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 48 Сообщение ХЗ » 19 янв 2014 13:31

47: Пин:

Ну скважность конечно нужно. :)
Частота конечно будет постоянная, но неизвестно какая, в пределах 20-30 kHz.
Последний раз редактировалось ХЗ 19 янв 2014 13:32, всего редактировалось 1 раз.

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 49 Сообщение ХЗ » 19 янв 2014 13:31

46: MadBiker:
уже все готово. Но хочется по человечески :)

MadBiker
Аватара пользователя
Благодарил (а): 4 раза
Поблагодарили: 66 раз

№ 50 Сообщение MadBiker » 19 янв 2014 14:52

49: X3:
> уже все готово. Но хочется по человечески

Если хочется по человечески - дай ТЗ по человечески ;) Осциллограммы хотя бы, того, что должно быть.

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 51 Сообщение ХЗ » 19 янв 2014 15:33

50: MadBiker:
А какой информации не хватает ? Нужно узнать скважность входного PWM на определенных частотах.
Разрешения 0..255 мне вполне хватит. Время замера хочется чем меньше тем лучше (ну так, для порядка). У меня в рукопашную написано. Работает, но хочется красивого кода.

Ты ни разу не видел ШИМ на осциллографе ?

MadBiker
Аватара пользователя
Благодарил (а): 4 раза
Поблагодарили: 66 раз

№ 52 Сообщение MadBiker » 19 янв 2014 15:42

51: X3:
> Нужно узнать скважность входного PWM на определенных частотах.

Вот эта фраза смущает.

> Ты ни разу не видел ШИМ на осциллографе ?

Видел, да.

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 53 Сообщение ХЗ » 19 янв 2014 16:52

52: MadBiker:
> Вот эта фраза смущает.

Чем ? Мне не надо знать частоту. Мне скважность нужна. Частоту я заранее не знаю, знаю только ее пределы.

MadBiker
Аватара пользователя
Благодарил (а): 4 раза
Поблагодарили: 66 раз

№ 54 Сообщение MadBiker » 19 янв 2014 17:14

53: X3:
> Мне скважность нужна.

А в каких пределах, временных-то? И какая-точность нужна?

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 55 Сообщение ХЗ » 19 янв 2014 18:27

54: MadBiker:
> А в каких пределах, временных-то? И какая-точность нужна?

Скважность от 0 до 100%.
А какую точность ты можешь дать ?

Пин
Аватара пользователя

№ 56 Сообщение Пин » 19 янв 2014 18:59

X3 писал(а):47: Пин:

Ну скважность конечно нужно. :)
Частота конечно будет постоянная, но неизвестно какая, в пределах 20-30 kHz.
По сути тебе надо измерить длительность импульса. Первое что приходит в голову: формируешь прерывание по фронту и одновременно запускаешь счетчик на таймере. Для формирования прерывания лучше использовать входы INT0 или INT1 - они могут распознавать фронт и спад, остальные распознают только перепад. По спаду счетчик останавливаешь, читаешь сколько он насчитал и получаешь длительность. Чем частота счета таймера больше, тем меньше ошибка, поэтому выбирай частоту побольше. Для счета лучше использовать 16 разрядный Timer/Counter1.

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 57 Сообщение ХЗ » 19 янв 2014 19:11

56: Пин:
> По сути тебе надо измерить длительность импульса. Первое что приходит в голову: формируешь прерывание по фронту и одновременно запускаешь счетчик на таймере. Для формирования прерывания лучше использовать входы INT0 или INT1 - они могут распознавать фронт и спад, остальные распознают только перепад. По спаду счетчик останавливаешь, читаешь сколько он насчитал и получаешь длительность. Чем частота счета таймера больше, тем меньше ошибка, поэтому выбирай частоту побольше. Для счета лучше использовать 16 разрядный Timer/Counter1.

Ну надо еще время между двумя фронтами засекать. Такой вариант реализации был в мыслях. А повесить два обработчика прерываний на одну ногу можно разве ?

Пин
Аватара пользователя

№ 58 Сообщение Пин » 19 янв 2014 20:19

57: X3 пишет:
> 56: Пин:
>> По сути тебе надо измерить длительность импульса. Первое что приходит в голову: формируешь прерывание по фронту и одновременно запускаешь счетчик на таймере. Для формирования прерывания лучше использовать входы INT0 или INT1 - они могут распознавать фронт и спад, остальные распознают только перепад. По спаду счетчик останавливаешь, читаешь сколько он насчитал и получаешь длительность. Чем частота счета таймера больше, тем меньше ошибка, поэтому выбирай частоту побольше. Для счета лучше использовать 16 разрядный Timer/Counter1.
>
> Ну надо еще время между двумя фронтами засекать. Такой вариант реализации был в мыслях. А повесить два обработчика
> прерываний на одну ногу можно разве ?

Таки частоту надо измерять или нет. Если надо, то в принципе этот способ можно адаптировать, только счетчик сбрасывать по следующему фронту. Алгоритм такой: ловим фронт - запускаем счетчик, ловим спад читаем значение счетчика - получаем длительность "положительного" импульса, ловим следующий фронт останавливаем счетчик, читаем значение, вычитаем из него прочитанное ранее - получаем длительность "отрицательного" импульса, запускаем заново и т.д. Можно попробовать для измерения длительности отрицательного импульса использовать другой счетчик.
Вообще, общепринято для измерения времени использовать встроенные в контроллер таймеры/счетчики. В них счет происходит синхронно с тактовой частотой контроллера и отсутствуют всякие программные задержки.
Один пин может формировать разные прерывания, повторюсь, если это пины INT0 или INT1, то прерывания будут разные по фронту и по спаду.
По поводу измерения частоты достаточно всякого понаписано, погугли. Если на работе будет свободная минутка, попробую код набросать, но не обещаю, у нас постоянный аврал. Для тестирования написанного кода рекомендую использовать протеус, довольно наглядно и доступно. Там много всяких виртуальных инструментов, типа генераторов, осциллографов и тп. Можно симулировать работу устройств, не имея железа и измериловки в наличии.

ХЗ
Экономный
Благодарил (а): 158 раз
Поблагодарили: 347 раз

№ 59 Сообщение ХЗ » 19 янв 2014 20:45

58: Пин:
> Таки частоту надо измерять или нет.

частота как таковая не нужна. Но что бы узнать скважность, надо знать длительность положительного и общую длительность :) В итоге так и так частота получится посчитана, хотя мне лично она не нужна совсем.

Просто когда я пробовал поставить два обработчика на один пин (один на RISE другой на FALL), у меня работал только один. Может я просто не понял что то сходу. Еще раз проверю. Так что набрасывать код не стоит. Это я еще разок мелкий пример попробую набросать и если не получится, тут покажу.

PS: Это вообще мой первый опыт с ардуиной (да и вообще с микроконтролерами).

Вернуться в «Компьютерный форум»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей