Проблема с быстродействием ATmega168

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Проблема с быстродействием ATmega168

Сообщение Michael_K » 23 июл 2011, 00:24

HarryStar писал(а):я все честно промерил осциллографом

Я верю, но пару микросекунд на фронтах можно и не заметить, а прерывание может успеть защелкнуться.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Проблема с быстродействием ATmega168

Сообщение HarryStar » 23 июл 2011, 10:21

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

Re: Проблема с быстродействием ATmega168

Сообщение dccharacter » 23 июл 2011, 11:20

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

Re: Проблема с быстродействием ATmega168

Сообщение HarryStar » 24 июл 2011, 12:52

Основная проблема была в расчитывании времени.
Пример:
Событие: старт имупульса. Запоминаем значение 2х байтового таймера. Например t1=65035.
Событие: стоп импульса. Опять запоминаем значение таймера. например t2=500.

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

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

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

Вот тут и ошибка.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Проблема с быстродействием ATmega168

Сообщение dccharacter » 24 июл 2011, 15:39

ого
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Проблема с быстродействием ATmega168

Сообщение GlassEagle » 25 июл 2011, 22:07

dccharacter писал(а):Michael_K, я, конечно, преклоняюсь, но нифига не понял :-((((
...

;)

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

Не совсем понял (точнее говоря, совсем не понял) смысл термина "атомарная" применительно к присваиванию элемента массива приёмнику. Криминал нашёл в том, что current_channel в main-е не получает никакого значения (до его использования), а функция SlaveInControl() непонятно откуда вызывается. Вероятно, из Init_Slave_i2c(), а уже внутри SlaveInControl() current_channel получает значение.
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.
GlassEagle
 
Сообщения: 160
Зарегистрирован: 14 окт 2009, 11:46
Откуда: Самара

Re: Проблема с быстродействием ATmega168

Сообщение Michael_K » 25 июл 2011, 22:23

GlassEagle писал(а):Не совсем понял (точнее говоря, совсем не понял) смысл термина "атомарная" применительно к присваиванию элемента

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

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

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

Такие глюки достаточно легко не допускать на этапе проектирования, но страшно тяжело отлаживать.
Именно потому, что они могут проявляться раз в полгода.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Проблема с быстродействием ATmega168

Сообщение GlassEagle » 25 июл 2011, 22:38

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

Re: Проблема с быстродействием ATmega168

Сообщение HarryStar » 26 июл 2011, 01:00

GlassEagle писал(а):Криминал нашёл в том, что current_channel в main-е не получает никакого значения (до его использования)

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

Нет, она вызывается из обработчика прерывания I2C в случае получения 1 байта от мастера.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Пред.

Вернуться в Микроконтроллеры

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

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