Форум myROBOT.ru » Лаборатория » Алгоритмы » Индикатор на двух светодиодах о повышенных/заниженных оборотах

Страниц (3): « 1 2 [3]
 

31. cjA - 23 Ноября, 2013 - 21:14:21 - перейти к сообщению
Нет, не раз в секунду, таймер тикает раз в тик (например раз в одну восьмимиллионную) плюс делить на предделитель (2, 4, 8, тд) плюс делить еще на одно число для которого специальный регистр, это чтоб точнее было. Этого числа для первого (timer0) так как оно однобайтовое не хватает даже для счетчика секунд (для частоты по умолчанию 8МГц) ...
Сейчас дочитаю, допишу еще
И вот когда все эти числа "сложаться"- возникнет прерывание.
(Добавление)
Alex_och пишет:
И 0,5 с - 2000 тиков, 2 с - 8000 тиков
Абсалютно правильно! И именно поэтому таймеры нам не нужны. Пишите свою программу, если в Си то читаете листинг. И считаете сколько у нас набегало за основной цикл. Это RISC процессор, почти все операнды выполняются за тик. Обращение к еепром или АДК- не известно, зависит от напряжения, поэтому им отведены прерывания, которые часто и не нужны.
Alex_och пишет:
Обнуление переменных перенес в описание таймера // ISR(TIMER0_OVF_vect) // из while.
Смотя какая задача стоит. Иногда нужно все в прерывание засунуть, иногда в вайл. Не уверен что это правильное решение. Обнуление должно быть там где у вас секунды отмеряются. (я забыл? вроде timer0 слишком мал чтобы секунды считать.)
(Добавление)
Alex_och И?
Чем отличается побитовое от логического и почему (раз они не отличаются, попой чую) пишут по разному?
32. Alex_och - 23 Ноября, 2013 - 23:39:06 - перейти к сообщению
cjA пишет:

Alex_och И?
Чем отличается побитовое от логического и почему (раз они не отличаются, попой чую) пишут по разному?


Я своими словами объяснить не могу, т.к. еще в этом не разобрался. Но ответ нашел в википедии:

"Ряд источников по языкам низкого уровня называет побитовые логические операции просто логическими[1][2], но в терминологии программирования на языках высокого уровня в названиях битовых операций присутствуют прилагательные битовый, побитовый (например: «побитовое логическое И», оно же «побитовое умножение»), поразрядный."

"В компьютерных языках используется два основных варианта конъюнкции: логическое "И" и побитовое (поразрядное) "И". Например, в языках C/C++ логическое "И" обозначается символом "&&", а побитовое — символом "&". В терминологии, используемой в C#, операцию "&" принято называть логическим "И", а операцию "&&" - условным "И", поскольку значения операндов являются условиями для продолжения вычисления. В языках Pascal/Delphi оба вида конъюнкции обозначается с использованием ключевого слова "and", а результат действия определяется типом операндов. Если операнды имеют логический тип (например, Boolean) — выполняется логическая операция, если целочисленный (например, Byte) — поразрядная."

Короче, все пока на первый взгляд запутано ))
33. cjA - 24 Ноября, 2013 - 00:11:56 - перейти к сообщению
это значит что если у одного байта четное количество бит , а у другого нечетное, то мы получим ерунду. Это даже не проверка знака. В старом Си %% и && означали короткие процессорные операциии . Также как в старом Ада можно было сказать через атрибут Address где у меня прерывание, но вы почитайте GNAT для авр? Бред бредом, кочан как тыква. GNAT превращен в надстройку над Си, у-у.... нилюблю...
(Добавление)
А вот в АДА есть побитовая дискримнация. Есть голый GNAT for AVR, но может тебя заинтересует? Там есть примеры
34. Predator - 24 Ноября, 2013 - 12:01:45 - перейти к сообщению
на тему побитовых операций и логических:
1) побитовые операции - проводятся с операндами одинаковой длинны*
на выходе: результат той-же длинны. в стиле 0b01010101 & 0b00001111 = 0b00000101
операция проводится попарно с каждым битом.
2) логические операции проводятся с операндами любой длинны, и эти операнды любой длинны "урезаются" до одного бита false или true: если у операнда была хоть одна 1 - то true, если он был=0, то false, а уже с этими false или true проходит операция.

*можно и разной, но результат будет зависеть от компилятора и положения пятен на солнце..
35. Alex_och - 24 Ноября, 2013 - 14:05:10 - перейти к сообщению
Вопросs знатокам))
Это одно и тоже? :
1) if (i==100)
{ if (v==200)
PORTB |=(1<<PORTB0);
}

И

if ((i==100)&&(v==200))
PORTB |=(1<<PORTB0);

2) PORTB |= _BV(PB0);
И
PORTB |=(1<<PORTB0);
36. Alex_och - 24 Ноября, 2013 - 18:37:02 - перейти к сообщению
cjA пишет:
Абсалютно правильно! И именно поэтому таймеры нам не нужны. Пишите свою программу, если в Си то читаете листинг. И считаете сколько у нас набегало за основной цикл. Это RISC процессор, почти все операнды выполняются за тик. Обращение к еепром или АДК- не известно, зависит от напряжения, поэтому им отведены прерывания, которые часто и не нужны.

Все же не пойму как с этим работать.
Листинг это что? (могу ошибаться в терминалогии - даташит на атмегу?)
Вот еще что я смог по этому прочитать: http://www.gaw.ru/html.cgi/txt/d...vr/asm/start.htm но сдвигов ни каких.
На простом примере можите показать?
37. cjA - 29 Ноября, 2013 - 18:41:56 - перейти к сообщению
Ну если ты юзаешь обычный мэйк фал, то его интепретатор выдаст и файл листинга. Он у тебя лежит тамже где и hex, это дезассемблированный код его. Ну вот заодно и узнай чем отличается -О2 и -О0 (оптимальная оптимизация и отключенная оптимизация).

(Для АВР (атмель) нужно отключать оптимизацию, ИМХО)
(Добавление)
(намек- если хочешь не листинг, а дезассемблированный код, который потом можно скомпилировать, то авр студио (жалко ли ей?) тебе его выдаст.)
(Добавление)
Alex_och
2) не пользуюсь этими вычурными сишными кодами, но вроде это одно и тоже
1) а i и v - volatille? Тогда исход непредсказуем. В любом случае интерпритатор Си переведет их в разные коды.
38. Alex_och - 01 Декабря, 2013 - 23:12:55 - перейти к сообщению
Подскажите, как прервать выполняемое условие и начать выполнять другое новое?
Т.к. заметил, что новое не начнется, пока не выполнится выполняемое.
Вот такой пример:

Нажав кратковременно кнопку №1 запустился цикл мигания светодиодом 10 раз.
Но если в этот момент нажать кнопку №2 чтобы запустить др команду или цикл, продолжается выполняться первый цикл мигания до конца.
Как его прервать и запустить условие которое на кнопке №2?
39. Vladimir72 - 02 Декабря, 2013 - 13:46:06 - перейти к сообщению
Alex_och

посмотри видео урок будет полезно http://www.youtube.com/watch?v=N...l-W6&index=3
40. Alex_och - 03 Декабря, 2013 - 13:28:58 - перейти к сообщению
Спасибо. ОЧень доходчивое видео.

Я пока решил вопрос другим методом, может он не совсем правильный, но рабртает.

В первом цикле где выполняется мигание светодиода или возрастание переменной на единицу, прописал опрос кнопки №2 типа: if (кнопка==0) goto start;
А start: написал перед перед опросом кнопки №2 для выполнения другой фенкции и прога прыгает уже на вторую функцию.
41. cjA - 26 Декабря, 2013 - 12:30:19 - перейти к сообщению
я тоже свое мерси за видиво, но где же Вы были четыре года назад?
Раз пошла такая пьянка. Ниды, с расщирением .h А сам код с расширением .m- это я куда залез?