роботы робототехника микроконтроллеры


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

> Описание: помогите, т.к. еще не совсем разобрался с таймерами, прерываниями
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



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


Рядовой


Сообщений всего: 19
Дата рег-ции: Нояб. 2013  



cjA пишет:

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


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

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

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

Короче, все пока на первый взгляд запутано ))
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



это значит что если у одного байта четное количество бит , а у другого нечетное, то мы получим ерунду. Это даже не проверка знака. В старом Си %% и && означали короткие процессорные операциии . Также как в старом Ада можно было сказать через атрибут Address где у меня прерывание, но вы почитайте GNAT для авр? Бред бредом, кочан как тыква. GNAT превращен в надстройку над Си, у-у.... нилюблю...
(Добавление)
А вот в АДА есть побитовая дискримнация. Есть голый GNAT for AVR, но может тебя заинтересует? Там есть примеры
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



на тему побитовых операций и логических:
1) побитовые операции - проводятся с операндами одинаковой длинны*
на выходе: результат той-же длинны. в стиле 0b01010101 & 0b00001111 = 0b00000101
операция проводится попарно с каждым битом.
2) логические операции проводятся с операндами любой длинны, и эти операнды любой длинны "урезаются" до одного бита false или true: если у операнда была хоть одна 1 - то true, если он был=0, то false, а уже с этими false или true проходит операция.

*можно и разной, но результат будет зависеть от компилятора и положения пятен на солнце..
 
 Top
Alex_och Post Id


Рядовой


Сообщений всего: 19
Дата рег-ции: Нояб. 2013  



Вопрос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);
 
 Top
Alex_och Post Id


Рядовой


Сообщений всего: 19
Дата рег-ции: Нояб. 2013  



cjA пишет:
Абсалютно правильно! И именно поэтому таймеры нам не нужны. Пишите свою программу, если в Си то читаете листинг. И считаете сколько у нас набегало за основной цикл. Это RISC процессор, почти все операнды выполняются за тик. Обращение к еепром или АДК- не известно, зависит от напряжения, поэтому им отведены прерывания, которые часто и не нужны.

Все же не пойму как с этим работать.
Листинг это что? (могу ошибаться в терминалогии - даташит на атмегу?)
Вот еще что я смог по этому прочитать: http://www.gaw.ru/html.cgi/txt/d...vr/asm/start.htm но сдвигов ни каких.
На простом примере можите показать?
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Ну если ты юзаешь обычный мэйк фал, то его интепретатор выдаст и файл листинга. Он у тебя лежит тамже где и hex, это дезассемблированный код его. Ну вот заодно и узнай чем отличается -О2 и -О0 (оптимальная оптимизация и отключенная оптимизация).

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


Рядовой


Сообщений всего: 19
Дата рег-ции: Нояб. 2013  



Подскажите, как прервать выполняемое условие и начать выполнять другое новое?
Т.к. заметил, что новое не начнется, пока не выполнится выполняемое.
Вот такой пример:

Нажав кратковременно кнопку №1 запустился цикл мигания светодиодом 10 раз.
Но если в этот момент нажать кнопку №2 чтобы запустить др команду или цикл, продолжается выполняться первый цикл мигания до конца.
Как его прервать и запустить условие которое на кнопке №2?
 
 Top
Vladimir72 Post Id



Великий стратег


Сообщений всего: 193
Дата рег-ции: Май 2012  



Alex_och

посмотри видео урок будет полезно http://www.youtube.com/watch?v=N...l-W6&index=3
 
 Top
Alex_och Post Id


Рядовой


Сообщений всего: 19
Дата рег-ции: Нояб. 2013  



Спасибо. ОЧень доходчивое видео.

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

В первом цикле где выполняется мигание светодиода или возрастание переменной на единицу, прописал опрос кнопки №2 типа: if (кнопка==0) goto start;
А start: написал перед перед опросом кнопки №2 для выполнения другой фенкции и прога прыгает уже на вторую функцию.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



я тоже свое мерси за видиво, но где же Вы были четыре года назад?
Раз пошла такая пьянка. Ниды, с расщирением .h А сам код с расширением .m- это я куда залез?
 
 Top
Страниц (3): « 1 2 [3]
« Алгоритмы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru