roboforum.ru

Технический форум по робототехнике.
Текущее время: 03 дек 2024, 17:44

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 23 июл 2011, 00:24 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
HarryStar писал(а):
я все честно промерил осциллографом

Я верю, но пару микросекунд на фронтах можно и не заметить, а прерывание может успеть защелкнуться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 23 июл 2011, 10:21 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 995
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
В завершении темы видео отчет о законченном модуле forum10/topic10018-15.html#p213034


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 23 июл 2011, 11:20 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Очень пристойно! Только хоть убейте меня = так и не понял, в чем была проблема :-(((

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 24 июл 2011, 12:52 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 995
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Основная проблема была в расчитывании времени.
Пример:
Событие: старт имупульса. Запоминаем значение 2х байтового таймера. Например t1=65035.
Событие: стоп импульса. Опять запоминаем значение таймера. например t2=500.

Соответственно длина импульса = 500 - 65035 = 1000
Если таймер считает с частотой 2 Мгц, то чтобы получить результат в мкс нужно поделить это число на 2, т.е. результат 500 мкс.
Никаких проблем нет.

У меня же приведение значения таймера к мкс происходило сразу.
Событие: старт импульса: значение таймера 65035. Я тут же делил его на 2. t1=65035/2= 32517
Событие: стоп импульса: значение таймера 500. Я тут же делил его на 2. t2=250

Результат: длина импульса 250-32517 = 33268 мкс

Вот тут и ошибка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 24 июл 2011, 15:39 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
ого

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 25 июл 2011, 22:07 
Не в сети

Зарегистрирован: 14 окт 2009, 11:46
Сообщения: 160
Откуда: Самара
dccharacter писал(а):
Michael_K, я, конечно, преклоняюсь, но нифига не понял :-((((
...

;)

Michael_K писал(а):
...
2. Например операция t1 = channel[current_channel]; не атомарная.
...

Не совсем понял (точнее говоря, совсем не понял) смысл термина "атомарная" применительно к присваиванию элемента массива приёмнику. Криминал нашёл в том, что current_channel в main-е не получает никакого значения (до его использования), а функция SlaveInControl() непонятно откуда вызывается. Вероятно, из Init_Slave_i2c(), а уже внутри SlaveInControl() current_channel получает значение.

_________________
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 25 июл 2011, 22:23 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
GlassEagle писал(а):
Не совсем понял (точнее говоря, совсем не понял) смысл термина "атомарная" применительно к присваиванию элемента

Атомарный = неделимый, непрерывный. Эта операция присваивания - не является неделимой (хотя бы потому что переменная шестнадцатибитная, а проц восьмибитный). Это значит, что посередине этой операции может произойти прерывание.

К чему это приведет: допустим младший байт из переменной "A" скопирован в младший байт переменной "B".
В это время происходит прерывание, внутри которого переменная A изменяет значение. Потом операция присваивания продолжается и копирует старший байт переменной А в переменную B.

Только вот это уже байт от совсем другого числа. Результат непредсказуем.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 25 июл 2011, 22:38 
Не в сети

Зарегистрирован: 14 окт 2009, 11:46
Сообщения: 160
Откуда: Самара
Michael_K писал(а):
...допустим младший байт из переменной "A" скопирован в младший байт переменной "B". В это время происходит прерывание,...
Да-а-а, вот уж воистину "Век живи - век учись, а дураком помрёшь". :) Про несоответсвие разрядности переменных и системы я и забыл (последствия длительного увлечения прикладным программированием для случаев, когда прерываниями и не пахнет). Спасибо огромное!!!

_________________
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с быстродействием ATmega168
СообщениеДобавлено: 26 июл 2011, 01:00 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 995
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
GlassEagle писал(а):
Криминал нашёл в том, что current_channel в main-е не получает никакого значения (до его использования)

Не совсем. В компиляторе была установлена опция "обнулять все переменные вначале программы". Хотя это не совсем правильно, согласен.
GlassEagle писал(а):
SlaveInControl() непонятно откуда вызывается. Вероятно, из Init_Slave_i2c()

Нет, она вызывается из обработчика прерывания I2C в случае получения 1 байта от мастера.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO