Теория: Битовые операции и управление выводами через регистры.
- Войдите на сайт для отправки комментариев
Пнд, 06/01/2014 - 17:04
Как применяются битовые операции в arduino?
Читал статью "Прямое управления выходами через регистры микроконтроллера Atmega". Там применяются битовые операции. Встречал там и тут примеры разных операций, но не могу найти как сделать "НЕ" для нужных регистров.
Может быть кто-то подскажет, где посмотреть толковую инструкцию на русском языке?
для всей группы нашел: PORTB = ~PORTB;
ищу как сделать для отдельных контактов.
Cyberlib Library
Для 328 http://thechronosproject.com/?ddownload=1579
Там всё это уже есть
http://arduino.cc/en/Reference/BitwiseXorNot
PORTB ^= 1<<PB5;
Пасиба.
Почему-то когда я задаю вопрос на форуме, я сразу же нахожу путь решения. Наверное это связано со свойствами ноосферы.
Я тоже надумал операцию XOR
что-то вроде этого: PORTB = PORTB ^ B00001000;
trembo, благодарю за библиотеку, изучу,
maksim, благодарю за наводку.
Вот мой вариант. Надо добавить в начало скетча или в какой-либо .h-файл, который затем подключать через #include "ports_fast.h"
#define portWrite(set,mask,port) do {\ byte state = port;\ state &= ~mask;\ state |= set;\ port = state;\ } while(0) #define _digitalWriteFast(P, V) \ do {\ if((P) < 8)\ portWrite((V) << (P),_BV(P), PORTD);\ else if((P) < 14)\ portWrite((V) << ((P)-8),_BV((P)-8), PORTB);\ else\ portWrite((V) << ((P)-14),_BV((P)-14), PORTC);\ } while(0) #define portRead(bit,pin,ret) do {\ ret = pin;\ ret >>= bit;\ ret &= 1;\ } while(0) #define _digitalReadFast(P, ret) do {\ if((P) < 8)\ portRead((P), PIND, ret);\ else if((P) < 14)\ portRead((P)-8, PINB, ret);\ else\ portRead((P)-14, PINC, ret);\ } while(0) static inline byte digitalReadFast(byte pin) { byte ret; _digitalReadFast(pin, ret); return ret; } static inline void digitalWriteFast(byte pin, byte value) { _digitalWriteFast(pin, value); }строчки с побитовым сдвигом мне пока не понятны.
Если кто-то наткнется на тему в поисках ответов на подобные вопросы, укажу источники (рус), которыми сам пользуюсь:
http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
http://makesystem.net/?p=896
http://fanatnauki.ru/index.php?option=com_content&view=article&id=49&Ite...
http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_...
http://kolonitsky.org/blog/2011/05/bitmask-into/
Что ж там непонятного? Простая арифметика школьный курс. Следующие записи эквивалентны:
byte a, b;
a = b << 1;
ну не понятно. что за знак "<<" ? Что он делает?
Битовый сдвиг
Как на языке Си записать более элегантно (специфично) аналог такой последовательности команд:
{ uint8_t _tmpReg = DDRB; _tmpReg |= maskSet; _tmpReg &= ~maskClr; DDRB = _tmpReg; }Одной командой нельзя И установить И сбросить биты. Ни в С, ни в Асм. Двумя - пожалуйста.
Спасибо за отклик. Пока занимался другими делами , придумал такое: