Вопросы алгоритмов
Как мне провернуть в МК такой расчёт: зная частоту с которой должен переполнятся таймер и частоту ядра вычислить количество тиков таймера(предделитель потом подберу). Т.е. как лудше всего вычислить это внутри МК? Там с тробными числами не так всё хорошо, а мне по алгоритму нужно будет работать с периодом одного такта ядра, а это примерно 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!!!
- Реклама
Так что, идей нет? Может сделать всё по другому?
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
возможно, что я не так понимаю Ваш вопрос, но самое простое - воспользоваться Симулятором.
Протеус
AVR Simulator http://www.oshonsoft.com/avr.html
запускаете вашу программу в нем, выбираете частоту вашего МК и смотрите...
Протеус
AVR Simulator http://www.oshonsoft.com/avr.html
запускаете вашу программу в нем, выбираете частоту вашего МК и смотрите...
Не, МК должен сам считать, что занести в регистр сравнения чтобы частота перепонения таймера была требуемой.
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Домножать обязательно, возможно использовать умножение вместо деления на константу (если Вам будет интересно как, то потом я дам ссылки). Однако операции с большими числами занимают много программной памяти (да и не очень быстрые), скажите хотя-бы какой контроллер у вас.Negor писал(а):Как мне провернуть в МК такой расчёт...
- Реклама
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!!!
вариант использования BCD не предлагать
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
По поводу ссылок - есть такая книга: Уоррен - Алгоритмические трюки для программистов (может быть стоит искать и с вариантом "програмистов"), в торрентах точно есть, может еще где на просторе интернетов найдете, если не найдете, то могу на почту выслать (28 МБ).Negor писал(а):ATMega8. Ссылки интересны...
Лучше в формулах поставить скобки, явно обозначив порядок действий, например (1/заданная_частота)/(период_одного_такта_МК) либо 1/(заданная_частота/период_одного_такта_МК). Меня терзают смутные сомненья - хочешь задавать период с кнопок? Не проще ли будет тогда посчитать (при выборе тактовой частоты контроллера) время одного тика таймера, допустим в наносекундах и далее все расчеты вести "дважды" - для индикации завести одну переменную и прибавлять числа кратные времени тика, а для установки таймера просто инкрементировать другую переменную. Переменные объединить в структуру. Просто дело в том, что операции сложения на АВР выполняются гораздо легче чем деления, поэтому таким макаром может быть будет быстрее, и даже есть шанс, что короче.
По поводу алгоритма - пока красивого решения предложить не могу.
Ну как вариант, конечно не сильно оптимально, но работать будет.
Допустим имеем число 1234, нужно прибавить 10. берем число и делим его на 10, получаем 123, далее, от полученного результата получаем остаток от деления на 10, получаем 3. Если результат меньше 9, значит прибавляем к числу 10, если нет, вычитаем 90.
Допустим имеем число 1234, нужно прибавить 10. берем число и делим его на 10, получаем 123, далее, от полученного результата получаем остаток от деления на 10, получаем 3. Если результат меньше 9, значит прибавляем к числу 10, если нет, вычитаем 90.
когда я делал свой проект "таймер - меньше не бывает", я столкнулся с необходимостью подобных действий, однако решение "в лоб" не прокатило. т.к. шибко много памяти потребовало. пришлось извратиться и сделать символьные расчеты. примерно так:
если такие действия нужны для вывода на индикатор, то код получается гораздо компктнее, чем всякие умножения-деления и сравнения чисел с последующими преобразованиями для индикации....
Код: Выделить всё
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]);
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Не, символьно не пойдёт. Вот на такую хитрую штуку натолкнули меня на одном форуме
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!!!


