Чтение порта С микроконтроллера

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Порт С имеет 7 ножек, одна из них reset

void setup() {
Serial.begin(19200);
Serial.println("Start");  
DDRC = 0b0111111;//A0-A5 INPUT Верно?
void loop() {

}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

void setup() {
Serial.begin(19200);
Serial.println("Start");  
DDRC = 0b0000000;//A0-A5 INPUT

Serial.println(PINC,BIN); 

//if (PINC==B111110){
//Serial.println("A0-Off");
//}
}

void loop() {


}

 

Верно ли выражение:

DDRC = 0b0000000;//A0-A5 INPUT
Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
1 void setup() {
2 Serial.begin(19200);
3 Serial.println("Start"); 
4 DDRC = 0111111;//A0-A5 OUTPUT!
5 }
6  
7 void loop() {
8  

       PORTC = B0111111;//На всех пинах порта  С цифровые 1

9 }

 

Green
Offline
Зарегистрирован: 01.10.2015

DDRC и так изначально на вводе. Поэтому у PINC будет реальное состояние. Только это как то совсем не красиво для Ардуино. Фишка ведь в том что бы не зависеть от железа, от этого вашего PORTС, PINC, DDRC. Ага? Ну а если вы шарите больше, тогда и пишите без Ардуины какой то! Иначе всё через жо получается.)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Green пишет:

DDRC и так изначально на вводе. Поэтому у PINC будет реальное состояние. Только это как то совсем не красиво для Ардуино. Фишка ведь в том что бы не зависеть от железа, от этого вашего PORTС, PINC, DDRC. Ага? Ну а если вы шарите больше, тогда и пишите без Ардуины какой то! Иначе всё через жо получается.)

А если мне нужно будет подключить подтягивающий резистор:

PORTC = B0111111;

PC6-PC5-PC4-PC3-PC2-PC1-PC0

RES-A5-A4-A3-A2-A1-A0

0-1-1-1-1-1-1

Первый пин Reset писать 0 ?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Насколько я помню подтягивающий резистор работает независимо от того используется ли пин для ресета или как IO 

А вот если пин фьюзед как ресет, то читаться будет всегда 0. Если внешней подтяжки при этом нет,  то надо включать внутреннюю иначе будет ресетится от любого чиха. Если есть внешняя подтяжка, то особо не важно, что писать 0 или 1. 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
uint8_t A,B,C,D;

A = PIND&1<<4;
B = PIND&1<<5;
C = PIND&1<<6;
D = PIND&1<<7;

switch (A+B+C+D) {
case 16:Serial.println("1 adres");break;
case 32:Serial.println("2 adres");break;
case 64:Serial.println("3 adres");break;
}//switch

Как грамотнее оформить" данный код?

 

#define Adres (PIND&1<<4)+(PIND&1<<5)+(PIND&1<<6)+(PIND&1<<7)

void setup() {
Serial.begin(9600);
}

void loop() {

switch (Adres) {
case 16:Serial.println("1 adres");break;
case 32:Serial.println("2 adres");break;
case 64:Serial.println("3 adres");break;
}//switch (Adres)
delay(1000);

}//loop

 Так? Пины могут быть с разных портов

nik182
Offline
Зарегистрирован: 04.05.2015

А если одновременно 2 пина активны то свич не сработает. Если надо отследить отдельно каждую ногу то проще четыре ифа написать.

if (PIND&(1<<4)) Serial.print();

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Сработает, к примеру, 4 и 5 пины, 16 +32 = 48

case 48:Serial.println("3 adres");break;

Мой косяк, я ж не сказала что все 16 позиций отслеживаю.

nik182
Offline
Зарегистрирован: 04.05.2015

Это я к тому, что придётся все сочетания в case прописывать. Если надо, то надо. Но если ног несколько, дешевле if. A если отслеживать факт изменения шеснадцати ног разных портов, то нормально, только я б не замарачивался на точное соответствие номера ноги и позиции в переменной. Прописал бы от нулевого до 15 бита таблицу соответствия через дефайны. Саse быстрее if работает только если у него есть все последовательно значения без дырок от 0 до n. Если хоть одного значения нет, то компилятор все сase перестроит на if с потерей производительности. 

Green
Offline
Зарегистрирован: 01.10.2015

Ну если у вас всего 16 позиций, то и делайте их от 0 до 15. Для наглядности заведите отдельную переменную и ветвитесь по ней.
 

#define A3 7  //определите пины
#define A2 6
#define A1 5
#define A0 4

​uint8_t address = digitalRead(A3)<<3 | digitalRead(A2)<<2 | digitalRead(A1)<<1 | digitalRead(A0)<<0;
switch (address) {
  case 1:

А оформление - это пробелы, отступы, выравниевание, переменные прописными, макро заглавными, функции кэмэл и т.д.

А0..А3 уже определены в Ардуино. Нужно типа A0_PIN.)

sadman41
Offline
Зарегистрирован: 19.10.2016

Что-то типа XX_PIN тоже внутрях вайринга используется - я давеча заглядывал, удивился.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Всем Спасибо.

Green пишет:

А оформление - это пробелы, отступы, выравниевание, переменные прописными, макро заглавными, функции кэмэл и т.д.

 

Irinka пишет:

Как грамотнее оформить" данный код?

Я кавычки после слова поставила, мол "оформить в кавычках". =)