PORTC
Пока АЦП не работает, доступны другие функции ног процессора, занятых под преобразование.
Смотрим на картинку и видим, что аналоговые входы 0...5 находятся на ногах 23...28. Однако основная функция этих ног - PC0...5.
PC означает PORTC, или по-русски "Порт Цэ". Порт - это устройство ввода-вывода, где каждый бит может вводиться или выводиться отдельно, а может и в составе байта. У процессора ATmega328 три семибитных порта: B, C и D. Каждый пин порта управляется тремя битами в трех регистрах: DDxn, PORTxn, PINxn. Нам сейчас не интересны порты B и D, поэтому поглядим на регистры порта C.
DDRC - регистр направления данных порта C
Каждый бит в этом регистре отвечает за направление данных на соответствующем пине:
7 bit | 6 bit | 5 bit | 4 bit | 3 bit | 2 bit | 1 bit | 0 bit | |
DDRC | - | DDC6 | DDC5 | DDC4 | DDC3 | DDC2 | DDC1 | DDC0 |
0 - вход,
1 - выход.
Значение по умолчанию - 0.
PORTC - регистр данных порта C
Если пин сконфигурирован как вход, то при записи 1 в соответствующий бит этого регистра активируется подтягивающий резистор. При записи 0 подтягивающий резистор отключается.
7 bit | 6 bit | 5 bit | 4 bit | 3 bit | 2 bit | 1 bit | 0 bit | |
PORTC | - | PORTC6 | PORTC5 | PORTC4 | PORTC3 | PORTC2 | PORTC1 | PORTC0 |
Если пин сконфигурирован как выход, то при записи 1 в соответствующий бит этого регистра пин подтягивается к питанию. При записи 0 пин притягивается к земле.
Значение по умолчанию - 0.
PINC - Адреса входов порта C
7 bit | 6 bit | 5 bit | 4 bit | 3 bit | 2 bit | 1 bit | 0 bit | |
PINC | - | PINC6 | PINC5 | PINC4 | PINC3 | PINC2 | PINC1 | PINC0 |
Значение по умолчанию - не определено.
Blink, 1 способ
Напишем всем известную программу Blink для аналогового входа (гы-гы). Подключим светодиодик к аналоговому входу 0:
Для начала назначим бывший аналоговый вход A0 как цифровой выход. Для этого запишем единицу в бит DDC0 регистра DDRC:
void setup(){
DDRC = (1 << DDC0);
}
DDRC = (1 << DDC0);
}
void loop(){
PORTC = PORTC | (1 << PORTC0);
delay(1000);
PORTC = PORTC ^ (1 << PORTC0);
delay(1000);
}
Blink, способ 2
Есть более читерский способ, который сокращает программу еще на 2 строчки. В гайде ATmega328 пишут, что запись единицы в PINxn переключает значение PORTxn, независимо от значения DDRxn. Ну то есть если там был 0, то становится 1, а если был 1, то становится 0. За сим накалякаем следующий код:
void setup(){
DDRC = (1 << DDC0);
}
void loop(){
PINC = PINC | (1 << PINC0);
delay(1000);
}
Более продвинутая установка
Чтобы было весело, займем все 6 аналоговых входов. На 0-4 повесим светодиоды, а на 5 - кнопку:
Теперь назначим пины PC0...4 как выходы, а PC5 как вход. Помня, что выход - это 1 в DDCn, а вход - это 0, можно написать строчку, которая все сделает, так:
DDRC = B00011111;
void setup(){
DDRC = B00011111;
}
void loop(){
if (PINC & (1 << PINC5)){
for (int i=0;i<5;i++){
PORTC = PORTC | (1 << i);
delay(100);
}
for (int i=0;i<5;i++){
PORTC = PORTC ^ (1 << i);
delay(100);
}
}
}
}
void loop(){
if (PINC & (1 << PINC5)){
for (int i=0;i<5;i++){
PORTC = PORTC | (1 << i);
delay(100);
}
for (int i=0;i<5;i++){
PORTC = PORTC ^ (1 << i);
delay(100);
}
}
}
Спасибо за интересную статью!
ОтветитьУдалитьСкажите, я вот всегда писал pinMode(A0, OUTPUT), неужели у Вас так не заработало?
тебе легче написать для каждого пина pinmode тойсть получается 6 штук или разом настроить порт DDRC?
Удалить2
Удалитьну да. Проще для каждого пина прописать
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалить
ОтветитьУдалитьсемена адениума и плюмерии
2
А можно ли аналоговые входы использовать как аналоговые выходы?
ОтветитьУдалитьАналоговых выходов в Ардуино нет - есть цифровые с аппаратным ШИМ и просто цифровые выходы, где широтно-импульсная модуляция может быть организована программно. Как с тех, так и с тех после подключения к ним RC-фильтра Г-образного типа (10 кОм/1мкф)возможно снять аналоговый сигнал.
ОтветитьУдалитьМне принесли плату Ардуино уно, у которой неисправен только один цифровой вход-выход, который на плате соединён с пин7.
ОтветитьУдалитьЕсли предполагается использование платы на маленьком фрезере с прошивкой grblUpload, без концевых выключателей и программной регулировки скорости шпинделя, можно ли для управления мотором оси Z
назначить один из пинов, незадействованных мной. А именно пиы 9, 10, 11, 12, или 13. Как изменить cpu_map_h?
А может быть можно аналоговые пины задействовать, кажется они тоже могут в цифровом режиме работать? Можете помочь?