arduino & i2c - danila i need help

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

№ 60 Сообщение ХЗ » 19 янв 2014 23:21

58: Пин:
> Алгоритм такой: ловим фронт - запускаем счетчик, ловим спад читаем значение счетчика - получаем длительность "положительного" импульса

В общем два прерывания нельзя приаттачить. Приходится вешать прерывание на CHANGE, и внутри прерывания делать digitalRead для проверки что именно мы поймали фронт или спад. Может какой другой метод есть, проверить внутри прерывания RISING это был или FALLING ?

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

№ 61 Сообщение ХЗ » 20 янв 2014 00:52

В общем не вариант.
digitalRead убрал, с ней вообще жопа, очень тяжелая функция. Просто битик проверяю в PIND, но все равно на 31 kHz на краях не работает (ну когда импульс очень длинный или очень короткий). Видимо пока по фронту прерывание срабатывает (проверяет бит в PIND, считывает время micros(), запоминает время), спад уже проходит и прерывание по нему не вызывается. Можно конечно попробовать заменить на что нить micros, но пока не нашел аналога rdtsc в ардуине.
Сейчас же я использую статистический метод определения скважности, на 31 килогерц с очень хорошей точностью отрабатывает за 800 микросекунд (блокирующее измерение, но это меня устраивает).

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

№ 62 Сообщение MadBiker » 20 янв 2014 10:29

61: X3: А если сигнальчик на второй вход через инвертор подать? Есть там куда микросхемку впаять?

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

№ 63 Сообщение ХЗ » 20 янв 2014 10:57

62: MadBiker:
Это пройденный этап. Только инвертировать сигнал смысла нет. Все равно на больших частотах на краевых значениях не успевает.

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

№ 64 Сообщение MadBiker » 20 янв 2014 11:14

63: X3: Вот поэтому 8051 с ассемблером и лучше. Уж сколько раз твердили миру.

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

№ 65 Сообщение ХЗ » 20 янв 2014 11:17

64: MadBiker:
> 8051

Встроенное ОЗУ — 128 байт (Памяти данных)
Встроенное ПЗУ — 4 КБ (Памяти программ)
Четыре порта ввода-вывода: один двунаправленный и три квазидвунаправленных
Два 16-битных таймера

Не, спасибо. Atmega 328 думаю не хуже ни разу. Ее типа тоже на асме можно программировать.

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

№ 66 Сообщение MadBiker » 20 янв 2014 11:20

65: X3: Это ты базу смотрел, их там в семействе более 100 разновидностей. На самом деле, меня просто напрягли 800 микросекунд, в мире микроконтроллеров это дохуа.

http://www.efo.ru/doc/Silabs/Silabs.pl?1165#table_mik
Последний раз редактировалось MadBiker 20 янв 2014 11:27, всего редактировалось 1 раз.

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

№ 67 Сообщение ХЗ » 20 янв 2014 11:24

66: MadBiker:
> базу смотрел, их там в семействе более 100 разновидностей. На самом деле, меня просто напрягли 800 микросекунд

Время зависит от желаемой точности. Можно и за 80. Статистика же. Но там по частоте получается что 30 микросекунд импульс. Ну на 30 импульсах я статистику набрал.

Да и не не надо сравнивать ардуину и другой контролер с программированием на асме. Ну согласись что это некорректно и ты просто в лужу пернул.

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

№ 68 Сообщение MadBiker » 20 янв 2014 11:34

67: X3:
> Да и не не надо сравнивать ардуину и другой контролер с программированием на асме.

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

>Ну согласись что это некорректно и ты просто в лужу пернул.

Как тебе будет угодно. Я теперь вот понимаю, почему у всех автопроизводителей такая беда с софтом в авто. :D

Размер кода какой получился?

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

№ 69 Сообщение MadBiker » 20 янв 2014 11:39

67: X3:
> Можно и за 80. Статистика же. Но там по частоте получается что 30 микросекунд импульс.

Кстати, тебя не смущает, что с временем реакции 800 мкс ты намерял 30 мкс? :shuffle:

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

№ 70 Сообщение ХЗ » 20 янв 2014 11:58

68: MadBiker:
> С точки зрения полученного временного лага - можно сравнивать, пытаясь понять, откуда такое огромадное число появилось.

Я уже объяснил откуда. Из замера статистики на примерно 30 тактах PWM на частоте 30 kHz.

68: MadBiker:
> Размер кода какой получился?

Ты размер кода написанного в ардуиновой среде хочешь сравнить с размером кода написанном на асме для другого контролера ? Думаю это бессмысленно. Но места в чипе еще на несколько таких кодов хватит.

68: MadBiker:
> Я теперь вот понимаю, почему у всех автопроизводителей такая беда с софтом в авто
Не думаю что в авто пишут софт в ардуиновом окружении с ардуиновыми библиотеками.

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

№ 71 Сообщение ХЗ » 20 янв 2014 12:00

69: MadBiker:
> Кстати, тебя не смущает, что с временем реакции 800 мкс ты намерял 30 мкс?

Блин... в течении примерно 30 импульсов шел замер. Не ? Умножить не судьба ?
Да, меня не смущает. Так как в тестовом варианте я PWM сам задаю с другой ноги и знаю его точное значение, все сходится.

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

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

71: X3:
> Так как в тестовом варианте я PWM сам задаю с другой ноги и знаю его точное значение, все сходится.

С этого можно было и начать 8-)

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

№ 73 Сообщение MadBiker » 20 янв 2014 15:17

71: X3:
> 20-30 kH

Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ. :roll:

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

№ 74 Сообщение ХЗ » 20 янв 2014 15:35

73: MadBiker:
> Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.

Хм. А чем расстроил то ?

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

№ 75 Сообщение ХЗ » 20 янв 2014 15:37

72: MadBiker:
> С этого можно было и начать

А зачем с этого начинать ? Я же сразу сказал, что реализация рабочая есть.

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

№ 76 Сообщение MadBiker » 20 янв 2014 15:40

74: X3:
> Хм. А чем расстроил то ?

Ну не расстроил, так и хорошо.

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

№ 77 Сообщение Пин » 20 янв 2014 17:44

Если это твой первый проект на мк, то мой тебе совет, не забивай себе голову всякими ардуиновыми библиотеками. Для новичка самое то это CodeVision for AVR. Там отличный генератор начального кода. К тому же правильного кода на уровне программирования регистров контроллера.
Фокус с двумя прерываниями у тебя не прокатывает по видимому из за каких то гигантских софтовых задержек. Какой там у тебя кварц напаян на плате, мегагерц на 10-16? 800 мкс для такого кварца это дохера. Я не помню точно, но время реакции на прерывание находится в диапазоне нескольких тактов, пусть даже 10 тактов, если вдруг контроллер спит и нужно время выхода из спящего режима. Получаем всего то 1 мкс (для 10МГц).

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

№ 78 Сообщение Пин » 20 янв 2014 17:47

73: MadBiker пишет:
> 71: X3:
>> 20-30 kH
>
> Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ. :roll:

Таки если частота постоянная, а меняется скважность, читай ширина импульса, это есть ШИМ.

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

№ 79 Сообщение ХЗ » 20 янв 2014 18:16

78: Пин:
Кварц 16.
800 микросекунд, это когда я просто в цикле делаю замер, без прерываний.
Два прерывания не срабатывают даже на маленькой частоте, с простым инкрементом целого в обработчике. Работает тот обработчик, который был поставлен последним.

Частота постоянная, но заранее не известная. Так что кроме ширины импульса все равно надо частоту иметь или длительность нуля :)

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

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

№ 80 Сообщение Пойманый_маньяк » 21 янв 2014 22:40

Ну скважность конечно нужно. :)
Частота конечно будет постоянная...
Тут судя по условиям - Широтно Импульсная Модуляция. Частота постоянна, измеряется изменение скважности (ширины импульсов).
Изображение

Частотная Модуляция наоборот. Скважность постоянна, измеряется изменение частоты.
Изображение

Любопытно, а в Atmege нельзя через глобальную переменную типа "хренов флаг" это все реализовать?
При инициализации один раз ее присвоить в соответствии с состоянием дискретного входа.
И дальше в обработчике прерываний (вызываемом по обоим фронтам) ее каждый раз просто инвертировать.
Что-то в таком духе:

Interrupt
{
HrenovFlag := NOT(HrenovFlag);
IF (HrenovFlag = 0)
THEN Pause := Counter;
ELSE
{
Pulse := Counter;
DutyCycle := (Pulse + Pause) / Pulse;
}
ResetCounter;
}


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

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

№ 81 Сообщение ХЗ » 21 янв 2014 23:28

80: Пойманый_маньяк:
> А может и медленнее из-за лишнего арифметического действия.
> Хотя опаснее в плане пропуска фронта.
Нет обработки крайних состояний :) А это еще код в прерывании. А чем там больше кода, тем больше вероятность пропустить фронт на коротком импульсе или спад на длинном, а в этому случае все сразу уплывает :)

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

№ 82 Сообщение ХЗ » 29 янв 2014 00:21

наткнулся на ровно такую же проблему
http://roboforum.ru/forum11/topic13761.html

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

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

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