roboforum.ru

Технический форум по робототехнике.

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

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

Michael_K » 23 июл 2011, 00:24

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

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

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

HarryStar » 23 июл 2011, 10:21

В завершении темы видео отчет о законченном модуле forum10/topic10018-15.html#p213034

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

dccharacter » 23 июл 2011, 11:20

Очень пристойно! Только хоть убейте меня = так и не понял, в чем была проблема :-(((

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 мкс

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

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

dccharacter » 24 июл 2011, 15:39

ого

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 получает значение.

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

Michael_K » 25 июл 2011, 22:23

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

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

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

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

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

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

GlassEagle » 25 июл 2011, 22:38

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

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

HarryStar » 26 июл 2011, 01:00

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

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

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


Rambler\'s Top100 Mail.ru counter