Форум РадиоКот https://radiokot.ru/forum/ |
|
PINx не читает порт на леонардо :( https://radiokot.ru/forum/viewtopic.php?f=57&t=163197 |
Страница 1 из 4 |
Автор: | alex68md [ Ср май 22, 2019 05:39:51 ] |
Заголовок сообщения: | PINx не читает порт на леонардо :( |
Код: #define PIN_LED (1 << PC7) void setup() { DDRF = 0xFF; PORTF = 0; DDRE = 0xFF; PORTE = 0; DDRD = 0xFF; PORTD = 0; DDRC = 0xFF; PORTC = 0; DDRB = 0xFF; PORTB = 0; } 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); } друзья , ктото сталкивался с таким ? как исправить? PORTx прекрасно читает. |
Автор: | ARV [ Ср май 22, 2019 06:17:24 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
У вас же вывод в порт, какое чтение?! |
Автор: | alex68md [ Ср май 22, 2019 08:28:47 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
я читаю PIN порт Е если там высоки то высокий пишу в порт С ели в Е низкий то низкий пишу в порт С если PIN заменить на PORT то работает как я говорю. вроде ошибок нету именно в синтаксисе ?! |
Автор: | GoldenAndy [ Ср май 22, 2019 08:40:56 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
У вас порт Е в режиме вывода - и в него выведен 0. PINE будет отдавать нолик. Выведите в порт Е единички - и PINE будет читать единичку. |
Автор: | alex68md [ Ср май 22, 2019 10:14:12 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Почему ноль? PORTE |= 1<<PE6 И смотрите. Не меня код. Просто меняю PIN на PORT то работает. То есть пишет единицу в port c |
Автор: | BOB51 [ Ср май 22, 2019 11:51:47 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Особенность АВРок - запись единицы в ПИН приводит к инвертированию выходного уровня. "... 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. ..." И то... надо всегда документацию смотреть - до определенного времени у старых МК такой особенности не было. ![]() |
Автор: | ARV [ Ср май 22, 2019 13:08:16 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Ещё раз: в коде написано digitalWrite, где чтение?! Добавлено after 57 seconds: упс... Это ж ардуина... Прошу пардону |
Автор: | BOB51 [ Ср май 22, 2019 13:25:24 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Дык правильно - digitalWrite(pin, value) это ЗАПИСЬ в один из выводов порта. ![]() Правда как оное реализуется "внутрях" - Х/З... ![]() Только вот... Ежли уж следовать адурине... Код: digitalWrite(13, digitalRead(7)); РЕ6=D7 для леонарды как-то так должно бысть... При том, что тот "7" должен быть настроен как ВХОД и принимать внешнее значение. Насчет экскрементов с прямым использованием портов на этапе освоения - там помимо стандартной матчасти вида даташитов еще и нюенсы "софтовых надстроек" могут добавиться. |
Автор: | alex68md [ Ср май 22, 2019 13:48:15 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Особенность АВРок - запись единицы в ПИН приводит к инвертированию выходного уровня. "... ![]() так я же ни где не пишу в PINx ?! я читаю пином Добавлено after 1 minute 17 seconds: Код: 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 |
Автор: | BOB51 [ Ср май 22, 2019 13:50:08 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
А каким образом настроен D7? ![]() |
Автор: | alex68md [ Ср май 22, 2019 14:30:29 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
D7 = PE6 , D13 = PC7 тот который ми выставляем в 1 ? PORTE |= 1<<PE6 настрое как выход DDRE = 0xFF; или я тормажу ? ![]() |
Автор: | BOB51 [ Ср май 22, 2019 14:47:10 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
По канонам адуринки если прием данных pinMode(pin, mode) т.е. если хотим принимать данные (работа на вход) pinMode(7, INPUT_PULLUP) - вход с подтяжкой к 1 или pinMode(7, INPUT) - вход с Z состоянием Если выход pinMode(7, OUTPUT) с последующей установкой значения для вывода digitalWrite(7, HIGH) или LOW помимо прочего в случае, когда статус выходной линии порта управляется программой абсолютно лишена смысла конструкция типа "записать в порт и затем считать данные с вывода для выдачи результата в другой порт" которую просто заменяют на "записать данные в порт n и порт m" возможно и оптимизатор компилятора будет того же мнения. ![]() СИ не ассемблер, где можно любые варианты проводить для исследования терпения МК. ![]() |
Автор: | alex68md [ Ср май 22, 2019 16:42:43 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
для светика нам нужен выход вот все порты и настроены DDRx = 256 далее логика кода кривая/прямая это оставим на совесть кодератора ![]() сам синтаксис верный насколько я могу судить . если нет поправьте. в плане чтения PORT и PIN делают тоже самое. однако PIN вообще не читает я пробовал if (PINE) PORTC |= led13 и это в то время как PORTE имеет единицу т.к. там горит светик. т.е. не может быть PINE нулем но он ноль. if не срабатывал ардуина не любимая здесь чисто для скорости писанины кода. я убирал все встаки ардуины эфект if не срабатывает потому что PINe зараза не читает порт |
Автор: | GoldenAndy [ Ср май 22, 2019 17:08:07 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
DDRx = 255 |
Автор: | dgrett [ Ср май 22, 2019 17:41:58 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
ардуина не любимая здесь чисто для скорости писанины кода. И чё, быстрее?:) |
Автор: | alex68md [ Ср май 22, 2019 18:59:57 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Ну кому как ![]() 255 конечно. Опечатка ведь. Есть идеи почему if PINx не видит единицу? |
Автор: | ARV [ Ср май 22, 2019 19:09:33 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
alex68md писал(а): Есть идеи почему if PINx не видит единицу? а она там есть на самом деле? может, там КЗ на землю или что-то подобное... и что там на этой линии аппаратного висит - может, оно и не дает появиться единичке?
|
Автор: | Dimon456 [ Ср май 22, 2019 19:41:16 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
alex68md писал(а): Есть идеи почему if PINx не видит единицу? Есть идеи.Чему у вас результат равен PINE & 1<<PE6 ? Какие значение может принимать digitalWrite(13, х ) ? |
Автор: | BOB51 [ Ср май 22, 2019 22:59:11 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
Похоже на завуалированный подвох. Ежли б на чистом ассемблере выполнять - это одно, а вот как интерпретирует компилятор ЯВУ тот бред? Читаем вывод настроенный на ВЫХОД, маскируем полученное значение по И с единицей и полученный результат впихериваем в другой порт. При том, что статус ранее выведенных в тот порт, что читаем, данных (предваряющих чтение) нам НЕИЗВЕСТЕН. Как и статус цепочек внешней обвязки. Ежли там "застрял" нуль - то и будет "вечный нуль" в результате. В то ж время используемый для силовых целей вывод (вида светик или мощная нагрузка) может исказить значение логического уровня при "обратном чтении". Да и МК даже для адурины выбран довольно специфичный (в смысле малознакомый в популярных применениях). Потом... if (PINE) истина будет при любом отличном от нуля значении любой из линий порта посему D7 при такой проверке вполне может быть и нулем и единицей - проверка данный вывод по факту не проверяет. ![]() |
Автор: | dgrett [ Чт май 23, 2019 05:41:00 ] |
Заголовок сообщения: | Re: PINx не читает порт на леонардо :( |
А не будет ли так, что вы пишете 1 в Порт и тут же читаете из Пин? Перед чтением попробуйте поставить nop и тогда читайте. |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |