arduino & i2c - danila i need help
58: Пин:
> Алгоритм такой: ловим фронт - запускаем счетчик, ловим спад читаем значение счетчика - получаем длительность "положительного" импульса
В общем два прерывания нельзя приаттачить. Приходится вешать прерывание на CHANGE, и внутри прерывания делать digitalRead для проверки что именно мы поймали фронт или спад. Может какой другой метод есть, проверить внутри прерывания RISING это был или FALLING ?
> Алгоритм такой: ловим фронт - запускаем счетчик, ловим спад читаем значение счетчика - получаем длительность "положительного" импульса
В общем два прерывания нельзя приаттачить. Приходится вешать прерывание на CHANGE, и внутри прерывания делать digitalRead для проверки что именно мы поймали фронт или спад. Может какой другой метод есть, проверить внутри прерывания RISING это был или FALLING ?
В общем не вариант.
digitalRead убрал, с ней вообще жопа, очень тяжелая функция. Просто битик проверяю в PIND, но все равно на 31 kHz на краях не работает (ну когда импульс очень длинный или очень короткий). Видимо пока по фронту прерывание срабатывает (проверяет бит в PIND, считывает время micros(), запоминает время), спад уже проходит и прерывание по нему не вызывается. Можно конечно попробовать заменить на что нить micros, но пока не нашел аналога rdtsc в ардуине.
Сейчас же я использую статистический метод определения скважности, на 31 килогерц с очень хорошей точностью отрабатывает за 800 микросекунд (блокирующее измерение, но это меня устраивает).
digitalRead убрал, с ней вообще жопа, очень тяжелая функция. Просто битик проверяю в PIND, но все равно на 31 kHz на краях не работает (ну когда импульс очень длинный или очень короткий). Видимо пока по фронту прерывание срабатывает (проверяет бит в PIND, считывает время micros(), запоминает время), спад уже проходит и прерывание по нему не вызывается. Можно конечно попробовать заменить на что нить micros, но пока не нашел аналога rdtsc в ардуине.
Сейчас же я использую статистический метод определения скважности, на 31 килогерц с очень хорошей точностью отрабатывает за 800 микросекунд (блокирующее измерение, но это меня устраивает).
61: X3: А если сигнальчик на второй вход через инвертор подать? Есть там куда микросхемку впаять?
62: MadBiker:
Это пройденный этап. Только инвертировать сигнал смысла нет. Все равно на больших частотах на краевых значениях не успевает.
Это пройденный этап. Только инвертировать сигнал смысла нет. Все равно на больших частотах на краевых значениях не успевает.
63: X3: Вот поэтому 8051 с ассемблером и лучше. Уж сколько раз твердили миру.
64: MadBiker:
> 8051
Встроенное ОЗУ — 128 байт (Памяти данных)
Встроенное ПЗУ — 4 КБ (Памяти программ)
Четыре порта ввода-вывода: один двунаправленный и три квазидвунаправленных
Два 16-битных таймера
Не, спасибо. Atmega 328 думаю не хуже ни разу. Ее типа тоже на асме можно программировать.
> 8051
Встроенное ОЗУ — 128 байт (Памяти данных)
Встроенное ПЗУ — 4 КБ (Памяти программ)
Четыре порта ввода-вывода: один двунаправленный и три квазидвунаправленных
Два 16-битных таймера
Не, спасибо. Atmega 328 думаю не хуже ни разу. Ее типа тоже на асме можно программировать.
65: X3: Это ты базу смотрел, их там в семействе более 100 разновидностей. На самом деле, меня просто напрягли 800 микросекунд, в мире микроконтроллеров это дохуа.
http://www.efo.ru/doc/Silabs/Silabs.pl?1165#table_mik
http://www.efo.ru/doc/Silabs/Silabs.pl?1165#table_mik
Последний раз редактировалось MadBiker 20 янв 2014 11:27, всего редактировалось 1 раз.
66: MadBiker:
> базу смотрел, их там в семействе более 100 разновидностей. На самом деле, меня просто напрягли 800 микросекунд
Время зависит от желаемой точности. Можно и за 80. Статистика же. Но там по частоте получается что 30 микросекунд импульс. Ну на 30 импульсах я статистику набрал.
Да и не не надо сравнивать ардуину и другой контролер с программированием на асме. Ну согласись что это некорректно и ты просто в лужу пернул.
> базу смотрел, их там в семействе более 100 разновидностей. На самом деле, меня просто напрягли 800 микросекунд
Время зависит от желаемой точности. Можно и за 80. Статистика же. Но там по частоте получается что 30 микросекунд импульс. Ну на 30 импульсах я статистику набрал.
Да и не не надо сравнивать ардуину и другой контролер с программированием на асме. Ну согласись что это некорректно и ты просто в лужу пернул.
67: X3:
> Да и не не надо сравнивать ардуину и другой контролер с программированием на асме.
С точки зрения полученного временного лага - можно сравнивать, пытаясь понять, откуда такое огромадное число появилось.
>Ну согласись что это некорректно и ты просто в лужу пернул.
Как тебе будет угодно. Я теперь вот понимаю, почему у всех автопроизводителей такая беда с софтом в авто.
Размер кода какой получился?
> Да и не не надо сравнивать ардуину и другой контролер с программированием на асме.
С точки зрения полученного временного лага - можно сравнивать, пытаясь понять, откуда такое огромадное число появилось.
>Ну согласись что это некорректно и ты просто в лужу пернул.
Как тебе будет угодно. Я теперь вот понимаю, почему у всех автопроизводителей такая беда с софтом в авто.
Размер кода какой получился?
67: X3:
> Можно и за 80. Статистика же. Но там по частоте получается что 30 микросекунд импульс.
Кстати, тебя не смущает, что с временем реакции 800 мкс ты намерял 30 мкс?
> Можно и за 80. Статистика же. Но там по частоте получается что 30 микросекунд импульс.
Кстати, тебя не смущает, что с временем реакции 800 мкс ты намерял 30 мкс?
68: MadBiker:
> С точки зрения полученного временного лага - можно сравнивать, пытаясь понять, откуда такое огромадное число появилось.
Я уже объяснил откуда. Из замера статистики на примерно 30 тактах PWM на частоте 30 kHz.
68: MadBiker:
> Размер кода какой получился?
Ты размер кода написанного в ардуиновой среде хочешь сравнить с размером кода написанном на асме для другого контролера ? Думаю это бессмысленно. Но места в чипе еще на несколько таких кодов хватит.
68: MadBiker:
> Я теперь вот понимаю, почему у всех автопроизводителей такая беда с софтом в авто
Не думаю что в авто пишут софт в ардуиновом окружении с ардуиновыми библиотеками.
> С точки зрения полученного временного лага - можно сравнивать, пытаясь понять, откуда такое огромадное число появилось.
Я уже объяснил откуда. Из замера статистики на примерно 30 тактах PWM на частоте 30 kHz.
68: MadBiker:
> Размер кода какой получился?
Ты размер кода написанного в ардуиновой среде хочешь сравнить с размером кода написанном на асме для другого контролера ? Думаю это бессмысленно. Но места в чипе еще на несколько таких кодов хватит.
68: MadBiker:
> Я теперь вот понимаю, почему у всех автопроизводителей такая беда с софтом в авто
Не думаю что в авто пишут софт в ардуиновом окружении с ардуиновыми библиотеками.
69: MadBiker:
> Кстати, тебя не смущает, что с временем реакции 800 мкс ты намерял 30 мкс?
Блин... в течении примерно 30 импульсов шел замер. Не ? Умножить не судьба ?
Да, меня не смущает. Так как в тестовом варианте я PWM сам задаю с другой ноги и знаю его точное значение, все сходится.
> Кстати, тебя не смущает, что с временем реакции 800 мкс ты намерял 30 мкс?
Блин... в течении примерно 30 импульсов шел замер. Не ? Умножить не судьба ?
Да, меня не смущает. Так как в тестовом варианте я PWM сам задаю с другой ноги и знаю его точное значение, все сходится.
71: X3:
> Так как в тестовом варианте я PWM сам задаю с другой ноги и знаю его точное значение, все сходится.
С этого можно было и начать
> Так как в тестовом варианте я PWM сам задаю с другой ноги и знаю его точное значение, все сходится.
С этого можно было и начать
71: X3:
> 20-30 kH
Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.
> 20-30 kH
Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.
73: MadBiker:
> Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.
Хм. А чем расстроил то ?
> Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.
Хм. А чем расстроил то ?
72: MadBiker:
> С этого можно было и начать
А зачем с этого начинать ? Я же сразу сказал, что реализация рабочая есть.
> С этого можно было и начать
А зачем с этого начинать ? Я же сразу сказал, что реализация рабочая есть.
74: X3:
> Хм. А чем расстроил то ?
Ну не расстроил, так и хорошо.
> Хм. А чем расстроил то ?
Ну не расстроил, так и хорошо.
-
Пин
Если это твой первый проект на мк, то мой тебе совет, не забивай себе голову всякими ардуиновыми библиотеками. Для новичка самое то это CodeVision for AVR. Там отличный генератор начального кода. К тому же правильного кода на уровне программирования регистров контроллера.
Фокус с двумя прерываниями у тебя не прокатывает по видимому из за каких то гигантских софтовых задержек. Какой там у тебя кварц напаян на плате, мегагерц на 10-16? 800 мкс для такого кварца это дохера. Я не помню точно, но время реакции на прерывание находится в диапазоне нескольких тактов, пусть даже 10 тактов, если вдруг контроллер спит и нужно время выхода из спящего режима. Получаем всего то 1 мкс (для 10МГц).
Фокус с двумя прерываниями у тебя не прокатывает по видимому из за каких то гигантских софтовых задержек. Какой там у тебя кварц напаян на плате, мегагерц на 10-16? 800 мкс для такого кварца это дохера. Я не помню точно, но время реакции на прерывание находится в диапазоне нескольких тактов, пусть даже 10 тактов, если вдруг контроллер спит и нужно время выхода из спящего режима. Получаем всего то 1 мкс (для 10МГц).
-
Пин
73: MadBiker пишет:
> 71: X3:
>> 20-30 kH
>
> Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.
Таки если частота постоянная, а меняется скважность, читай ширина импульса, это есть ШИМ.
> 71: X3:
>> 20-30 kH
>
> Я тебя расстрою, кстати, спецы говорят, что у тебя в задаче ответка не ШИМ, а ЧМ.
Таки если частота постоянная, а меняется скважность, читай ширина импульса, это есть ШИМ.
78: Пин:
Кварц 16.
800 микросекунд, это когда я просто в цикле делаю замер, без прерываний.
Два прерывания не срабатывают даже на маленькой частоте, с простым инкрементом целого в обработчике. Работает тот обработчик, который был поставлен последним.
Частота постоянная, но заранее не известная. Так что кроме ширины импульса все равно надо частоту иметь или длительность нуля
В принципе работает вариант, когда сигннал подается сразу на две ноги, на одной обработчик на фронт, на другой обработчик на спад. Но это мне кажется корявым решением.
Кварц 16.
800 микросекунд, это когда я просто в цикле делаю замер, без прерываний.
Два прерывания не срабатывают даже на маленькой частоте, с простым инкрементом целого в обработчике. Работает тот обработчик, который был поставлен последним.
Частота постоянная, но заранее не известная. Так что кроме ширины импульса все равно надо частоту иметь или длительность нуля
В принципе работает вариант, когда сигннал подается сразу на две ноги, на одной обработчик на фронт, на другой обработчик на спад. Но это мне кажется корявым решением.
Тут судя по условиям - Широтно Импульсная Модуляция. Частота постоянна, измеряется изменение скважности (ширины импульсов).Ну скважность конечно нужно.
Частота конечно будет постоянная...
Частотная Модуляция наоборот. Скважность постоянна, измеряется изменение частоты.

Любопытно, а в Atmege нельзя через глобальную переменную типа "хренов флаг" это все реализовать?
При инициализации один раз ее присвоить в соответствии с состоянием дискретного входа.
И дальше в обработчике прерываний (вызываемом по обоим фронтам) ее каждый раз просто инвертировать.
Что-то в таком духе:
Interrupt
{
HrenovFlag := NOT(HrenovFlag);
IF (HrenovFlag = 0)
THEN Pause := Counter;
ELSE
{
Pulse := Counter;
DutyCycle := (Pulse + Pause) / Pulse;
}
ResetCounter;
}
Не исключено, что это будет быстрее, чем каждый раз читать вход.
А может и медленнее из-за лишнего арифметического действия.
Хотя опаснее в плане пропуска фронта.
Но раз всё успевает, по идее проблем быть не должно.
Короче хрен его знает...
Праздное любопытство
80: Пойманый_маньяк:
> А может и медленнее из-за лишнего арифметического действия.
> Хотя опаснее в плане пропуска фронта.
Нет обработки крайних состояний
А это еще код в прерывании. А чем там больше кода, тем больше вероятность пропустить фронт на коротком импульсе или спад на длинном, а в этому случае все сразу уплывает
> А может и медленнее из-за лишнего арифметического действия.
> Хотя опаснее в плане пропуска фронта.
Нет обработки крайних состояний
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей