Вопросы алгоритмов
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Вопросы алгоритмов
Как мне провернуть в МК такой расчёт: зная частоту с которой должен переполнятся таймер и частоту ядра вычислить количество тиков таймера(предделитель потом подберу). Т.е. как лудше всего вычислить это внутри МК? Там с тробными числами не так всё хорошо, а мне по алгоритму нужно будет работать с периодом одного такта ядра, а это примерно 1/8000000. Вобщем пишу в WinAVR.
Последний раз редактировалось Negor Пн июл 05, 2010 22:13:48, всего редактировалось 1 раз.
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Реклама
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Re: Расчёт количества тиков таймера...
Так что, идей нет? Может сделать всё по другому?
There is only 10 kind of people: those who understands binary code and those who dont!!!
-
aleksandr-zh
- Сверлит текстолит когтями
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
Re: Расчёт количества тиков таймера...
возможно, что я не так понимаю Ваш вопрос, но самое простое - воспользоваться Симулятором.
Протеус
AVR Simulator http://www.oshonsoft.com/avr.html
запускаете вашу программу в нем, выбираете частоту вашего МК и смотрите...
Протеус
AVR Simulator http://www.oshonsoft.com/avr.html
запускаете вашу программу в нем, выбираете частоту вашего МК и смотрите...
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Re: Расчёт количества тиков таймера...
Не, МК должен сам считать, что занести в регистр сравнения чтобы частота перепонения таймера была требуемой.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Re: Расчёт количества тиков таймера...
Домножать обязательно, возможно использовать умножение вместо деления на константу (если Вам будет интересно как, то потом я дам ссылки). Однако операции с большими числами занимают много программной памяти (да и не очень быстрые), скажите хотя-бы какой контроллер у вас.Negor писал(а):Как мне провернуть в МК такой расчёт...
- Реклама
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Re: Расчёт количества тиков таймера...
ATMega8. Ссылки интересны. Сделал через константы.
нужно было
1/заданная_частота/(период_одного_такта_МК)
сделал
1000000000/частота/период_одного_такта_МК*1000000000
всё отлично. Теперь другой вопрос алгоритмизации
Вопрос
(абстрактно)есть некая переменная и 4 события. При наступлении первого события нужно увеличить переменную на 1, второго - на 10 и т.д. до 1000. Но, важно условие - не должно быть переполнения, т.е. если, например, переменная равная 19, то при добавлении 1 она должна быть равной 10 а не 20. или, если 291, то при добавлении 10 - 201. Как это красиво провернуть?
нужно было
1/заданная_частота/(период_одного_такта_МК)
сделал
1000000000/частота/период_одного_такта_МК*1000000000
всё отлично. Теперь другой вопрос алгоритмизации
Вопрос
(абстрактно)есть некая переменная и 4 события. При наступлении первого события нужно увеличить переменную на 1, второго - на 10 и т.д. до 1000. Но, важно условие - не должно быть переполнения, т.е. если, например, переменная равная 19, то при добавлении 1 она должна быть равной 10 а не 20. или, если 291, то при добавлении 10 - 201. Как это красиво провернуть?
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Re: Вопросы алгоритмов
вариант использования BCD не предлагать
There is only 10 kind of people: those who understands binary code and those who dont!!!
Re: Расчёт количества тиков таймера...
По поводу ссылок - есть такая книга: Уоррен - Алгоритмические трюки для программистов (может быть стоит искать и с вариантом "програмистов"), в торрентах точно есть, может еще где на просторе интернетов найдете, если не найдете, то могу на почту выслать (28 МБ).Negor писал(а):ATMega8. Ссылки интересны...
Лучше в формулах поставить скобки, явно обозначив порядок действий, например (1/заданная_частота)/(период_одного_такта_МК) либо 1/(заданная_частота/период_одного_такта_МК). Меня терзают смутные сомненья - хочешь задавать период с кнопок? Не проще ли будет тогда посчитать (при выборе тактовой частоты контроллера) время одного тика таймера, допустим в наносекундах и далее все расчеты вести "дважды" - для индикации завести одну переменную и прибавлять числа кратные времени тика, а для установки таймера просто инкрементировать другую переменную. Переменные объединить в структуру. Просто дело в том, что операции сложения на АВР выполняются гораздо легче чем деления, поэтому таким макаром может быть будет быстрее, и даже есть шанс, что короче.
По поводу алгоритма - пока красивого решения предложить не могу.
Re: Вопросы алгоритмов
Ну как вариант, конечно не сильно оптимально, но работать будет.
Допустим имеем число 1234, нужно прибавить 10. берем число и делим его на 10, получаем 123, далее, от полученного результата получаем остаток от деления на 10, получаем 3. Если результат меньше 9, значит прибавляем к числу 10, если нет, вычитаем 90.
Допустим имеем число 1234, нужно прибавить 10. берем число и делим его на 10, получаем 123, далее, от полученного результата получаем остаток от деления на 10, получаем 3. Если результат меньше 9, значит прибавляем к числу 10, если нет, вычитаем 90.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы алгоритмов
когда я делал свой проект "таймер - меньше не бывает", я столкнулся с необходимостью подобных действий, однако решение "в лоб" не прокатило. т.к. шибко много памяти потребовало. пришлось извратиться и сделать символьные расчеты. примерно так:
если такие действия нужны для вывода на индикатор, то код получается гораздо компктнее, чем всякие умножения-деления и сравнения чисел с последующими преобразованиями для индикации....
Код: Выделить всё
char chislo[6] = "000001"; // 6-разрядное число в СИМВОЛЬНОМ виде
static char increment(uint8_t symb){ // инкремент одного разряда символьного числа
if(++symb > '9') symb = '0';
return symb;
}
void event(uint8_t ev){ // обработка 6 событий для инкремента разряда числа
if(ev < 6)
chislo[ev] = increment(chislo[ev]);
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Re: Вопросы алгоритмов
Не, символьно не пойдёт. Вот на такую хитрую штуку натолкнули меня на одном форуме
a - число, над которым будем издеватся. delta - приращение со знаком.
Код: Выделить всё
int incdec(int a, int delta)
{
int b=a;
b+=delta>0?(a/delta%10==9?-delta*9:delta):(a/delta%10==0?-delta*9:delta);
return b;
}There is only 10 kind of people: those who understands binary code and those who dont!!!


