Особенность АВРок - запись единицы в ПИН приводит к инвертированию выходного уровня.
"...
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)
это ЗАПИСЬ в один из выводов порта.
Правда как оное реализуется "внутрях" - Х/З...
Только вот...
Ежли уж следовать адурине...
РЕ6=D7 для леонарды
как-то так должно бысть...
При том, что тот "7" должен быть настроен как ВХОД и принимать внешнее значение.
Насчет экскрементов с прямым использованием портов на этапе освоения - там помимо
стандартной матчасти вида даташитов еще и нюенсы "софтовых надстроек" могут добавиться.
Последний раз редактировалось BOB51 Ср май 22, 2019 13:48:51, всего редактировалось 1 раз.
[uquote="BOB51",url="/forum/viewtopic.php?p=3637623#p3637623"]Особенность АВРок - запись единицы в ПИН приводит к инвертированию выходного уровня.
"... [/uquote]
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG = oldSREG;
}
Добавлено after 7 minutes 31 second:
но причем тут что там внутри если проблема в PINx
прочтите комент
digitalWrite(13, PINE & 1<<PE6 ); //issue here. if I change to PORTE it will works
По канонам адуринки
если прием данных
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 зараза не читает порт
alex68md писал(а):Есть идеи почему if PINx не видит единицу?
а она там есть на самом деле? может, там КЗ на землю или что-то подобное... и что там на этой линии аппаратного висит - может, оно и не дает появиться единичке?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Похоже на завуалированный подвох.
Ежли б на чистом ассемблере выполнять - это одно, а вот как интерпретирует компилятор ЯВУ тот бред?
Читаем вывод настроенный на ВЫХОД, маскируем полученное значение по И с единицей и полученный результат впихериваем в другой порт.
При том, что статус ранее выведенных в тот порт, что читаем, данных (предваряющих чтение) нам НЕИЗВЕСТЕН. Как и статус цепочек внешней обвязки.
Ежли там "застрял" нуль - то и будет "вечный нуль" в результате.
В то ж время используемый для силовых целей вывод (вида светик или мощная нагрузка) может исказить значение логического уровня при "обратном чтении".
Да и МК даже для адурины выбран довольно специфичный (в смысле малознакомый в популярных применениях).
Потом...
if (PINE)
истина будет при любом отличном от нуля значении любой из линий порта
посему D7 при такой проверке вполне может быть и нулем и единицей - проверка данный вывод по факту не проверяет.