реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Временные интервалы
Andruxa-1
сообщение Jun 21 2010, 08:55
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Я задействовал таймер1, прерывание по переполнению. Таймер служит для подсчета тиков ну и вычисления системного времени. Внешний кварц на 20 Мгц. Можно ли оптимизировать вычисления.
CODE
#include <avr\io.h>
#include <avr\interrupt.h>

uint32_t ulSystemTime = 0;
uint32_t ulTmp;

void SistemTimerInit(){
TCCR1A = 0;
TIMSK |= (1<<TOIE1);
TCCR1B |= (1<<CS10);
}

uint32_t GetSystemTimeMS(){
cli();

ulTmp = (ulSystemTime<<16) + TCNT1;

sei();

return (ulTmp);
}

SIGNAL(SIG_OVERFLOW1)
{
cli();

ulSystemTime++;

sei();
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2010, 09:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



По какому критерию Вы бы хотели провести оптимизацию? Можно предложить:
CODE
#include <avr\io.h>
#include <avr\interrupt.h>

uint16_t uSystemTime = 0;

void SistemTimerInit(){
TCCR1A = 0;
TIMSK |= (1<<TOIE1);
TCCR1B |= (1<<CS10);
}

uint32_t GetSystemTimeMS(){
uint32_t ulTmp;
cli();
ulTmp = ((uint32_t)uSystemTime<<16) + TCNT1;
sei();
return (ulTmp);
}

SIGNAL(SIG_OVERFLOW1)
{
cli();
uSystemTime++;
sei();
}


Ещё: в процедуре обработки прерывания команды запрета/разрешения прерываний - излишни - они и так запрещены.
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 21 2010, 10:22
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



этот кусок занимает 22 команды в дизасме ulTmp = ((uint32_t)uSystemTime<<16) + TCNT1;
Поскольку uSystemTime и ulTmp это 4-ч байтовые, думаю можно оптимизировать вычисление, только, честно говря, я не знаю как sad.gif

Я формирую ШИМ с высокой длительностью 1 млс и низкий 10 млс, на фронтах погрешность в 31 мкс. Вот как я формирую ШИМ:
CODE

for(unsigned char i = 0; i < MAX_CHANEL; i++)
{
if(endis & (1<<i)) //Канал вкл/Выкл?
{
tt = GetSystemTimeMS() - ms[i];

if(curate & (1<<i)) //Текущий уровень высокий
{
if(tt > tTiming[1][i])
{
PORTC |= (1<<i);
curate &= ~(1<<i);
ms[i] = GetSystemTimeMS();
}
}

if((curate & (1<<i)) == 0)
{
if(tt > tTiming[0][i])
{
PORTC &= ~(1<<i);
curate |= (1<<i);
ms[i] = GetSystemTimeMS();
}
}
}//if(endis & (1<<i))
}//for(unsigned char i = 0; i < MAX_CHANEL; i++)


Сообщение отредактировал Andruxa-1 - Jun 21 2010, 10:26
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 21 2010, 10:28
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Andruxa-1 @ Jun 21 2010, 14:22) *
Я формирую ШИМ с высокой длительностью 1 млс и низкий 10 млс, на фронтах погрешность в 31 мкс.

"Погрешность" - это джиттер чтоли? Или постоянная величина?
А что мешает задействовать аппаратный ШИМ?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 21 2010, 10:32
Сообщение #5





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Цитата(MrYuran @ Jun 21 2010, 13:28) *
"Погрешность" - это джиттер чтоли? Или постоянная величина?

Да, джиттер.
Цитата(MrYuran @ Jun 21 2010, 13:28) *
А что мешает задействовать аппаратный ШИМ?

Мне нужно генерировать ШИМ от 0,1 Гц до 2 кГц. И еще на 8 каналов.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2010, 10:52
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Andruxa-1 @ Jun 21 2010, 14:22) *
думаю можно оптимизировать вычисление, только, честно говря, я не знаю как sad.gif

Сделать ассемблерную вставку или написать GetSystemTimeMS на ассемблере. Процедура возвращает результат на регистрах. Фактически всё, что надо сделать в этой процедуре - положить uSystemTime на регистры (старшие байты - посмотреть в документации - на какие?) и считать в нужные регистры TCNT1 (два младших байта). Плюс команды cli и sei, да ещё команда возврата... Процедуру, короче описанной здесь - не придумать.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 21 2010, 10:55
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Andruxa-1 @ Jun 21 2010, 14:32) *
Да, джиттер.
Мне нужно генерировать ШИМ от 0,1 Гц до 2 кГц. И еще на 8 каналов.

При такой организации процесса ничего не поделаешь.
Непредсказуемая задержка возникает, когда в одном или нескольких n-1 предыдущих каналов происходит переключение уровня.
Надо как-то симметрировать алгоритм.
То есть, задержка процедуры обработки одного канала должна быть одинаковой, независимо от внешних условий и ветки алгоритма, по которой в данный момент пошла программа.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2010, 11:07
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Andruxa-1 @ Jun 21 2010, 14:22) *
Поскольку uSystemTime и ulTmp это 4-ч байтовые...
Отводить четыре байта под uSystemTime - излишество. Достаточно выделить два - всё равно значение сдвигается влево на 16 разрядов...


Цитата(MrYuran @ Jun 21 2010, 14:55) *
Надо как-то симметрировать алгоритм.
Автор вопроса не огласил всех требований - возможно и это не поможет...

P.S. Может быть, подход к решению задачи - в корне неверный. Огласите исходнуя задачу: что генерить, с какими временами и точностью, как задаются времена (период/длительность)...
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 21 2010, 11:41
Сообщение #9





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Многоканальный генератор электрических импульсов переменной частоты и скважности на восемь каналов.
Микроконтроллер ATMega8 с внешним кварцем 20Мгц, имеющая восемь выходов на которые и
генерируется частота. Генерация импульсов в диапазоне частот: 0.1 Гц - 2 Кгц. Управление частотой и
скважностью производится посредством установки длительности высокого, и низкого уровней. Уровни задаются квантами времени.
Погрешность не более 1%.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 21 2010, 11:47
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Andruxa-1 @ Jun 21 2010, 15:41) *
Генерация импульсов в диапазоне частот: 0.1 Гц - 2 Кгц.
Погрешность не более 1%.

Посчитаем...
2кГц->500мкс, х1% = 5мкс.
Нереально в принципе при софтовой реализации.
Либо загрубляем требования, либо реализуем аппаратно.
Например, внешней ЦПЛД-шкой


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 21 2010, 12:00
Сообщение #11





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Цитата(MrYuran @ Jun 21 2010, 14:47) *
Посчитаем...
2кГц->500мкс, х1% = 5мкс.
Нереально в принципе при софтовой реализации.


Аппаратно, на 8 каналов, можно реализовать на этом камне? Подскажите куда копать.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 21 2010, 12:19
Сообщение #12


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Andruxa-1 @ Jun 21 2010, 16:00) *
Аппаратно, на 8 каналов, можно реализовать на этом камне? Подскажите куда копать.

На каком именно?
На АВР по-моему, вообще туговато с железными ШИМами.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 21 2010, 12:36
Сообщение #13





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



ATMega8
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2010, 12:51
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Andruxa-1 @ Jun 21 2010, 16:36) *
ATMega8
В AVR не более 2-3 аппаратных ШИМ. Восемь независимых ни на каком AVR c требуемыми Вам параметрами получить не удастся...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 21 2010, 15:23
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Палыч @ Jun 21 2010, 16:51) *
Восемь независимых ни на каком AVR c требуемыми Вам параметрами получить не удастся...

А вот на MSP430 - запросто!
Всё, молчу, молчу...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016