Ми
продовжуємо роботу зі світлодіодами,
але кількість світлодіодів збільшимо
до 5, створивши ефект “біжучих вогнів”.
Для керування світлодіодами будемо
використовувати порти Arduino - ми будемо
напряму записувати дані в порти пристрою,
що краще, ніж працювати з конкретними
входами / виходами контролера. Це
дозволить встановити значення для
світлодіодів за допомогою однієї лише
операції.
У Arduino є 3 порти:
B (цифрові входу / виходу з 8 по 13)
C (аналогові входу)
D (цифрові входу / виходу з 0 по 7)
Кожен порт керується 3 регістрами. Регістр DDR визначає чи буде нога (pin) входом або виходом. За допомогою регістра PORT можна встановити pin в стан HIGH або LOW. За допомогою регістра PIN можна прочитати стан виводів Arduino, коли вони працюють як вхід.
Ми будемо використовувати порт B. Спочатку, ми повинні встановити всі ніжки порта B як цифрові виходи. У порта B є тільки 6 ніжок, біти регістра для В-порту DDRB повинні бути встановлені в 1, якщо пін буде використовуватися як вихід (OUTPUT), і в 0, якщо пін буде використовувати як вхід (INPUT). Біти портів нумеруються з 0 по 7, але не завжди містять всі 8 пінів. Приклад:
DDRB = B00111110; / / встановити піни порту В з 1 по 5 як виходи, а 0 як вхід.
Зверніть увагу, що в мікроконтролерах фірми Microchip все навпаки. 0 біт - нога працює як вихід, а 1 - як вхід. У нашому проекті ми будемо використовувати 5 виходів:
DDRB = B00011111; / / встановити ноги порту В з 0 по 4 як виходу
Для запису значень в порт В необхідно використовувати регістр PORTB.
Ввімкнути перший світлодіод можна командою:
PORTB = B00000001;
перший і четвертий:
PORTB = B00001001;
Тепер ми можемо легко вмикати та вимикати світлодіоди, передаючи дані в порт..
У Arduino є 3 порти:
B (цифрові входу / виходу з 8 по 13)
C (аналогові входу)
D (цифрові входу / виходу з 0 по 7)
Кожен порт керується 3 регістрами. Регістр DDR визначає чи буде нога (pin) входом або виходом. За допомогою регістра PORT можна встановити pin в стан HIGH або LOW. За допомогою регістра PIN можна прочитати стан виводів Arduino, коли вони працюють як вхід.
Ми будемо використовувати порт B. Спочатку, ми повинні встановити всі ніжки порта B як цифрові виходи. У порта B є тільки 6 ніжок, біти регістра для В-порту DDRB повинні бути встановлені в 1, якщо пін буде використовуватися як вихід (OUTPUT), і в 0, якщо пін буде використовувати як вхід (INPUT). Біти портів нумеруються з 0 по 7, але не завжди містять всі 8 пінів. Приклад:
DDRB = B00111110; / / встановити піни порту В з 1 по 5 як виходи, а 0 як вхід.
Зверніть увагу, що в мікроконтролерах фірми Microchip все навпаки. 0 біт - нога працює як вихід, а 1 - як вхід. У нашому проекті ми будемо використовувати 5 виходів:
DDRB = B00011111; / / встановити ноги порту В з 0 по 4 як виходу
Для запису значень в порт В необхідно використовувати регістр PORTB.
Ввімкнути перший світлодіод можна командою:
PORTB = B00000001;
перший і четвертий:
PORTB = B00001001;
Тепер ми можемо легко вмикати та вимикати світлодіоди, передаючи дані в порт..
Розглянемо
оператори зсуву. два оператори двійкового
зсуву: оператор зсуву вліво << і
оператор зсуву вправо >>. Оператор
зсуву вліво << змушує всі біти зсуватися
вліво, відповідно оператор зсуву вправо
>> зсуває біти вправо. Приклад:
varA = 1; / / 00000001
varA = 1 << 0; / / 00000001
varA = 1 << 1; / / 00000010
varA = 1 << 2; / / 00000100
varA = 1; / / 00000001
varA = 1 << 0; / / 00000001
varA = 1 << 1; / / 00000010
varA = 1 << 2; / / 00000100
У нашій програмі буде 2 змінні: перша - upDown вказує на напрям засвічування світлодіодів (“вгору” або “вниз”), а друга - cylon вказує які світлодіоди слід вмикати.
Функція setup () визначає які виводи мікроконтролера (порти) будуть працювати як виходи.
У головному циклі програми loop (), світлодіоди по черзі спалахують “вгору” шляхом збільшення значення змінної cylon, а коли доходить до самого верхнього, то змінній upDown присвоюється 0 і світлодіоди спалахують по черзі “вниз”.
/* Біжучі вогні */
unsigned char upDown=1;// розпочинаємо з “руху” догори
unsigned char cylon=0; // визначаємо черговість засвічування світлодіодів
void setup(){
DDRB = B00011111; // налаштовуємо порт B з 0 по 4 як виходи
}
void loop() {
if(upDown==1) { // якщо “йдемо” вгору, то
cylon++;
if(cylon>=4) upDown=0; // якщо досягли найбільшого номера LED, то в наступному циклі “йдемо” вниз
}
else { cylon--; if(cylon==0) upDown=1; // якщо досягли найменшого номера LED, то в наступному циклі йдемо догори
}
PORTB = 1 << cylon; //зсув
delay(200); // пауза 200 мс
}
Джерело: http://www.hobbytronics.co.uk