Просьба оценить и осудить на сколько корректно написано часть кода . Коротко в двух словах чо делает программа , по нулевому таймеру меняет биты а по первому происходит прерывание и опрашивает кнопки
...
Int y=0;
...
Main
{
If (TCNT0 ==255)
{
Switch y
{Case1 : portc =| (1<<0);
Y++;
Breek;
Case2 : portc =| (1<<1);
Y++;
Breek;
Case3 : portc =| (1<<2);
Y++;
Breek;
Case4 : portc =| (1<<3);
Y=0;
Breek;
}
}
}
....
Извиняюсь за карявось написания текста пишу с телефона по памяти
Если по каким-то причинам не хочется использовать прерывание от таймера 0, то проверять лучше флаг переполнения с последующим сбросом, если установлен. А так можно и "проморгать" факт переполнения, если таймер тактируется на частотах близких к частоте ядра.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Добавлено after 10 minutes 35 seconds: Re: Оценить и осудить на сколько корректно написана часть кода
Z_h_e спасибо , у меня нулевой таймер меняет фазы шаговика
А TCNT == 255 я меняю скорость смены фаз, тоесть скорость шаговика. А прерывания у меня на первом таймере на опрос кнопок
Я пишу с телефона не особо удобно , да и по памяти, так что там много ошибок это да , но у меня отлаженный код он работает шаговик шагает кнопки жмутся , весь код не выкладывал очень сложно писать с мобилы написал только часть кода какая интересует , а интересует , насколько корректно использованы таймер счётчики , может есть способы более компактные или практичные , ?? Насколько грамотно ? Двумя словами .
Добавлено after 1 minute 42 seconds: Re: Оценить и осудить на сколько корректно написана часть кода
Первый таймер счётчик даже написал код там и так понятно всё прерывание по переполнению которое опрашивает кнопки
У разных таймеров разные вектора прерываний. Не вижу причин не использовать прерывание.
Z_h_e, я просто не волшебник только учусь , но будет ли оно корректно работать когда здвиг фаз шаговика будут меняться по прерыванию нулевого таймера и с прерываниям первого ?
Добавлено after 1 minute 23 seconds: Re: Оценить и осудить на сколько корректно написана часть кода
Нахожусь далеко от компа , да и в течение суток не буду рядом точно а есть только телефон и время которое не хочется проспать даром
Добавлено after 4 minutes 41 second: Re: Оценить и осудить на сколько корректно написана часть кода
Да и интересует уместно использовать switch место if фов если ли какие недостатки плюсы итд??
Оператор switch несомненно лучше if для такого применения.
Таймер 0 лучше использовать в режиме CTC , тогда будет считать не до верха, а до значения установленного в специальном регистре. И само собой использовать прерывание.
Для изменения скорости надо будет менять значение регистра сравнения. Не хочу в ДШ лезть, чтобы название его точно сказать. Какой-нибудь OCR0.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3738965#p3738965"]Таймер 0 лучше использовать в режиме CTC , тогда будет считать не до верха, а до значения установленного в специальном регистре. И само собой использовать прерывание.[/uquote]
имхо - в меге восьмой в нулевом таймере нет стс.
зы. хотя да - там микроконтроллер не указан...
ох уж эти котятки... в один тапокну тему писать ни как не получается...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Добавлено after 4 minutes 12 seconds: Re: Оценить и осудить на сколько корректно написана часть кода
Тогда есть смысл меня задачи для таймеров , если в нулевом нет режима ctc ? Я так понял влиять на шаговик два прерывания не будут ??? а то всё-таки проверка нажатий кнопок + антидребезг это время .
я както делал генератор с плавной перестройкой...
1) из скорости получал период (делением)
2) период загружал в переменную
3) пока переменная больше 512 таймер крутился с делителем 1 в режиме стс с регистром сравнения равным 0xFF,
с каждым оборотом переменная убавлялась на 256...
как только она становилась меньше 512, я её делил на 2 и загружал в регистр сравнения и 2 последних оборота таймер делал уже быстрее...
после этих оборотов выполнялось требуемое действие, в переменную снова загружался период и всё повторялось...
—————
так мне удалось получить генерацию в широких пределах и с точностью ±1 такт мк...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3739000#p3739000"]я както делал генератор с плавной перестройкой...[/uquote]
Не совсем догнал. Можно поподробнее? И пример. Код.
открыл проект, добавил комментариев...
принцип там тот-же, но алгоритм немного другой: чтобы не работать с длинными числами в прерываниях я сразу разделил период на 256 (получил число переполнений таймера - теперь надо не 256 отнимать от длинного числа, а 1 от более короткого) и взяв остаток от деления также заранее вычислил, насколько нужно укорачивать последние 2 оборота...
при тактовой частоте 2,4 МГц я получаю меандр от 0,1 Гц до 4,6 кГц
П.С. управление одной кнопкой...
простое удержание - снижение частоты
удержание после нажатия - увеличение частоты
3хкратное нажатие - сохранение текущей частоты в еепром
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...