Чтение порта С микроконтроллера
- Войдите на сайт для отправки комментариев
Сб, 27/04/2019 - 23:20

Порт С имеет 7 ножек, одна из них reset
void setup() {
Serial.begin(19200);
Serial.println("Start");
DDRC = 0b0111111;//A0-A5 INPUT Верно?
void loop() {
}
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() { }Верно ли выражение:
1voidsetup() {2Serial.begin(19200);3Serial.println("Start");4DDRC = 0111111;//A0-A5 OUTPUT!5}67voidloop() {8PORTC = B0111111;//На всех пинах порта С цифровые 19}DDRC и так изначально на вводе. Поэтому у PINC будет реальное состояние. Только это как то совсем не красиво для Ардуино. Фишка ведь в том что бы не зависеть от железа, от этого вашего PORTС, PINC, DDRC. Ага? Ну а если вы шарите больше, тогда и пишите без Ардуины какой то! Иначе всё через жо получается.)
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 ?
Насколько я помню подтягивающий резистор работает независимо от того используется ли пин для ресета или как IO
А вот если пин фьюзед как ресет, то читаться будет всегда 0. Если внешней подтяжки при этом нет, то надо включать внутреннюю иначе будет ресетится от любого чиха. Если есть внешняя подтяжка, то особо не важно, что писать 0 или 1.
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Так? Пины могут быть с разных портов
А если одновременно 2 пина активны то свич не сработает. Если надо отследить отдельно каждую ногу то проще четыре ифа написать.
Сработает, к примеру, 4 и 5 пины, 16 +32 = 48
case 48:Serial.println("3 adres");break;Мой косяк, я ж не сказала что все 16 позиций отслеживаю.
Это я к тому, что придётся все сочетания в case прописывать. Если надо, то надо. Но если ног несколько, дешевле if. A если отслеживать факт изменения шеснадцати ног разных портов, то нормально, только я б не замарачивался на точное соответствие номера ноги и позиции в переменной. Прописал бы от нулевого до 15 бита таблицу соответствия через дефайны. Саse быстрее if работает только если у него есть все последовательно значения без дырок от 0 до n. Если хоть одного значения нет, то компилятор все сase перестроит на if с потерей производительности.
Ну если у вас всего 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.)
Что-то типа XX_PIN тоже внутрях вайринга используется - я давеча заглядывал, удивился.
Всем Спасибо.
А оформление - это пробелы, отступы, выравниевание, переменные прописными, макро заглавными, функции кэмэл и т.д.
Я кавычки после слова поставила, мол "оформить в кавычках". =)