void loop() { PORTE |= 1<<PE6; digitalWrite(13, PINE & 1<<PE6 ); //issue here. if I change to PORTE will work delay(3000); PORTC &= ~PIN_LED; PORTE &= ~(1<<PE6); }
друзья , ктото сталкивался с таким ? как исправить?
Особенность АВРок - запись единицы в ПИН приводит к инвертированию выходного уровня. "... Toggling the Pin Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port. ..." И то... надо всегда документацию смотреть - до определенного времени у старых МК такой особенности не было.
Дык правильно - digitalWrite(pin, value) это ЗАПИСЬ в один из выводов порта. Правда как оное реализуется "внутрях" - Х/З... Только вот... Ежли уж следовать адурине...
Код:
digitalWrite(13, digitalRead(7));
РЕ6=D7 для леонарды как-то так должно бысть... При том, что тот "7" должен быть настроен как ВХОД и принимать внешнее значение. Насчет экскрементов с прямым использованием портов на этапе освоения - там помимо стандартной матчасти вида даташитов еще и нюенсы "софтовых надстроек" могут добавиться.
Последний раз редактировалось BOB51 Ср май 22, 2019 13:48:51, всего редактировалось 1 раз.
По канонам адуринки если прием данных pinMode(pin, mode) т.е. если хотим принимать данные (работа на вход) pinMode(7, INPUT_PULLUP) - вход с подтяжкой к 1 или pinMode(7, INPUT) - вход с Z состоянием Если выход pinMode(7, OUTPUT) с последующей установкой значения для вывода digitalWrite(7, HIGH) или LOW помимо прочего в случае, когда статус выходной линии порта управляется программой абсолютно лишена смысла конструкция типа "записать в порт и затем считать данные с вывода для выдачи результата в другой порт" которую просто заменяют на "записать данные в порт n и порт m" возможно и оптимизатор компилятора будет того же мнения. СИ не ассемблер, где можно любые варианты проводить для исследования терпения МК.
для светика нам нужен выход вот все порты и настроены DDRx = 256 далее логика кода кривая/прямая это оставим на совесть кодератора сам синтаксис верный насколько я могу судить . если нет поправьте.
в плане чтения PORT и PIN делают тоже самое. однако PIN вообще не читает я пробовал if (PINE) PORTC |= led13 и это в то время как PORTE имеет единицу т.к. там горит светик. т.е. не может быть PINE нулем но он ноль. if не срабатывал ардуина не любимая здесь чисто для скорости писанины кода. я убирал все встаки ардуины эфект if не срабатывает потому что PINe зараза не читает порт
а она там есть на самом деле? может, там КЗ на землю или что-то подобное... и что там на этой линии аппаратного висит - может, оно и не дает появиться единичке?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Похоже на завуалированный подвох. Ежли б на чистом ассемблере выполнять - это одно, а вот как интерпретирует компилятор ЯВУ тот бред?
Читаем вывод настроенный на ВЫХОД, маскируем полученное значение по И с единицей и полученный результат впихериваем в другой порт.
При том, что статус ранее выведенных в тот порт, что читаем, данных (предваряющих чтение) нам НЕИЗВЕСТЕН. Как и статус цепочек внешней обвязки. Ежли там "застрял" нуль - то и будет "вечный нуль" в результате. В то ж время используемый для силовых целей вывод (вида светик или мощная нагрузка) может исказить значение логического уровня при "обратном чтении". Да и МК даже для адурины выбран довольно специфичный (в смысле малознакомый в популярных применениях). Потом... if (PINE) истина будет при любом отличном от нуля значении любой из линий порта посему D7 при такой проверке вполне может быть и нулем и единицей - проверка данный вывод по факту не проверяет.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения